From 5ffd102e01da458ea71e515b7fffd3fe58cb99fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Valenta?= <git@imaniti.org> Date: Sun, 19 Mar 2023 00:06:16 +0100 Subject: [PATCH] wip - app ordering --- contracts/admin.py | 160 ++++++++++++------------ contracts/models.py | 12 +- registry/admin.py | 40 ++++++ registry/settings/base.py | 13 ++ registry/templates/admin/base_site.html | 5 + registry/urls.py | 2 + 6 files changed, 147 insertions(+), 85 deletions(-) create mode 100644 registry/admin.py diff --git a/contracts/admin.py b/contracts/admin.py index 638dc45..9ba5ea2 100644 --- a/contracts/admin.py +++ b/contracts/admin.py @@ -1,6 +1,7 @@ from dal_admin_filters import AutocompleteFilter from django.contrib import admin from django.utils.html import format_html +from fieldsets_with_inlines import FieldsetsInlineMixin from import_export import resources from rangefilter.filters import DateRangeFilter @@ -84,20 +85,11 @@ class ContractSigneeRepresentativeInline(admin.TabularInline): extra = 0 -class ContractAdmin(MarkdownxGuardedModelAdmin): +class ContractAdmin(FieldsetsInlineMixin, MarkdownxGuardedModelAdmin): form = ContractAdminForm readonly_fields = ("created_by",) - inlines = ( - ContracteeSignatureInline, - SigneeSignatureInline, - ContractFileInline, - ContractIntentInline, - ContractContracteeRepresentativeInline, - ContractSigneeRepresentativeInline, - ) - #def __init__(self, *args, **kwargs): #from .models import Contract @@ -110,73 +102,83 @@ class ContractAdmin(MarkdownxGuardedModelAdmin): #.filter(contract=self.instance) #) - def get_fieldsets(self, request, obj=None): - fieldsets = [ - ( - "Základní informace", - { - "fields": [ - "name", - "id_number", - "types", - "summary", - "public_state", - "publishing_rejection_comment", - "legal_state", - "primary_contract", - ] - } - ), - ( - "Data", - { - "fields": [ - "valid_start_date", - "valid_end_date", - ] - } - ), - ( - "Fyzický dokument", - { - "fields": [ - "paper_form_state", - "filing_area", - ] - } - ), - ( - "Odkazy", - { - "fields": [ - "tender_url", - "agreement_url", - ] - } - ), - ( - "Náklady", - { - "fields": [ - "cost_amount", - "cost_unit", - ] - } - ), - ( - "Doplňující informace", - { - "fields": [ - "issues", - "notes", - ] - } - ) - ] + fieldsets_with_inlines = [ + ( + "Základní informace", + { + "fields": [ + "name", + "id_number", + "types", + "summary", + "public_state", + "publishing_rejection_comment", + "legal_state", + "primary_contract", + ] + } + ), + ( + "Data", + { + "fields": [ + "valid_start_date", + "valid_end_date", + ] + } + ), + ( + "Náklady", + { + "fields": [ + "cost_amount", + "cost_unit", + ] + } + ), + + ContractFileInline, + ContracteeSignatureInline, + ContractContracteeRepresentativeInline, + SigneeSignatureInline, + ContractSigneeRepresentativeInline, + + ( + "Odkazy", + { + "fields": [ + "tender_url", + "agreement_url", + ] + } + ), + + ContractIntentInline, + + ( + "Fyzický dokument", + { + "fields": [ + "paper_form_state", + "filing_area", + ] + } + ), + ( + "Doplňující informace", + { + "fields": [ + "issues", + "notes", + ] + } + ) + ] + def get_fieldsets(self, request, obj=None): if request.user.is_superuser or request.user.has_perm("approve", self): - fieldsets.insert( - 0, + self.fieldsets_with_inlines.insert( + 8, ( "Schválení", { @@ -184,8 +186,8 @@ class ContractAdmin(MarkdownxGuardedModelAdmin): } ), ) - - return fieldsets + + return super().get_fieldsets(request, obj) def save_model(self, request, obj, form, change) -> None: if obj.created_by is None: @@ -269,7 +271,6 @@ for model in ( ContracteeSignature, ContractSigneeRepresentative, ContractContracteeRepresentative, - ContractType, ContractIntent, ): admin.site.register(model, IndexHiddenModelAdmin) @@ -278,8 +279,9 @@ admin.site.register(ContractFile, ContractFileAdmin) for model in ( Contractee, - ContractIssue, ContractFilingArea, + ContractIssue, + ContractType, ): admin.site.register(model, MarkdownxGuardedModelAdmin) diff --git a/contracts/models.py b/contracts/models.py index ea19f34..d1831d7 100644 --- a/contracts/models.py +++ b/contracts/models.py @@ -196,7 +196,7 @@ class ContractType(NameStrMixin, models.Model): app_label = "contracts" verbose_name = "Typ smlouvy" - verbose_name_plural = "Typy smlouvy" + verbose_name_plural = "Typy smluv" class ContractIssue(NameStrMixin, models.Model): @@ -504,8 +504,8 @@ class ContractSigneeRepresentative(RepresentativeMixin, models.Model): class Meta: app_label = "contracts" - verbose_name = "Zástupce druhé smluvní strany" - verbose_name_plural = "Zástupci druhé smluvní strany" + verbose_name = "Zástupce jiné smluvní strany" + verbose_name_plural = "Zástupci jiných smluvních stran" class ContractFile(NameStrMixin, models.Model): @@ -565,7 +565,7 @@ class ContracteeSignature(models.Model): verbose_name_plural = "Podpisy našich smluvních stran" def __str__(self) -> str: - return f"{self.contractee.name} - {self.date}" + return f"{str(self.contractee)} - {self.date}" class SigneeSignature(models.Model): @@ -591,10 +591,10 @@ class SigneeSignature(models.Model): app_label = "contracts" verbose_name = "Podpis jiné smluvní strany" - verbose_name_plural = "Podpisy ostatních smluvních stran" + verbose_name_plural = "Podpisy jiných smluvních stran" def __str__(self) -> str: - return f"{self.signee.name} - {self.date}" + return f"{str(self.signee)} - {self.date}" class ContractIntent(NameStrMixin, models.Model): diff --git a/registry/admin.py b/registry/admin.py new file mode 100644 index 0000000..0168742 --- /dev/null +++ b/registry/admin.py @@ -0,0 +1,40 @@ +from django_admin_index.models import AppGroup, AppGroupQuerySet + +from django.conf import settings +from django.contrib import admin + + +def get_app_list(self, request): + app_dict = self._build_app_dict(request) + + for app_name, object_list in app_dict.items(): + if app_name in settings.ADMIN_ORDERING: + app = app_dict[app_name] + app["models"].sort( + key=lambda model: settings.ADMIN_ORDERING[app_name].index(model["object_name"]) + ) + app_dict[app_name] + + yield app + else: + yield app_dict[app_name] + + +admin.AdminSite.get_app_list = get_app_list + + +class CustomOrderAppGroupQuerySet(AppGroupQuerySet): + def as_list(self, request, include_remaining=True): + result = super().as_list(request, include_remaining=include_remaining) + + for item in result: + if app_label not in settings.ADMIN_ORDERING: + continue + + item["models"].sort( + key=lambda model: settings.ADMIN_ORDERING[app_name].index(model["name"]) + ) + + return result + +AppGroup.objects = AppGroupQuerySet.as_manager() diff --git a/registry/settings/base.py b/registry/settings/base.py index ea0da07..4804234 100644 --- a/registry/settings/base.py +++ b/registry/settings/base.py @@ -206,6 +206,19 @@ ADMIN_INDEX_AUTO_CREATE_APP_GROUP = True ADMIN_INDEX_SHOW_REMAINING_APPS = True + +ADMIN_ORDERING = { + "contracts": [ + "Contract", + "Signee", + "Contractee", + "ContractType", + "ContractIssue", + "ContractFilingArea", + ], +} + + ## App-specific DEFAULT_CONTRACTEE_NAME = env.str("DEFAULT_CONTRACTEE_NAME") diff --git a/registry/templates/admin/base_site.html b/registry/templates/admin/base_site.html index 4099da6..6290476 100644 --- a/registry/templates/admin/base_site.html +++ b/registry/templates/admin/base_site.html @@ -70,5 +70,10 @@ border-radius: var(--admin-interface-module-border-radius) !important; text-decoration: none !important; } + + + .module caption, .inline-group h2 { + text-transform: none; + } </style> {% endblock %} diff --git a/registry/urls.py b/registry/urls.py index fbd47f4..3424b6f 100644 --- a/registry/urls.py +++ b/registry/urls.py @@ -20,6 +20,8 @@ from django.urls import include, path, re_path from django.views.static import serve from pirates.urls import urlpatterns as pirates_urlpatterns +import registry.admin + urlpatterns = [ path("", include("contracts.urls")), path("", include("users.urls")), -- GitLab