Merge pull request #121 from jedie/dev2

NEW: List all related objects on `item` change page with edit links.
pull/122/head
Jens Diemer 2022-09-30 20:33:37 +02:00 zatwierdzone przez GitHub
commit b0c6acc02a
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
15 zmienionych plików z 294 dodań i 153 usunięć

Wyświetl plik

@ -155,6 +155,7 @@ Files are separated into: "/src/" and "/development/"
* [**dev**](https://github.com/jedie/PyInventory/compare/0.16.0...main) * [**dev**](https://github.com/jedie/PyInventory/compare/0.16.0...main)
* NEW: List all related objects on `item` change page with edit links.
* Change `parent` and `location` fields on `item` change page to a autocompele field. * Change `parent` and `location` fields on `item` change page to a autocompele field.
* Add search to `location` * Add search to `location`
* tbc * tbc

Wyświetl plik

@ -4,6 +4,7 @@ import tagulous
from adminsortable2.admin import SortableInlineAdminMixin from adminsortable2.admin import SortableInlineAdminMixin
from django.conf import settings from django.conf import settings
from django.contrib import admin from django.contrib import admin
from django.template.loader import render_to_string
from django.urls import reverse from django.urls import reverse
from django.utils.html import format_html from django.utils.html import format_html
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
@ -45,6 +46,19 @@ class ItemModelResource(ModelResource):
@admin.register(ItemModel) @admin.register(ItemModel)
class ItemModelAdmin(ImportExportMixin, BaseUserAdmin): class ItemModelAdmin(ImportExportMixin, BaseUserAdmin):
@admin.display(description=_('Related items'))
def related_items(self, obj):
if obj.pk is None:
# Add a new item -> there are no related items ;)
return '-'
related_qs = ItemModel.tree_objects.related_objects(instance=obj)
context = {
'items': related_qs,
'opts': self.opts,
}
return render_to_string('admin/item/related_items.html', context)
@admin.display(ordering='path_str', description=_('ItemModel.verbose_name')) @admin.display(ordering='path_str', description=_('ItemModel.verbose_name'))
def item(self, obj): def item(self, obj):
path = obj.path path = obj.path
@ -78,20 +92,21 @@ class ItemModelAdmin(ImportExportMixin, BaseUserAdmin):
list_filter = (LimitTreeDepthListFilter, 'kind', 'location', 'producer', 'tags') list_filter = (LimitTreeDepthListFilter, 'kind', 'location', 'producer', 'tags')
search_fields = ('name', 'description', 'kind__name', 'tags__name') search_fields = ('name', 'description', 'kind__name', 'tags__name')
fieldsets = ( fieldsets = (
(_('Internals'), { (
_('Internals'),
{
'classes': ('collapse',), 'classes': ('collapse',),
'fields': ( 'fields': (
('id', 'version'), ('id', 'version'),
'user', 'user',
) ),
}), },
(_('Meta'), { ),
'classes': ('collapse',), (_('Meta'), {'classes': ('collapse',), 'fields': ('create_dt', 'update_dt')}),
(
_('Basic'),
{
'fields': ( 'fields': (
'create_dt', 'update_dt'
)
}),
(_('Basic'), {'fields': (
'kind', 'kind',
('producer', 'name'), ('producer', 'name'),
'description', 'description',
@ -99,26 +114,40 @@ class ItemModelAdmin(ImportExportMixin, BaseUserAdmin):
'fcc_id', 'fcc_id',
'parent', 'parent',
'location', 'location',
)}), )
(_('Lent'), { },
),
(_('Related items'), {'classes': ('collapse',), 'fields': ('related_items',)}),
(
_('Lent'),
{
'classes': ('collapse',), 'classes': ('collapse',),
'fields': ( 'fields': (
'lent_to', 'lent_to',
('lent_from_date', 'lent_until_date',) (
)}), 'lent_from_date',
(_('Received'), { 'lent_until_date',
),
),
},
),
(
_('Received'),
{
'classes': ('collapse',), 'classes': ('collapse',),
'fields': ( 'fields': (('received_from', 'received_date', 'received_price'),),
('received_from', 'received_date', 'received_price'), },
)}), ),
(_('Handed over'), { (
_('Handed over'),
{
'classes': ('collapse',), 'classes': ('collapse',),
'fields': ( 'fields': (('handed_over_to', 'handed_over_date', 'handed_over_price'),),
('handed_over_to', 'handed_over_date', 'handed_over_price'), },
)}), ),
) )
autocomplete_fields = ('parent', 'location') autocomplete_fields = ('parent', 'location')
readonly_fields = ('id', 'create_dt', 'update_dt', 'user') readonly_fields = ('id', 'create_dt', 'update_dt', 'user', 'related_items')
inlines = (ItemImageModelInline, ItemFileModelInline, ItemLinkModelInline) inlines = (ItemImageModelInline, ItemFileModelInline, ItemLinkModelInline)

Plik binarny nie jest wyświetlany.

Wyświetl plik

@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-10-09 19:36+0200\n" "POT-Creation-Date: 2022-09-30 20:11+0200\n"
"PO-Revision-Date: 2021-10-09 19:36+0200\n" "PO-Revision-Date: 2022-09-30 20:07+0200\n"
"Last-Translator: Jaume López\n" "Last-Translator: Jaume López\n"
"Language-Team: \n" "Language-Team: \n"
"Language: ca\n" "Language: ca\n"
@ -18,17 +18,23 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.3\n" "X-Generator: Poedit 2.3\n"
msgid "Group Items" msgid "Limit tree depth"
msgstr "Agrupa" msgstr ""
msgid "Automatic" msgid "Only root"
msgstr "Automàtic" msgstr ""
msgid "No" msgid "Root + first sub"
msgstr "No" msgstr ""
msgid "ItemModel.verbose_name_plural" msgid "Root + first + second sub"
msgstr "Elements" msgstr ""
msgid "Related items"
msgstr ""
msgid "ItemModel.verbose_name"
msgstr "Element"
msgid "Internals" msgid "Internals"
msgstr "Interns" msgstr "Interns"
@ -48,6 +54,9 @@ msgstr "Rebuts"
msgid "Handed over" msgid "Handed over"
msgstr "Donats" msgstr "Donats"
msgid "LocationModel.verbose_name"
msgstr "Localització"
msgid "BaseModel.id.verbose_name" msgid "BaseModel.id.verbose_name"
msgstr "ID" msgstr "ID"
@ -59,8 +68,8 @@ msgstr "Usuari"
msgid "BaseModel.user.help_text" msgid "BaseModel.user.help_text"
msgstr "" msgstr ""
"L'usuari propietari d'aquesta entrada i pugui gestionar-la" "L'usuari propietari d'aquesta entrada i pugui gestionar-la(s'assignarà "
"(s'assignarà automàticament)" "automàticament)"
msgid "BaseModel.name.verbose_name" msgid "BaseModel.name.verbose_name"
msgstr "Nom" msgstr "Nom"
@ -74,6 +83,13 @@ msgstr "Etiquetes"
msgid "BaseModel.tags.help_text" msgid "BaseModel.tags.help_text"
msgstr " " msgstr " "
msgid "LocationModel.parent.verbose_name"
msgstr "Parent"
msgid "LocationModel.parent.help_text"
msgstr ""
"Las ubicaciones pueden estar anidadas. Ejemplo: La caja 12 en el armario 3"
msgid "BaseItemAttachmentModel.name.verbose_name" msgid "BaseItemAttachmentModel.name.verbose_name"
msgstr "Nom" msgstr "Nom"
@ -110,12 +126,6 @@ msgstr "Localització"
msgid "ItemModel.location.help_text" msgid "ItemModel.location.help_text"
msgstr " " msgstr " "
msgid "ItemModel.parent.verbose_name"
msgstr "parent"
msgid "ItemModel.parent.help_text"
msgstr " "
msgid "ItemModel.lent_to.verbose_name" msgid "ItemModel.lent_to.verbose_name"
msgstr "Deixat" msgstr "Deixat"
@ -170,8 +180,8 @@ msgstr "Preu de cessió"
msgid "ItemModel.handed_over_price.help_text" msgid "ItemModel.handed_over_price.help_text"
msgstr " " msgstr " "
msgid "ItemModel.verbose_name" msgid "ItemModel.verbose_name_plural"
msgstr "Element" msgstr "Elements"
msgid "ItemLinkModel.verbose_name" msgid "ItemLinkModel.verbose_name"
msgstr "Vincle" msgstr "Vincle"
@ -233,17 +243,6 @@ msgstr "Descripció"
msgid "LocationModel.description.help_text" msgid "LocationModel.description.help_text"
msgstr " " msgstr " "
msgid "LocationModel.parent.verbose_name"
msgstr "Parent"
msgid "LocationModel.parent.help_text"
msgstr "Locations can be nested. Example: The box 12 in cupboard 3"
msgstr "Les localitzacions poden ser sumades."
"Exemple: La caixa 12 a l'estant 3"
msgid "LocationModel.verbose_name"
msgstr "Localització"
msgid "LocationModel.verbose_name_plural" msgid "LocationModel.verbose_name_plural"
msgstr "Localitzacions" msgstr "Localitzacions"
@ -288,3 +287,8 @@ msgstr "Arxiu"
msgid "MemoFileModel.verbose_name_plural" msgid "MemoFileModel.verbose_name_plural"
msgstr "Arxius" msgstr "Arxius"
#, fuzzy
#| msgid "No"
msgid "No."
msgstr "No"

Plik binarny nie jest wyświetlany.

Wyświetl plik

@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-10-09 19:36+0200\n" "POT-Creation-Date: 2022-09-30 20:11+0200\n"
"PO-Revision-Date: 2021-10-09 19:35+0200\n" "PO-Revision-Date: 2022-09-30 20:10+0200\n"
"Last-Translator: Jens Diemer\n" "Last-Translator: Jens Diemer\n"
"Language-Team: \n" "Language-Team: \n"
"Language: de\n" "Language: de\n"
@ -18,17 +18,23 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.3\n" "X-Generator: Poedit 2.3\n"
msgid "Group Items" msgid "Limit tree depth"
msgstr "Gegenstände Gruppieren" msgstr "Tiefe des Baumes"
msgid "Automatic" msgid "Only root"
msgstr "Automatisch" msgstr "Nur Stamm"
msgid "No" msgid "Root + first sub"
msgstr "" msgstr "Stamm + erste Untergruppe"
msgid "ItemModel.verbose_name_plural" msgid "Root + first + second sub"
msgstr "Gegenstände" msgstr "Stamm + erste + zweite Untergruppe"
msgid "Related items"
msgstr "Zugehörige Gegenstände"
msgid "ItemModel.verbose_name"
msgstr "Gegenstand"
msgid "Internals" msgid "Internals"
msgstr "Intern" msgstr "Intern"
@ -37,7 +43,7 @@ msgid "Meta"
msgstr "" msgstr ""
msgid "Basic" msgid "Basic"
msgstr "" msgstr "Basis"
msgid "Lent" msgid "Lent"
msgstr "Verleih" msgstr "Verleih"
@ -48,6 +54,9 @@ msgstr "Erhalt"
msgid "Handed over" msgid "Handed over"
msgstr "Abgabe" msgstr "Abgabe"
msgid "LocationModel.verbose_name"
msgstr "Standort"
msgid "BaseModel.id.verbose_name" msgid "BaseModel.id.verbose_name"
msgstr "ID" msgstr "ID"
@ -74,6 +83,12 @@ msgstr "Tags"
msgid "BaseModel.tags.help_text" msgid "BaseModel.tags.help_text"
msgstr " " msgstr " "
msgid "LocationModel.parent.verbose_name"
msgstr "Übergeordneter Standort"
msgid "LocationModel.parent.help_text"
msgstr "Standorte können verschachtelt werden. Bsp: Der Karton 12 in Schrank 3"
msgid "BaseItemAttachmentModel.name.verbose_name" msgid "BaseItemAttachmentModel.name.verbose_name"
msgstr "Name" msgstr "Name"
@ -110,14 +125,6 @@ msgstr "Standort"
msgid "ItemModel.location.help_text" msgid "ItemModel.location.help_text"
msgstr "Wo ist dieser Gegenstand eingelagert?" msgstr "Wo ist dieser Gegenstand eingelagert?"
msgid "ItemModel.parent.verbose_name"
msgstr "Übergeordnet"
msgid "ItemModel.parent.help_text"
msgstr ""
"Eingebaut in einem anderen Gegenstand? (e.g.: Grafikkarte eingebaut in "
"Rechner)"
msgid "ItemModel.lent_to.verbose_name" msgid "ItemModel.lent_to.verbose_name"
msgstr "Verliehen an" msgstr "Verliehen an"
@ -172,8 +179,8 @@ msgstr "Abgabepreis"
msgid "ItemModel.handed_over_price.help_text" msgid "ItemModel.handed_over_price.help_text"
msgstr "Wurde bei der Abgabe Geld eingenommen?" msgstr "Wurde bei der Abgabe Geld eingenommen?"
msgid "ItemModel.verbose_name" msgid "ItemModel.verbose_name_plural"
msgstr "Gegenstand" msgstr "Gegenstände"
msgid "ItemLinkModel.verbose_name" msgid "ItemLinkModel.verbose_name"
msgstr "Link" msgstr "Link"
@ -235,15 +242,6 @@ msgstr "Beschreibung"
msgid "LocationModel.description.help_text" msgid "LocationModel.description.help_text"
msgstr " " msgstr " "
msgid "LocationModel.parent.verbose_name"
msgstr "Übergeordneter Standort"
msgid "LocationModel.parent.help_text"
msgstr "Standorte können verschachtelt werden. Bsp: Der Karton 12 in Schrank 3"
msgid "LocationModel.verbose_name"
msgstr "Standort"
msgid "LocationModel.verbose_name_plural" msgid "LocationModel.verbose_name_plural"
msgstr "Standorte" msgstr "Standorte"
@ -288,3 +286,6 @@ msgstr "Datei"
msgid "MemoFileModel.verbose_name_plural" msgid "MemoFileModel.verbose_name_plural"
msgstr "Dateien" msgstr "Dateien"
msgid "No."
msgstr "Nr."

Plik binarny nie jest wyświetlany.

Wyświetl plik

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-10-09 19:36+0200\n" "POT-Creation-Date: 2022-09-30 20:11+0200\n"
"PO-Revision-Date: 2021-10-09 19:36+0200\n" "PO-Revision-Date: 2021-10-09 19:36+0200\n"
"Last-Translator: Jens Diemer\n" "Last-Translator: Jens Diemer\n"
"Language-Team: \n" "Language-Team: \n"
@ -18,17 +18,23 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.3\n" "X-Generator: Poedit 2.3\n"
msgid "Group Items" msgid "Limit tree depth"
msgstr "" msgstr ""
msgid "Automatic" msgid "Only root"
msgstr "" msgstr ""
msgid "No" msgid "Root + first sub"
msgstr "" msgstr ""
msgid "ItemModel.verbose_name_plural" msgid "Root + first + second sub"
msgstr "Items" msgstr ""
msgid "Related items"
msgstr ""
msgid "ItemModel.verbose_name"
msgstr "Item"
msgid "Internals" msgid "Internals"
msgstr "" msgstr ""
@ -48,6 +54,9 @@ msgstr ""
msgid "Handed over" msgid "Handed over"
msgstr "" msgstr ""
msgid "LocationModel.verbose_name"
msgstr "Location"
msgid "BaseModel.id.verbose_name" msgid "BaseModel.id.verbose_name"
msgstr "ID" msgstr "ID"
@ -74,6 +83,12 @@ msgstr "Tags"
msgid "BaseModel.tags.help_text" msgid "BaseModel.tags.help_text"
msgstr " " msgstr " "
msgid "LocationModel.parent.verbose_name"
msgstr "Parent"
msgid "LocationModel.parent.help_text"
msgstr "Locations can be nested. Example: The box 12 in cupboard 3"
msgid "BaseItemAttachmentModel.name.verbose_name" msgid "BaseItemAttachmentModel.name.verbose_name"
msgstr "Name" msgstr "Name"
@ -110,12 +125,6 @@ msgstr "Location"
msgid "ItemModel.location.help_text" msgid "ItemModel.location.help_text"
msgstr " " msgstr " "
msgid "ItemModel.parent.verbose_name"
msgstr "parent"
msgid "ItemModel.parent.help_text"
msgstr " "
msgid "ItemModel.lent_to.verbose_name" msgid "ItemModel.lent_to.verbose_name"
msgstr "Lent to" msgstr "Lent to"
@ -170,8 +179,8 @@ msgstr "Handed over price"
msgid "ItemModel.handed_over_price.help_text" msgid "ItemModel.handed_over_price.help_text"
msgstr " " msgstr " "
msgid "ItemModel.verbose_name" msgid "ItemModel.verbose_name_plural"
msgstr "Item" msgstr "Items"
msgid "ItemLinkModel.verbose_name" msgid "ItemLinkModel.verbose_name"
msgstr "Link" msgstr "Link"
@ -233,15 +242,6 @@ msgstr "Description"
msgid "LocationModel.description.help_text" msgid "LocationModel.description.help_text"
msgstr " " msgstr " "
msgid "LocationModel.parent.verbose_name"
msgstr "Parent"
msgid "LocationModel.parent.help_text"
msgstr "Locations can be nested. Example: The box 12 in cupboard 3"
msgid "LocationModel.verbose_name"
msgstr "Location"
msgid "LocationModel.verbose_name_plural" msgid "LocationModel.verbose_name_plural"
msgstr "Locations" msgstr "Locations"
@ -286,3 +286,6 @@ msgstr "File"
msgid "MemoFileModel.verbose_name_plural" msgid "MemoFileModel.verbose_name_plural"
msgstr "Files" msgstr "Files"
msgid "No."
msgstr ""

Plik binarny nie jest wyświetlany.

Wyświetl plik

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-10-09 19:36+0200\n" "POT-Creation-Date: 2022-09-30 20:11+0200\n"
"PO-Revision-Date: 2021-10-09 19:36+0200\n" "PO-Revision-Date: 2021-10-09 19:36+0200\n"
"Last-Translator: Jaume López\n" "Last-Translator: Jaume López\n"
"Language-Team: \n" "Language-Team: \n"
@ -18,17 +18,23 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.3\n" "X-Generator: Poedit 2.3\n"
msgid "Group Items" msgid "Limit tree depth"
msgstr "Agrupa" msgstr ""
msgid "Automatic" msgid "Only root"
msgstr "Automático" msgstr ""
msgid "No" msgid "Root + first sub"
msgstr "No" msgstr ""
msgid "ItemModel.verbose_name_plural" msgid "Root + first + second sub"
msgstr "Elementos" msgstr ""
msgid "Related items"
msgstr ""
msgid "ItemModel.verbose_name"
msgstr "Elemento"
msgid "Internals" msgid "Internals"
msgstr "Internos" msgstr "Internos"
@ -48,6 +54,9 @@ msgstr "Recibidos"
msgid "Handed over" msgid "Handed over"
msgstr "Cedidos" msgstr "Cedidos"
msgid "LocationModel.verbose_name"
msgstr "Localización"
msgid "BaseModel.id.verbose_name" msgid "BaseModel.id.verbose_name"
msgstr "ID" msgstr "ID"
@ -59,8 +68,8 @@ msgstr "Usuario"
msgid "BaseModel.user.help_text" msgid "BaseModel.user.help_text"
msgstr "" msgstr ""
"El usuario propietario de esta entrada y pueda gestionarla" "El usuario propietario de esta entrada y pueda gestionarla(se asignará "
"(se asignará automáticamente)" "automáticamente)"
msgid "BaseModel.name.verbose_name" msgid "BaseModel.name.verbose_name"
msgstr "Nombre" msgstr "Nombre"
@ -74,6 +83,13 @@ msgstr "Etiquetas"
msgid "BaseModel.tags.help_text" msgid "BaseModel.tags.help_text"
msgstr " " msgstr " "
msgid "LocationModel.parent.verbose_name"
msgstr "Pariente"
msgid "LocationModel.parent.help_text"
msgstr ""
"Las localizaciones pueden ser sumadas.Exemple: La caja 12 del estante 3"
msgid "BaseItemAttachmentModel.name.verbose_name" msgid "BaseItemAttachmentModel.name.verbose_name"
msgstr "Nombre" msgstr "Nombre"
@ -110,12 +126,6 @@ msgstr "Localización"
msgid "ItemModel.location.help_text" msgid "ItemModel.location.help_text"
msgstr " " msgstr " "
msgid "ItemModel.parent.verbose_name"
msgstr "pariente"
msgid "ItemModel.parent.help_text"
msgstr " "
msgid "ItemModel.lent_to.verbose_name" msgid "ItemModel.lent_to.verbose_name"
msgstr "Dejado" msgstr "Dejado"
@ -170,8 +180,8 @@ msgstr "Precio de cesión"
msgid "ItemModel.handed_over_price.help_text" msgid "ItemModel.handed_over_price.help_text"
msgstr " " msgstr " "
msgid "ItemModel.verbose_name" msgid "ItemModel.verbose_name_plural"
msgstr "Elemento" msgstr "Elementos"
msgid "ItemLinkModel.verbose_name" msgid "ItemLinkModel.verbose_name"
msgstr "Vínculo" msgstr "Vínculo"
@ -233,16 +243,6 @@ msgstr "Descripción"
msgid "LocationModel.description.help_text" msgid "LocationModel.description.help_text"
msgstr " " msgstr " "
msgid "LocationModel.parent.verbose_name"
msgstr "Pariente"
msgid "LocationModel.parent.help_text"
msgstr "Las localizaciones pueden ser sumadas."
"Exemple: La caja 12 del estante 3"
msgid "LocationModel.verbose_name"
msgstr "Localización"
msgid "LocationModel.verbose_name_plural" msgid "LocationModel.verbose_name_plural"
msgstr "Localitzaciones" msgstr "Localitzaciones"
@ -287,3 +287,8 @@ msgstr "Archivo"
msgid "MemoFileModel.verbose_name_plural" msgid "MemoFileModel.verbose_name_plural"
msgstr "Archivos" msgstr "Archivos"
#, fuzzy
#| msgid "No"
msgid "No."
msgstr "No"

Wyświetl plik

@ -8,6 +8,7 @@ import tagulous.models
from bx_django_utils.models.timetracking import TimetrackingBaseModel from bx_django_utils.models.timetracking import TimetrackingBaseModel
from django.conf import settings from django.conf import settings
from django.db import models from django.db import models
from django.db.models import QuerySet
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from inventory.parent_tree import ValuesListTree from inventory.parent_tree import ValuesListTree
@ -78,7 +79,7 @@ def generate_path_str(path):
class ParentTreeModelManager(models.Manager): class ParentTreeModelManager(models.Manager):
def update_tree_info(self): def update_tree_info(self) -> None:
start_time = time.monotonic() start_time = time.monotonic()
values = self.all().values('pk', 'name', 'parent__pk', 'path') values = self.all().values('pk', 'name', 'parent__pk', 'path')
@ -107,6 +108,20 @@ class ParentTreeModelManager(models.Manager):
duration = (time.monotonic() - start_time) * 1000 duration = (time.monotonic() - start_time) * 1000
logger.info('Update %i entries in %ims', len(entries), duration) logger.info('Update %i entries in %ims', len(entries), duration)
def related_objects(self, instance: 'BaseParentTreeModel') -> QuerySet:
"""
Returns a QuerySet with relation section of the tree
"""
path = instance.path
if path is None:
# Not saved -> Can't have related objects ;)
return self.none()
root_entry = path[0]
qs = self.all()
qs = qs.filter(path__0=root_entry)
return qs
class BaseParentTreeModel(BaseModel): class BaseParentTreeModel(BaseModel):
path = models.JSONField( path = models.JSONField(

Wyświetl plik

@ -0,0 +1,18 @@
{% load i18n admin_urls %}
<table>
<thead>
<tr>
<th>{% trans "No." %}</th>
<th>{% trans "ItemModel.verbose_name_plural" %}</th>
</tr>
</thead>
<tbody>
{% for obj in items %}
<tr>
<td>{{ forloop.counter }}</td>
<td><a href="{% url opts|admin_urlname:'change' obj.pk %}">{{ obj }}</a></td>
</tr>
{% endfor %}
</tbody>
</table>

Wyświetl plik

@ -1,4 +1,5 @@
from bx_django_utils.test_utils.assert_queries import AssertQueries from bx_django_utils.test_utils.assert_queries import AssertQueries
from django.db.models import QuerySet
from django.test import TestCase from django.test import TestCase
from inventory.admin import ItemModelAdmin, LocationModelAdmin from inventory.admin import ItemModelAdmin, LocationModelAdmin
@ -54,6 +55,11 @@ class TreeModelTests(TestCase):
] ]
item_2_1 = ItemModel.objects.get(name='2.1.') item_2_1 = ItemModel.objects.get(name='2.1.')
related_qs = ItemModel.tree_objects.related_objects(instance=item_2_1)
data = list(related_qs.values_list('name', flat=True))
assert data == ['2.', '2.1.', '2.1.1.', '2.1.2.', '2.2.', '2.2.1.', '2.2.2.']
item_2_1.name = 'NEW 2.1. Name' item_2_1.name = 'NEW 2.1. Name'
with AssertQueries() as queries: with AssertQueries() as queries:
item_2_1.save() item_2_1.save()
@ -93,6 +99,12 @@ class TreeModelTests(TestCase):
similar=True, similar=True,
) )
def test_related_objects(self):
item = ItemModel()
qs = ItemModel.tree_objects.related_objects(instance=item)
assert isinstance(qs, QuerySet)
assert qs.query.is_empty() is True
def test_parent_tree_model_ordering(self): def test_parent_tree_model_ordering(self):
assert LocationModel._meta.ordering == ('path_str',) assert LocationModel._meta.ordering == ('path_str',)
assert LocationModelAdmin.ordering == ('path_str',) assert LocationModelAdmin.ordering == ('path_str',)

Wyświetl plik

@ -200,6 +200,21 @@
</div> </div>
</div> </div>
</fieldset> </fieldset>
<fieldset class="module aligned collapse">
<h2>
Related items
</h2>
<div class="form-row field-related_items">
<div>
<label>
Related items:
</label>
<div class="readonly">
-
</div>
</div>
</div>
</fieldset>
<fieldset class="module aligned collapse"> <fieldset class="module aligned collapse">
<h2> <h2>
Lent Lent

Wyświetl plik

@ -411,6 +411,44 @@
</div> </div>
</div> </div>
</fieldset> </fieldset>
<fieldset class="module aligned collapse">
<h2>
Related items
</h2>
<div class="form-row field-related_items">
<div>
<label>
Related items:
</label>
<div class="readonly">
<table>
<thead>
<tr>
<th>
No.
</th>
<th>
Items
</th>
</tr>
</thead>
<tbody>
<tr>
<td>
1
</td>
<td>
<a href="/admin/inventory/itemmodel/&lt;removed-UUID&gt;/change/">
name
</a>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</fieldset>
<fieldset class="module aligned collapse"> <fieldset class="module aligned collapse">
<h2> <h2>
Lent Lent