diff --git a/contracts/admin.py b/contracts/admin.py index 8a6d17b9411672418ee5ee0b609952d2b496368e..c49ebfee45c15bfacadaaa9cbb93ab873df68b55 100644 --- a/contracts/admin.py +++ b/contracts/admin.py @@ -213,6 +213,7 @@ class ContractAdmin( "summary", "is_public", "is_valid", + "status", "primary_contract", ] }, @@ -254,7 +255,6 @@ class ContractAdmin( ] }, ), - ("Stav", {"fields": ["status"]}), ( "DoplĹujĂcĂ informace", { @@ -281,7 +281,7 @@ class ContractAdmin( return fieldsets - fieldsets_and_inlines_order = order = [ + fieldsets_and_inlines_order = [ FieldsetInlineOrder.FIELDSET, FieldsetInlineOrder.FIELDSET, FieldsetInlineOrder.FIELDSET, @@ -291,7 +291,6 @@ class ContractAdmin( FieldsetInlineOrder.FIELDSET, FieldsetInlineOrder.INLINE, FieldsetInlineOrder.INLINE, - FieldsetInlineOrder.FIELDSET, FieldsetInlineOrder.INLINE, FieldsetInlineOrder.FIELDSET, ] @@ -422,7 +421,7 @@ class ContractAdmin( settings.NASTENKA_API_URL, data=json.dumps( { - "name": f"Smlouva odmĂtnuta - {obj.name}", + "name": f"Smlouva zamĂtnuta - {obj.name}", "description": ( obj.summary if obj.summary is not None @@ -476,7 +475,7 @@ class ContractAdmin( AutocompleteFilterFactory("Spisovna", "filing_area"), AutocompleteFilterFactory("ProblĂ©m", "issues"), AutocompleteFilterFactory( - "Naše smluvná strana", "contractee_signatures__contractee" + "Naše smluvnĂ strana", "contractee_signatures__contractee" ), AutocompleteFilterFactory("Jiná smluvnĂ strana", "signee_signatures__signee"), "status", diff --git a/contracts/forms.py b/contracts/forms.py index 04ca974db87942eedf120174c3f6ae49f203d9de..3f9b300a75826ad22cf8e1a6419d8e9927866568 100644 --- a/contracts/forms.py +++ b/contracts/forms.py @@ -23,20 +23,75 @@ class AtLeastOneRequiredInlineFormSet(BaseInlineFormSet): class ContractAdminForm(forms.ModelForm): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + if "status" in self.fields: + allowed_choices = [] + + for choice_key, choice_label in Contract.StatusTypes.choices: + # Not yet created + if self.instance.id is None: + if choice_key in ( + Contract.StatusTypes.WORK_IN_PROGRESS, + Contract.StatusTypes.TO_BE_APPROVED + ): + allowed_choices.append((choice_key, choice_label,)) + + continue + + if self.instance.status == choice_key: + allowed_choices.append((choice_key, choice_label,)) + continue + + if self.instance.status in ( + Contract.StatusTypes.WORK_IN_PROGRESS, + Contract.StatusTypes.TO_BE_APPROVED + ): + if self.current_user.has_perm("contract.approve"): + if choice_key in ( + Contract.StatusTypes.APPROVED, + Contract.StatusTypes.REJECTED + ): + allowed_choices.append((choice_key, choice_label,)) + continue + + if self.instance.status == Contract.StatusTypes.REJECTED: + if choice_key in ( + Contract.StatusTypes.WORK_IN_PROGRESS, + Contract.StatusTypes.TO_BE_APPROVED + ): + allowed_choices.append((choice_key, choice_label,)) + continue + + self.fields["status"].widget = forms.Select(choices=allowed_choices) + def clean(self): clean_data = super().clean() if ( - not self.current_user.is_superuser - and self.instance.status + self.instance.status + == clean_data.get("status") + == self.instance.StatusTypes.REJECTED + ): + raise ValidationError( + { + "status": ( + "Smlouvu nelze upravovat, zatĂmco je zamĂtnutá." + ) + } + ) + + if ( + clean_data.get("status", self.instance.status) in (self.instance.StatusTypes.APPROVED, self.instance.StatusTypes.REJECTED) - and (self.instance.status == clean_data.get("status", self.instance.status)) + and self.instance.status != clean_data.get("status", self.instance.status) and self.current_user == self.instance.created_by ): raise ValidationError( { "status": ( - "Smlouva nemĹŻĹľe bĂ˝t schválena uĹľivatelem, kterĂ˝ ji nahrál." + "Smlouva nemĹŻĹľe bĂ˝t schválena / zamĂtnuta uĹľivatelem, kterĂ˝ ji nahrál." ) } ) diff --git a/contracts/models.py b/contracts/models.py index c2a6786767a195a5e860efae497005df6669e7e1..80d5899bd61e37c7f6a8271ab83347a131424c3d 100644 --- a/contracts/models.py +++ b/contracts/models.py @@ -500,7 +500,7 @@ class Contract(NameStrMixin, models.Model): choices=StatusTypes.choices, max_length=16, default=StatusTypes.WORK_IN_PROGRESS, - verbose_name="Status", + verbose_name="Stav", help_text='OznaÄŤenĂm jako "Ke schválenĂ" se smlouva pĹ™edá schvalovateli.', ) diff --git a/registry/templates/admin/index.html b/registry/templates/admin/index.html index 7f6888e3b7504c23f352f5f88f1ffc2378ae4f42..cab182cdbef8cebc6aeacdef301a6ae65527cfe9 100644 --- a/registry/templates/admin/index.html +++ b/registry/templates/admin/index.html @@ -6,7 +6,7 @@ <div class="index-action-buttons"> {% if request.user.can_approve_contracts %} <a - href="contracts/contract/?status__exact=approved" + href="contracts/contract/?status__exact=to_be_approved" aria-role="button" >Smlouvy ke schválenĂ ({{ request.user.contracts_to_approve_count }})</a> {% endif %}