add new FEB questions to gov domain request wizard page

This commit is contained in:
matthewswspence 2025-02-21 15:28:50 -06:00
parent dfd237755d
commit 292c08902a
No known key found for this signature in database
GPG key ID: FB458202A7852BA4
4 changed files with 47 additions and 19 deletions

View file

@ -25,7 +25,7 @@ nameserversFormListener();
hookupYesNoListener("other_contacts-has_other_contacts",'other-employees', 'no-other-employees'); hookupYesNoListener("other_contacts-has_other_contacts",'other-employees', 'no-other-employees');
hookupYesNoListener("additional_details-has_anything_else_text",'anything-else', null); hookupYesNoListener("additional_details-has_anything_else_text",'anything-else', null);
hookupYesNoListener("additional_details-has_cisa_representative",'cisa-representative', null); hookupYesNoListener("additional_details-has_cisa_representative",'cisa-representative', null);
hookupYesNoListener("feb_naming_requirements", "", "domain-naming-requirements-details-container"); hookupYesNoListener("dotgov_domain-feb_naming_requirements", null, "domain-naming-requirements-details-container");
initializeUrbanizationToggle(); initializeUrbanizationToggle();

View file

@ -625,8 +625,11 @@ class ExecutiveNamingRequirementsYesNoForm(BaseYesNoForm):
def clean(self): def clean(self):
# Skip validation if this form is not applicable. # Skip validation if this form is not applicable.
if not (self.domain_request.is_federal() and self.domain_request.federal_type == "Executive"): if not (self.domain_request.is_federal() and self.domain_request.federal_type == "Executive"):
# If not executive, default to "yes" # Initialize cleaned_data if it doesn't exist
self.cleaned_data["feb_naming_requirements"] = "yes" if not hasattr(self, 'cleaned_data'):
self.cleaned_data = {}
# If not executive, default to None
self.cleaned_data["feb_naming_requirements"] = None
return self.cleaned_data return self.cleaned_data
# Only validate the yes/no field here; details are handled by the separate details form. # Only validate the yes/no field here; details are handled by the separate details form.
@ -639,7 +642,7 @@ class ExecutiveNamingRequirementsYesNoForm(BaseYesNoForm):
""" """
if not self.is_valid(): if not self.is_valid():
return return
obj.feb_naming_requirements = (self.cleaned_data["feb_naming_requirements"] == "yes") obj.feb_naming_requirements = (self.cleaned_data.get("feb_naming_requirements", None) == "yes")
obj.save() obj.save()
@classmethod @classmethod
@ -660,6 +663,7 @@ class ExecutiveNamingRequirementsDetailsForm(BaseDeletableRegistrarForm):
widget=forms.Textarea(attrs={'maxlength': '2000'}), widget=forms.Textarea(attrs={'maxlength': '2000'}),
max_length=2000, max_length=2000,
required=True, required=True,
error_messages={"required": ("This field is required.")},
label="", label="",
help_text="Maximum 2000 characters allowed.", help_text="Maximum 2000 characters allowed.",
) )
@ -670,6 +674,25 @@ class ExecutiveNamingRequirementsDetailsForm(BaseDeletableRegistrarForm):
obj.feb_naming_requirements_details = self.cleaned_data["feb_naming_requirements_details"] obj.feb_naming_requirements_details = self.cleaned_data["feb_naming_requirements_details"]
obj.save() obj.save()
def is_valid(self):
"""
Validate that details are provided when required.
If the form is marked for deletion, bypass validation.
"""
if self.form_data_marked_for_deletion:
return True
is_valid = super().is_valid()
if not is_valid:
return False
# Check if the details field has content
details = self.cleaned_data.get('feb_naming_requirements_details', '').strip()
if not details:
return False
return True
class PurposeForm(RegistrarForm): class PurposeForm(RegistrarForm):
purpose = forms.CharField( purpose = forms.CharField(
label="Purpose", label="Purpose",

View file

@ -1401,13 +1401,12 @@ class DomainRequest(TimeStampedModel):
def is_feb(self) -> bool: def is_feb(self) -> bool:
"""Is this domain request for a Federal Executive Branch agency?""" """Is this domain request for a Federal Executive Branch agency?"""
# if not self.generic_org_type: if not self.generic_org_type:
# # generic_org_type is either blank or None, assume no # generic_org_type is either blank or None, assume no
# return False return False
# if self.generic_org_type == DomainRequest.OrganizationChoices.FEDERAL: if self.generic_org_type == DomainRequest.OrganizationChoices.FEDERAL:
# return self.federal_type == DomainRequest.FederalChoices.EXECUTIVE return self.federal_type == DomainRequest.FederalChoices.EXECUTIVE
# return False return False
return True # TODO: this is for testing, remove before merging
def is_federal(self) -> Union[bool, None]: def is_federal(self) -> Union[bool, None]:
"""Is this domain request for a federal agency? """Is this domain request for a federal agency?

View file

@ -674,27 +674,33 @@ class DotgovDomain(DomainRequestWizard):
2: ExecutiveNamingRequirementsYesNoForm 2: ExecutiveNamingRequirementsYesNoForm
3: ExecutiveNamingRequirementsDetailsForm 3: ExecutiveNamingRequirementsDetailsForm
""" """
logger.debug("Validating dotgov domain form")
# If not a federal executive branch agency, mark executive-related forms for deletion. # If not a federal executive branch agency, mark executive-related forms for deletion.
if not (self.domain_request.is_feb()): if not (self.domain_request.is_feb()):
forms_list[2].mark_form_for_deletion() forms_list[2].mark_form_for_deletion()
forms_list[3].mark_form_for_deletion() forms_list[3].mark_form_for_deletion()
return all(form.is_valid() for form in forms_list) return all(form.is_valid() for form in forms_list)
valid = True if not forms_list[2].is_valid():
yesno_form = forms_list[2] logger.debug("Dotgov domain form is invalid")
details_form = forms_list[3] if forms_list[2].cleaned_data.get("feb_naming_requirements", None) != "no":
forms_list[3].mark_form_for_deletion()
return False
logger.debug(f"feb_naming_requirements: {forms_list[2].cleaned_data.get('feb_naming_requirements', None)}")
if yesno_form.cleaned_data.get("feb_naming_requirements") == "yes": if forms_list[2].cleaned_data.get("feb_naming_requirements", None) != "no":
# If the user selects "yes", no details are needed. logger.debug("Marking details form for deletion")
details_form.mark_form_for_deletion() # If the user selects "yes" or has made no selection, no details are needed.
forms_list[3].mark_form_for_deletion()
valid = all( valid = all(
form.is_valid() for i, form in enumerate(forms_list) if i != 3 form.is_valid() for i, form in enumerate(forms_list) if i != 3
) )
else: else:
# "No" was selected details are required. # "No" was selected details are required.
valid = ( valid = (
yesno_form.is_valid() and forms_list[2].is_valid() and
details_form.is_valid() and forms_list[3].is_valid() and
all(form.is_valid() for i, form in enumerate(forms_list) if i not in [2, 3]) all(form.is_valid() for i, form in enumerate(forms_list) if i not in [2, 3])
) )
return valid return valid