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