diff --git a/contracts/admin.py b/contracts/admin.py index 96e15ee2f52d9d6867afdf9b54797cd333ed76e7..2f405d237350d1f477fdea2845aecb0e221063bb 100644 --- a/contracts/admin.py +++ b/contracts/admin.py @@ -18,10 +18,10 @@ from rangefilter.filters import DateRangeFilter from shared.admin import FieldsetInlineOrder, MarkdownxGuardedModelAdmin from .forms import ( - AtLeastOneRequiredInlineFormSet, ContractAdminForm, ContractFileAdminForm, SigneeAdminForm, + SingnatureRepresentativeFormSet, ) from .models import ( Contract, @@ -124,7 +124,13 @@ class ContractFileAdmin( class ContracteeSignatureRepresentativeInline(NestedStackedInline): model = ContracteeSignatureRepresentative extra = 1 - formset = AtLeastOneRequiredInlineFormSet + formset = SingnatureRepresentativeFormSet + + def get_formset(self, request, obj=None, **kwargs): + formset = super().get_formset(request, obj, **kwargs) + formset.request = request + + return formset class ContracteeSignatureInline(NestedStackedInline): diff --git a/contracts/forms.py b/contracts/forms.py index a6a99e7e5a8ed99c9bdd744ec35c3ccec14a0d5c..886767d68f9b18ccead0db3f0bdaa74880ebfcaa 100644 --- a/contracts/forms.py +++ b/contracts/forms.py @@ -6,7 +6,13 @@ from webpack_loader.loader import WebpackLoader from .models import Contract, ContracteeSignature, SigneeSignature -class AtLeastOneRequiredInlineFormSet(BaseInlineFormSet): +class SingnatureRepresentativeFormSet(BaseInlineFormSet): + def _construct_form(self, i, **kwargs): + form = super()._construct_form(i, **kwargs) + form.request = self.request + + return form + def clean(self): """Check that at least one item has been entered.""" @@ -15,9 +21,45 @@ class AtLeastOneRequiredInlineFormSet(BaseInlineFormSet): if any(self.errors): return + signature_position = None + signature_id = None + excluded_from_check = False + + for form in self.forms: + for key, value in form.request.POST.items(): + attempted_signature_position = key.replace( + "contractee_signatures-", "" + ).replace("-id", "") + + if ( + attempted_signature_position.isnumeric() + and key.startswith("contractee_signatures-") + and key.endswith("-id") + ): + signature_position = int(attempted_signature_position) + signature_id = int(value) + + if signature_id is None or signature_id is None: + break + + signature = form.cleaned_data.get("signature") + + if signature is not None: + if ( + signature.id == signature_id + and form.request.POST.get( + f"contractee_signatures-{signature_position}-DELETE" + ) + == "on" + ): + excluded_from_check = True + + if excluded_from_check: + return + if not any( - cleaned_data and not cleaned_data.get("DELETE", False) - for cleaned_data in self.cleaned_data + form.cleaned_data and not form.cleaned_data.get("DELETE", False) + for form in self.forms ): raise forms.ValidationError("Vyžadován aspoŠjeden záznam.") diff --git a/contracts/management/commands/import_old_contracts.py b/contracts/management/commands/import_old_contracts.py index 312f62523f4e3f7efd5d8020d72702f44fe87081..ea613d292639a2e8ae8eb34d500b75071293df71 100644 --- a/contracts/management/commands/import_old_contracts.py +++ b/contracts/management/commands/import_old_contracts.py @@ -10,9 +10,8 @@ from django.conf import settings from django.core.files import File from django.core.management.base import BaseCommand from django.db import models -from postal.parser import parse_address - from git import Repo +from postal.parser import parse_address from ...models import ( Contract,