From cf689ac1cb13064741d2d2bd44f07518ba1321f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Valenta?= <tomas@imaniti.org> Date: Wed, 28 Feb 2024 14:43:33 +0100 Subject: [PATCH] improve UI & permissions --- contracts/admin.py | 73 +++++++++++++++++++++++++++++++++++++--------- contracts/forms.py | 10 +++++++ 2 files changed, 69 insertions(+), 14 deletions(-) diff --git a/contracts/admin.py b/contracts/admin.py index 2f405d2..f3ba18b 100644 --- a/contracts/admin.py +++ b/contracts/admin.py @@ -121,7 +121,34 @@ class ContractFileAdmin( form = ContractFileAdminForm -class ContracteeSignatureRepresentativeInline(NestedStackedInline): +class ParentContractInlineMixin: + def has_add_permission(self, request, obj=None): + if ( + obj is not None + and not request.user.has_perm("contracts.edit_when_approved") + and not obj.is_editable_without_approve_permission + ): + return False + + return super().has_add_permission(request, obj) + + def has_change_permission(self, request, obj=None): + return self.has_add_permission(request, obj) + + def has_delete_permission(self, request, obj=None): + if ( + obj is not None + and not request.user.has_perm("contracts.delete_when_approved") + and not obj.is_editable_without_approve_permission + ): + return False + + return super().has_change_permission(request, obj) + + +class ContracteeSignatureRepresentativeInline( + ParentContractInlineMixin, NestedStackedInline +): model = ContracteeSignatureRepresentative extra = 1 formset = SingnatureRepresentativeFormSet @@ -133,48 +160,45 @@ class ContracteeSignatureRepresentativeInline(NestedStackedInline): return formset -class ContracteeSignatureInline(NestedStackedInline): +class ContracteeSignatureInline(ParentContractInlineMixin, NestedStackedInline): model = ContracteeSignature autocomplete_fields = ("contractee",) inlines = (ContracteeSignatureRepresentativeInline,) extra = 0 -class SigneeSignatureRepresentativeInline(NestedStackedInline): +class SigneeSignatureRepresentativeInline( + ParentContractInlineMixin, NestedStackedInline +): model = SigneeSignatureRepresentative extra = 0 -class SigneeSignatureInline(NestedStackedInline): +class SigneeSignatureInline(ParentContractInlineMixin, NestedStackedInline): model = SigneeSignature autocomplete_fields = ("signee",) inlines = (SigneeSignatureRepresentativeInline,) extra = 0 -class ContractFileInline(NestedTabularInline): +class ContractFileInline(ParentContractInlineMixin, NestedTabularInline): model = ContractFile form = ContractFileAdminForm extra = 0 -class ContractApprovalInline(NestedTabularInline): +class ContractApprovalInline(ParentContractInlineMixin, NestedTabularInline): model = ContractApproval extra = 0 -class ContractIntentInline(NestedTabularInline): +class ContractIntentInline(ParentContractInlineMixin, NestedTabularInline): model = ContractIntent extra = 0 class ContractAdmin( OwnPermissionsMixin, - permissions_mixin_factory( - "contracts.edit_when_approved", - "contracts.delete_when_approved", - obj_conditional=lambda request, obj: not obj.is_editable_without_approve_permission, - ), MarkdownxGuardedModelAdmin, NestedModelAdmin, ): @@ -538,11 +562,32 @@ class ContractAdmin( return parent_save_response + def get_readonly_fields(self, request, obj=None): + readonly_fields = [] + + fields = [] + + for fieldset in self.get_fieldsets(request): + fields += fieldset[1]["fields"] + + if ( + obj.created_by == request.user + and obj.status == obj.StatusTypes.TO_BE_APPROVED + and not request.user.has_perm("contracts.edit_when_approved") + ): + fields.remove("status") + + print("returning", fields) + + return fields + + return list(self.readonly_fields) + def has_change_permission(self, request, obj=None): if ( obj is not None and not request.user.has_perm("contracts.edit_when_approved") - and not obj.is_editable_without_approve_permission + and obj.status == obj.StatusTypes.APPROVED ): return False @@ -556,7 +601,7 @@ class ContractAdmin( ): return False - return super().has_change_permission(request, obj) + return super().has_delete_permission(request, obj) list_filter = ( AutocompleteFilterFactory("Typ", "types"), diff --git a/contracts/forms.py b/contracts/forms.py index 3a898eb..350a9ba 100644 --- a/contracts/forms.py +++ b/contracts/forms.py @@ -131,7 +131,17 @@ class ContractAdminForm(forms.ModelForm): choice_label, ) ) + continue + elif choice_key == Contract.StatusTypes.WORK_IN_PROGRESS: + allowed_choices.append( + ( + choice_key, + choice_label, + ) + ) + + continue if self.instance.status == Contract.StatusTypes.REJECTED: if choice_key in ( -- GitLab