diff --git a/contracts/admin.py b/contracts/admin.py index 638dc454bd2458dd4c96fb097c51ae757b22ceb2..9ba5ea2718babbdeccbef649052413b62301fee1 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 ea19f34a26596daa32d7ccc38c8375823ead7dff..d1831d70d278aab094ba3d2aae7ff5b433bbaddf 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 0000000000000000000000000000000000000000..0168742eec79a3afb0b9ddba14c95172a3388d1a --- /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 ea0da079f9f8de06ca53decdf31d5bba5704bb3a..4804234164d63173462798e1fdd7c95bd5c34c92 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 4099da6ca95e09ce3247cb83b7a607328aaa53c2..629047619affd6ed95e13c3ad41660b71cc833b5 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 fbd47f4f0586ae05794842d95ab96b929a8cf413..3424b6f1343082dd9accc4fca87c71b463e976db 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")),