kopia lustrzana https://github.com/jedie/PyInventory
Merge pull request #121 from jedie/dev2
NEW: List all related objects on `item` change page with edit links.pull/122/head
commit
b0c6acc02a
|
@ -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
|
||||||
|
|
|
@ -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.
|
@ -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.
|
@ -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.
|
@ -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.
|
@ -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"
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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>
|
|
@ -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',)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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/<removed-UUID>/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
|
||||||
|
|
Ładowanie…
Reference in New Issue