From 3a9683cf490e12d3da019e178b7c9c91a9f71ab6 Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Mon, 26 Feb 2024 13:02:12 -0700 Subject: [PATCH] Add custom field transitions Kudos to rachid --- src/registrar/admin.py | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/registrar/admin.py b/src/registrar/admin.py index e68943272..c5e177bf4 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -803,9 +803,14 @@ class DomainApplicationAdminForm(forms.ModelForm): # first option in status transitions is current state available_transitions = [(current_state, application.get_status_display())] - transitions = get_available_FIELD_transitions( - application, models.DomainApplication._meta.get_field("status") - ) + if application.investigator is not None: + transitions = get_available_FIELD_transitions( + application, models.DomainApplication._meta.get_field("status") + ) + else: + transitions = self.get_custom_field_transitions( + application, models.DomainApplication._meta.get_field("status") + ) for transition in transitions: available_transitions.append((transition.target, transition.target.label)) @@ -816,6 +821,17 @@ class DomainApplicationAdminForm(forms.ModelForm): if not application.creator.is_restricted(): self.fields["status"].widget.choices = available_transitions + def get_custom_field_transitions(self, instance, field): + """Custom implementation of get_available_FIELD_transitions + in the FSM. Allows us to still display fields filtered out by a condition.""" + curr_state = field.get_state(instance) + transitions = field.transitions[instance.__class__] + + for name, transition in transitions.items(): + meta = transition._django_fsm + if meta.has_transition(curr_state): + yield meta.get_transition(curr_state) + def clean(self): # clean is called from clean_forms, which is called from is_valid # after clean_fields. it is used to determine form level errors.