From ec678cca7c7ad756b11202dbae6ba53b614cf035 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Valenta?= <git@imaniti.org>
Date: Mon, 27 Mar 2023 12:46:44 +0200
Subject: [PATCH] fieldset and inline ordering enums

---
 contracts/admin.py                            | 63 +++++++++++--------
 .../migrations/0015_alter_contract_options.py | 16 +++--
 ...contractee_options_alter_signee_options.py | 25 ++++++--
 .../migrations/0017_alter_contract_options.py | 18 ++++--
 ...contractee_created_by_signee_created_by.py | 31 ++++++---
 contracts/models.py                           |  4 +-
 contracts/templatetags/admin_extras.py        | 31 ---------
 registry/templates/admin/change_form.html     |  6 +-
 shared/admin.py                               |  7 +++
 shared/templatetags/admin_extras.py           | 55 ++++++++++++++++
 users/models.py                               |  2 +-
 11 files changed, 172 insertions(+), 86 deletions(-)
 delete mode 100644 contracts/templatetags/admin_extras.py
 create mode 100644 shared/templatetags/admin_extras.py

diff --git a/contracts/admin.py b/contracts/admin.py
index 027c6b6..6f56ad0 100644
--- a/contracts/admin.py
+++ b/contracts/admin.py
@@ -5,18 +5,26 @@ from django.contrib import admin
 from django.contrib.auth.models import Permission
 from django.utils.html import format_html
 from import_export import resources
-from nested_admin import (NestedModelAdmin, NestedStackedInline,
-                          NestedTabularInline)
+from nested_admin import NestedModelAdmin, NestedStackedInline, NestedTabularInline
 from rangefilter.filters import DateRangeFilter
 
-from shared.admin import MarkdownxGuardedModelAdmin
+from shared.admin import FieldsetInlineOrder, MarkdownxGuardedModelAdmin
 
 from .forms import ContractAdminForm, ContractFileAdminForm, SigneeAdminForm
-from .models import (Contract, Contractee, ContracteeSignature,
-                     ContracteeSignatureRepresentative, ContractFile,
-                     ContractFilingArea, ContractIntent, ContractIssue,
-                     ContractType, Signee, SigneeSignature,
-                     SigneeSignatureRepresentative)
+from .models import (
+    Contract,
+    Contractee,
+    ContracteeSignature,
+    ContracteeSignatureRepresentative,
+    ContractFile,
+    ContractFilingArea,
+    ContractIntent,
+    ContractIssue,
+    ContractType,
+    Signee,
+    SigneeSignature,
+    SigneeSignatureRepresentative,
+)
 
 
 class ContractResource(resources.ModelResource):
@@ -259,23 +267,20 @@ class ContractAdmin(
 
     def get_fieldsets_and_inlines_order(self, context) -> list:
         order = [
-            "f",
-            "f",
-            "f",
-            "i",
-            "i",
-            "i",
-            "f",
-            "i",
-            "f",
-            "f",
+            FieldsetInlineOrder.FIELDSET,
+            FieldsetInlineOrder.FIELDSET,
+            FieldsetInlineOrder.FIELDSET,
+            FieldsetInlineOrder.INLINE,
+            FieldsetInlineOrder.INLINE,
+            FieldsetInlineOrder.INLINE,
+            FieldsetInlineOrder.FIELDSET,
+            FieldsetInlineOrder.INLINE,
+            FieldsetInlineOrder.FIELDSET,
+            FieldsetInlineOrder.FIELDSET,
         ]
 
         if context["user"].has_perm("approve", self):
-            order.insert(
-                10,
-                "f"
-            )
+            order.insert(10, FieldsetInlineOrder.FIELDSET)
 
         return order
 
@@ -459,10 +464,11 @@ class SigneeSignatureRepresentativeAdmin(
         get_obj_signee_contract,
         get_obj_signee_contract,
     ),
-     permissions_mixin_factory(
+    permissions_mixin_factory(
         "contracts.edit_others",
         "contracts.delete_others",
-        lambda request, obj: get_obj_contractee_contract(obj).created_by != request.user,
+        lambda request, obj: get_obj_contractee_contract(obj).created_by
+        != request.user,
         get_obj_signee_contract,
         get_obj_signee_contract,
     ),
@@ -479,10 +485,11 @@ class ContracteeSignatureRepresentativeAdmin(
         get_obj_contractee_contract,
         get_obj_contractee_contract,
     ),
-     permissions_mixin_factory(
+    permissions_mixin_factory(
         "contracts.edit_others",
         "contracts.delete_others",
-        lambda request, obj: get_obj_contractee_contract(obj).created_by != request.user,
+        lambda request, obj: get_obj_contractee_contract(obj).created_by
+        != request.user,
         get_obj_contractee_contract,
         get_obj_contractee_contract,
     ),
@@ -511,7 +518,9 @@ for model in (
     admin.site.register(model, ContractSubmodelAdmin)
 
 admin.site.register(SigneeSignatureRepresentative, SigneeSignatureRepresentativeAdmin)
-admin.site.register(ContracteeSignatureRepresentative, ContracteeSignatureRepresentativeAdmin)
+admin.site.register(
+    ContracteeSignatureRepresentative, ContracteeSignatureRepresentativeAdmin
+)
 
 admin.site.register(ContractType, ContractTypeAdmin)
 admin.site.register(ContractIssue, ContractIssueAdmin)
diff --git a/contracts/migrations/0015_alter_contract_options.py b/contracts/migrations/0015_alter_contract_options.py
index 6206469..142ae74 100644
--- a/contracts/migrations/0015_alter_contract_options.py
+++ b/contracts/migrations/0015_alter_contract_options.py
@@ -4,14 +4,22 @@ from django.db import migrations
 
 
 class Migration(migrations.Migration):
-
     dependencies = [
-        ('contracts', '0014_alter_contracteesignaturerepresentative_options_and_more'),
+        ("contracts", "0014_alter_contracteesignaturerepresentative_options_and_more"),
     ]
 
     operations = [
         migrations.AlterModelOptions(
-            name='contract',
-            options={'permissions': [('approve', 'Schválit / zrušit schválení'), ('view_confidential', 'Zobrazit tajné informace'), ('edit_others', 'Upravit cizí'), ('delete_others', 'Odstranit cizí')], 'verbose_name': 'Smlouva', 'verbose_name_plural': 'Smlouvy'},
+            name="contract",
+            options={
+                "permissions": [
+                    ("approve", "Schválit / zrušit schválení"),
+                    ("view_confidential", "Zobrazit tajné informace"),
+                    ("edit_others", "Upravit cizí"),
+                    ("delete_others", "Odstranit cizí"),
+                ],
+                "verbose_name": "Smlouva",
+                "verbose_name_plural": "Smlouvy",
+            },
         ),
     ]
diff --git a/contracts/migrations/0016_alter_contractee_options_alter_signee_options.py b/contracts/migrations/0016_alter_contractee_options_alter_signee_options.py
index 702e850..c88ab27 100644
--- a/contracts/migrations/0016_alter_contractee_options_alter_signee_options.py
+++ b/contracts/migrations/0016_alter_contractee_options_alter_signee_options.py
@@ -4,18 +4,31 @@ from django.db import migrations
 
 
 class Migration(migrations.Migration):
-
     dependencies = [
-        ('contracts', '0015_alter_contract_options'),
+        ("contracts", "0015_alter_contract_options"),
     ]
 
     operations = [
         migrations.AlterModelOptions(
-            name='contractee',
-            options={'permissions': [('edit_others', 'Upravit cizí'), ('delete_others', 'Odstranit cizí')], 'verbose_name': 'Naše smluvní strana', 'verbose_name_plural': 'Naše smluvní strany'},
+            name="contractee",
+            options={
+                "permissions": [
+                    ("edit_others", "Upravit cizí"),
+                    ("delete_others", "Odstranit cizí"),
+                ],
+                "verbose_name": "Naše smluvní strana",
+                "verbose_name_plural": "Naše smluvní strany",
+            },
         ),
         migrations.AlterModelOptions(
-            name='signee',
-            options={'permissions': [('edit_others', 'Upravit cizí'), ('delete_others', 'Odstranit cizí')], 'verbose_name': 'Jiná smluvní strana', 'verbose_name_plural': 'Ostatní smluvní strany'},
+            name="signee",
+            options={
+                "permissions": [
+                    ("edit_others", "Upravit cizí"),
+                    ("delete_others", "Odstranit cizí"),
+                ],
+                "verbose_name": "Jiná smluvní strana",
+                "verbose_name_plural": "Ostatní smluvní strany",
+            },
         ),
     ]
diff --git a/contracts/migrations/0017_alter_contract_options.py b/contracts/migrations/0017_alter_contract_options.py
index fce8fef..f1c514a 100644
--- a/contracts/migrations/0017_alter_contract_options.py
+++ b/contracts/migrations/0017_alter_contract_options.py
@@ -4,14 +4,24 @@ from django.db import migrations
 
 
 class Migration(migrations.Migration):
-
     dependencies = [
-        ('contracts', '0016_alter_contractee_options_alter_signee_options'),
+        ("contracts", "0016_alter_contractee_options_alter_signee_options"),
     ]
 
     operations = [
         migrations.AlterModelOptions(
-            name='contract',
-            options={'permissions': [('approve', 'Schválit / zrušit schválení'), ('view_confidential', 'Zobrazit tajné informace'), ('edit_when_approved', 'Upravit schválené'), ('delete_when_approved', 'Odstranit schválené'), ('edit_others', 'Upravit cizí'), ('delete_others', 'Odstranit cizí')], 'verbose_name': 'Smlouva', 'verbose_name_plural': 'Smlouvy'},
+            name="contract",
+            options={
+                "permissions": [
+                    ("approve", "Schválit / zrušit schválení"),
+                    ("view_confidential", "Zobrazit tajné informace"),
+                    ("edit_when_approved", "Upravit schválené"),
+                    ("delete_when_approved", "Odstranit schválené"),
+                    ("edit_others", "Upravit cizí"),
+                    ("delete_others", "Odstranit cizí"),
+                ],
+                "verbose_name": "Smlouva",
+                "verbose_name_plural": "Smlouvy",
+            },
         ),
     ]
diff --git a/contracts/migrations/0018_contractee_created_by_signee_created_by.py b/contracts/migrations/0018_contractee_created_by_signee_created_by.py
index 4d64aea..79d9fc8 100644
--- a/contracts/migrations/0018_contractee_created_by_signee_created_by.py
+++ b/contracts/migrations/0018_contractee_created_by_signee_created_by.py
@@ -1,26 +1,39 @@
 # Generated by Django 4.1.4 on 2023-03-26 18:45
 
+import django.db.models.deletion
 from django.conf import settings
 from django.db import migrations, models
-import django.db.models.deletion
 
 
 class Migration(migrations.Migration):
-
     dependencies = [
         migrations.swappable_dependency(settings.AUTH_USER_MODEL),
-        ('contracts', '0017_alter_contract_options'),
+        ("contracts", "0017_alter_contract_options"),
     ]
 
     operations = [
         migrations.AddField(
-            model_name='contractee',
-            name='created_by',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Vytvořeno uživatelem'),
+            model_name="contractee",
+            name="created_by",
+            field=models.ForeignKey(
+                blank=True,
+                null=True,
+                on_delete=django.db.models.deletion.SET_NULL,
+                related_name="+",
+                to=settings.AUTH_USER_MODEL,
+                verbose_name="Vytvořeno uživatelem",
+            ),
         ),
         migrations.AddField(
-            model_name='signee',
-            name='created_by',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Vytvořeno uživatelem'),
+            model_name="signee",
+            name="created_by",
+            field=models.ForeignKey(
+                blank=True,
+                null=True,
+                on_delete=django.db.models.deletion.SET_NULL,
+                related_name="+",
+                to=settings.AUTH_USER_MODEL,
+                verbose_name="Vytvořeno uživatelem",
+            ),
         ),
     ]
diff --git a/contracts/models.py b/contracts/models.py
index d24b703..1c02dbf 100644
--- a/contracts/models.py
+++ b/contracts/models.py
@@ -184,7 +184,9 @@ class Signee(CreatedByMixin, OwnPermissionsMixin, SignatureCountMixin, models.Mo
         permissions = OwnPermissionsMixin.Meta.permissions
 
 
-class Contractee(CreatedByMixin, OwnPermissionsMixin, SignatureCountMixin, models.Model):
+class Contractee(
+    CreatedByMixin, OwnPermissionsMixin, SignatureCountMixin, models.Model
+):
     name = models.CharField(
         max_length=256,
         default=settings.DEFAULT_CONTRACTEE_NAME,
diff --git a/contracts/templatetags/admin_extras.py b/contracts/templatetags/admin_extras.py
deleted file mode 100644
index f93b4b1..0000000
--- a/contracts/templatetags/admin_extras.py
+++ /dev/null
@@ -1,31 +0,0 @@
-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/templates/admin/change_form.html b/registry/templates/admin/change_form.html
index 39083cb..bbf29db 100644
--- a/registry/templates/admin/change_form.html
+++ b/registry/templates/admin/change_form.html
@@ -5,11 +5,11 @@
 {% block field_sets %}
     {% get_fieldsets_and_inlines as fieldsets_and_inlines %}
     {% for type, fieldset_or_inline in fieldsets_and_inlines %}
-        {% if type == 'f' %}
+        {% if type.value == "fieldset" %}
             {% with fieldset=fieldset_or_inline %}
                 {% include "admin/includes/fieldset.html" %}
             {% endwith %}
-        {% elif type == 'i' %}
+        {% elif type.value == "inline" %}
             {% with inline_admin_formset=fieldset_or_inline %}
                 {% include inline_admin_formset.opts.template %}
             {% endwith %}
@@ -17,4 +17,4 @@
     {% endfor %}
 {% endblock %}
 
-{% block inline_field_sets %}{% endblock %} 
+{% block inline_field_sets %}{% endblock %}
diff --git a/shared/admin.py b/shared/admin.py
index 2b2f1ef..a8fd3e7 100644
--- a/shared/admin.py
+++ b/shared/admin.py
@@ -1,3 +1,5 @@
+import enum
+
 from django.contrib import admin
 from guardian.admin import GuardedModelAdmin
 from markdownx.admin import MarkdownxModelAdmin
@@ -5,3 +7,8 @@ from markdownx.admin import MarkdownxModelAdmin
 
 class MarkdownxGuardedModelAdmin(MarkdownxModelAdmin, GuardedModelAdmin):
     pass
+
+
+class FieldsetInlineOrder(enum.Enum):
+    FIELDSET = "fieldset"
+    INLINE = "inline"
diff --git a/shared/templatetags/admin_extras.py b/shared/templatetags/admin_extras.py
new file mode 100644
index 0000000..0565112
--- /dev/null
+++ b/shared/templatetags/admin_extras.py
@@ -0,0 +1,55 @@
+from django.template import Library
+
+from shared.admin import FieldsetInlineOrder
+
+
+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 == FieldsetInlineOrder.FIELDSET:
+            fieldsets_and_inlines.append(
+                (
+                    FieldsetInlineOrder.FIELDSET,
+                    next(adminform)
+                )
+            )
+        elif choice == FieldsetInlineOrder.INLINE:
+            fieldsets_and_inlines.append(
+                (
+                    FieldsetInlineOrder.INLINE,
+                    next(inlines)
+                )
+            )
+
+    for fieldset in adminform:
+        fieldsets_and_inlines.append(
+            (
+                FieldsetInlineOrder.FIELDSET,
+                fieldset
+            )
+        )
+
+    for inline in inlines:
+        fieldsets_and_inlines.append(
+            (
+                FieldsetInlineOrder.INLINE,
+                inline
+            )
+        )
+
+    return fieldsets_and_inlines 
diff --git a/users/models.py b/users/models.py
index b5f19b0..f449dde 100644
--- a/users/models.py
+++ b/users/models.py
@@ -21,7 +21,7 @@ class User(pirates_models.AbstractUser):
         default=True,
         verbose_name="Administrační přístup dle členství ve skupině",
         help_text=(
-            "Určuje, zda bude \"Administrační přístup\" uživatele "
+            'Určuje, zda bude "Administrační přístup" uživatele '
             "definován dle členství ve skupinách, nebo podle "
             "speciálního nastavení zde."
         ),
-- 
GitLab