diff --git a/contracts/admin.py b/contracts/admin.py index 553feb8addfdad5d59833a5e04bc4aeb155bf92d..027c6b6da32bd4c296ef275a7c8e79ee5691f3d0 100644 --- a/contracts/admin.py +++ b/contracts/admin.py @@ -4,7 +4,6 @@ import typing from django.contrib import admin from django.contrib.auth.models import Permission from django.utils.html import format_html -from fieldsets_with_inlines import FieldsetsInlineMixin from import_export import resources from nested_admin import (NestedModelAdmin, NestedStackedInline, NestedTabularInline) @@ -153,7 +152,6 @@ class ContractAdmin( lambda request, obj: obj.is_approved, ), MarkdownxGuardedModelAdmin, - FieldsetsInlineMixin, NestedModelAdmin, ): form = ContractAdminForm @@ -165,71 +163,12 @@ class ContractAdmin( "issues", ) - fieldsets_with_inlines = [ - ( - "Základní informace", - { - "fields": [ - "name", - "id_number", - "types", - "summary", - "is_public", - "legal_state", - "primary_contract", - ] - }, - ), - ( - "Data", - { - "fields": [ - "valid_start_date", - "valid_end_date", - ] - }, - ), - ( - "Náklady", - { - "fields": [ - "cost_amount", - "cost_unit", - ] - }, - ), + inlines = ( ContractFileInline, ContracteeSignatureInline, SigneeSignatureInline, - ( - "Odkazy", - { - "fields": [ - "tender_url", - "agreement_url", - ] - }, - ), ContractIntentInline, - ( - "Fyzický dokument", - { - "fields": [ - "paper_form_state", - "filing_area", - ] - }, - ), - ( - "Doplňující informace", - { - "fields": [ - "issues", - "notes", - ] - }, - ), - ] + ) def get_form(self, request, *args, **kwargs) -> ContractAdminForm: form = super().get_form(request, *args, **kwargs) @@ -237,30 +176,109 @@ class ContractAdmin( return form - def get_fieldsets(self, request, obj=None): - fieldsets_with_inlines = copy.deepcopy(self.fieldsets_with_inlines) + def get_fieldsets(self, request, obj=None) -> list: + fieldsets = [ + ( + "Základní informace", + { + "fields": [ + "name", + "id_number", + "types", + "summary", + "is_public", + "legal_state", + "primary_contract", + ] + }, + ), + ( + "Data", + { + "fields": [ + "valid_start_date", + "valid_end_date", + ] + }, + ), + ( + "Náklady", + { + "fields": [ + "cost_amount", + "cost_unit", + ] + }, + ), + ( + "Odkazy", + { + "fields": [ + "tender_url", + "agreement_url", + ] + }, + ), + ( + "Fyzický dokument", + { + "fields": [ + "paper_form_state", + "filing_area", + ] + }, + ), + ( + "Doplňující informace", + { + "fields": [ + "issues", + "notes", + ] + }, + ), + ] if ( obj is None # Creating confidential data, creator will be request.user or obj.created_by == request.user or request.user.has_perm("view_confidential", obj) ): - fieldsets_with_inlines[0][1]["fields"].insert( - fieldsets_with_inlines[0][1]["fields"].index("is_public") + 1, + fieldsets[0][1]["fields"].insert( + fieldsets[0][1]["fields"].index("is_public") + 1, "publishing_rejection_comment", ) - if request.user.is_superuser or request.user.has_perm("approve", self): - fieldsets_with_inlines.insert( - 8, + if request.user.has_perm("approve", self): + fieldsets.insert( + 5, ("Schválení", {"fields": ["is_approved"]}), ) - return [ - self.make_placeholder(index, fieldset) - for index, fieldset in enumerate(fieldsets_with_inlines) + return fieldsets + + def get_fieldsets_and_inlines_order(self, context) -> list: + order = [ + "f", + "f", + "f", + "i", + "i", + "i", + "f", + "i", + "f", + "f", ] + if context["user"].has_perm("approve", self): + order.insert( + 10, + "f" + ) + + return order + def get_queryset(self, request): queryset = super().get_queryset(request) diff --git a/contracts/templatetags/admin_extras.py b/contracts/templatetags/admin_extras.py new file mode 100644 index 0000000000000000000000000000000000000000..f93b4b1495c10b4e17956be67df4e588c1e1522d --- /dev/null +++ b/contracts/templatetags/admin_extras.py @@ -0,0 +1,31 @@ +from django.template import Library + + +register = Library() + + +@register.simple_tag(takes_context=True) +def get_fieldsets_and_inlines(context): + adminform = context["adminform"] + model_admin = adminform.model_admin + adminform = iter(adminform) + inlines = iter(context["inline_admin_formsets"]) + + fieldsets_and_inlines = [] + + for choice in ( + model_admin.get_fieldsets_and_inlines_order(context) + if hasattr(model_admin, "get_fieldsets_and_inlines_order") + else model_admin.fieldsets_and_inlines_order + ): + if choice == "f": + fieldsets_and_inlines.append(("f", next(adminform))) + elif choice == "i": + fieldsets_and_inlines.append(("i", next(inlines))) + + for fieldset in adminform: + fieldsets_and_inlines.append(("f", fieldset)) + for inline in inlines: + fieldsets_and_inlines.append(("i", inline)) + + return fieldsets_and_inlines diff --git a/registry/settings/base.py b/registry/settings/base.py index c2dc7c76c3f4c73ed435b5fa819f9266b89f47d5..e4da047817f8374fa8f90347816e334394286302 100644 --- a/registry/settings/base.py +++ b/registry/settings/base.py @@ -53,7 +53,6 @@ INSTALLED_APPS = [ "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", - "fieldsets_with_inlines", "nested_admin", "import_export", "rangefilter", diff --git a/registry/templates/admin/change_form.html b/registry/templates/admin/change_form.html new file mode 100644 index 0000000000000000000000000000000000000000..39083cb94785c4ce04155d9c8e525bb723a746f9 --- /dev/null +++ b/registry/templates/admin/change_form.html @@ -0,0 +1,20 @@ +{% extends "admin/change_form.html" %} + +{% load admin_extras %} + +{% block field_sets %} + {% get_fieldsets_and_inlines as fieldsets_and_inlines %} + {% for type, fieldset_or_inline in fieldsets_and_inlines %} + {% if type == 'f' %} + {% with fieldset=fieldset_or_inline %} + {% include "admin/includes/fieldset.html" %} + {% endwith %} + {% elif type == 'i' %} + {% with inline_admin_formset=fieldset_or_inline %} + {% include inline_admin_formset.opts.template %} + {% endwith %} + {% endif %} + {% endfor %} +{% endblock %} + +{% block inline_field_sets %}{% endblock %} diff --git a/requirements/base.txt b/requirements/base.txt index e45386af9ae22a45176fc7ddceb7b28ce5d767e5..dc65d55174714f9d285f0fede46f87f174af041d 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -5,7 +5,6 @@ django-admin-rangefilter==0.9.0 django-autocomplete-light==3.9.4 django-database-url==1.0.3 django-downloadview==2.3.0 -django-fieldsets-with-inlines==0.6 django-import-export==3.1.0 django-nested-admin==4.0.2 django-ordered-model==3.7.1