diff --git a/src/registrar/forms/domain_request_wizard.py b/src/registrar/forms/domain_request_wizard.py index 0e9e87f9d..fc176ce82 100644 --- a/src/registrar/forms/domain_request_wizard.py +++ b/src/registrar/forms/domain_request_wizard.py @@ -16,6 +16,7 @@ from registrar.forms.utility.wizard_form_helper import ( from registrar.models import Contact, DomainRequest, DraftDomain, Domain, FederalAgency from registrar.templatetags.url_helpers import public_site_url from registrar.utility.enums import ValidationReturnType +from registrar.utility.constants import BranchChoices logger = logging.getLogger(__name__) @@ -67,7 +68,7 @@ class TribalGovernmentForm(RegistrarForm): class OrganizationFederalForm(RegistrarForm): federal_type = forms.ChoiceField( - choices=DomainRequest.BranchChoices.choices, + choices=BranchChoices.choices, widget=forms.RadioSelect, error_messages={"required": ("Select the part of the federal government your organization is in.")}, ) diff --git a/src/registrar/management/commands/transfer_transition_domains_to_domains.py b/src/registrar/management/commands/transfer_transition_domains_to_domains.py index 4e05235d4..4eaa2f367 100644 --- a/src/registrar/management/commands/transfer_transition_domains_to_domains.py +++ b/src/registrar/management/commands/transfer_transition_domains_to_domains.py @@ -19,6 +19,7 @@ from registrar.models.domain_request import DomainRequest from registrar.models.domain_information import DomainInformation from registrar.models.user import User from registrar.models.federal_agency import FederalAgency +from registrar.utility.constants import BranchChoices logger = logging.getLogger(__name__) @@ -819,7 +820,7 @@ class Command(BaseCommand): invitation.save() valid_org_choices = [(name, value) for name, value in DomainRequest.OrganizationChoices.choices] - valid_fed_choices = [value for name, value in DomainRequest.BranchChoices.choices] + valid_fed_choices = [value for name, value in BranchChoices.choices] valid_agency_choices = FederalAgency.objects.all() # ====================================================== # ================= DOMAIN INFORMATION ================= diff --git a/src/registrar/migrations/0099_federalagency_federal_type.py b/src/registrar/migrations/0099_federalagency_federal_type.py new file mode 100644 index 000000000..b4e955263 --- /dev/null +++ b/src/registrar/migrations/0099_federalagency_federal_type.py @@ -0,0 +1,24 @@ +# Generated by Django 4.2.10 on 2024-06-11 15:54 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("registrar", "0098_alter_domainrequest_status"), + ] + + operations = [ + migrations.AddField( + model_name="federalagency", + name="federal_type", + field=models.CharField( + blank=True, + choices=[("executive", "Executive"), ("judicial", "Judicial"), ("legislative", "Legislative")], + help_text="Federal agency type (executive, judicial, legislative, etc.)", + max_length=20, + null=True, + ), + ), + ] diff --git a/src/registrar/models/domain_information.py b/src/registrar/models/domain_information.py index 23c9e4f32..bc35d4e30 100644 --- a/src/registrar/models/domain_information.py +++ b/src/registrar/models/domain_information.py @@ -3,6 +3,8 @@ from django.db import transaction from registrar.models.utility.domain_helper import DomainHelper from registrar.models.utility.generic_helper import CreateOrUpdateOrganizationTypeHelper +from registrar.utility.constants import BranchChoices + from .domain_request import DomainRequest from .utility.time_stamped_model import TimeStampedModel @@ -37,8 +39,6 @@ class DomainInformation(TimeStampedModel): # use the short names in Django admin OrganizationChoices = DomainRequest.OrganizationChoices - BranchChoices = DomainRequest.BranchChoices - federal_agency = models.ForeignKey( "registrar.FederalAgency", on_delete=models.PROTECT, diff --git a/src/registrar/models/domain_request.py b/src/registrar/models/domain_request.py index d00841041..46df4bc30 100644 --- a/src/registrar/models/domain_request.py +++ b/src/registrar/models/domain_request.py @@ -12,6 +12,7 @@ from registrar.models.domain import Domain from registrar.models.federal_agency import FederalAgency from registrar.models.utility.generic_helper import CreateOrUpdateOrganizationTypeHelper from registrar.utility.errors import FSMDomainRequestError, FSMErrorCodes +from registrar.utility.constants import BranchChoices from .utility.time_stamped_model import TimeStampedModel from ..utility.email import send_templated_email, EmailSendingError @@ -234,11 +235,6 @@ class DomainRequest(TimeStampedModel): "School district: a school district that is not part of a local government", ) - class BranchChoices(models.TextChoices): - EXECUTIVE = "executive", "Executive" - JUDICIAL = "judicial", "Judicial" - LEGISLATIVE = "legislative", "Legislative" - class RejectionReasons(models.TextChoices): DOMAIN_PURPOSE = "purpose_not_met", "Purpose requirements not met" REQUESTOR = "requestor_not_eligible", "Requestor not eligible to make request" diff --git a/src/registrar/models/federal_agency.py b/src/registrar/models/federal_agency.py index 89b15ab56..cb09d12ac 100644 --- a/src/registrar/models/federal_agency.py +++ b/src/registrar/models/federal_agency.py @@ -1,6 +1,7 @@ from .utility.time_stamped_model import TimeStampedModel from django.db import models import logging +from registrar.utility.constants import BranchChoices logger = logging.getLogger(__name__) @@ -16,6 +17,14 @@ class FederalAgency(TimeStampedModel): help_text="Federal agency", ) + federal_type = models.CharField( + max_length=20, + choices=BranchChoices.choices, + null=True, + blank=True, + help_text="Federal agency type (executive, judicial, legislative, etc.)", + ) + def __str__(self) -> str: return f"{self.agency}" diff --git a/src/registrar/tests/test_models.py b/src/registrar/tests/test_models.py index e791100f1..e42451be9 100644 --- a/src/registrar/tests/test_models.py +++ b/src/registrar/tests/test_models.py @@ -19,6 +19,8 @@ from registrar.models import ( import boto3_mocking from registrar.models.transition_domain import TransitionDomain from registrar.models.verified_by_staff import VerifiedByStaff # type: ignore +from registrar.utility.constants import BranchChoices + from .common import MockSESClient, less_console_noise, completed_domain_request, set_domain_request_investigators from django_fsm import TransitionNotAllowed @@ -124,7 +126,7 @@ class TestDomainRequest(TestCase): creator=user, investigator=user, generic_org_type=DomainRequest.OrganizationChoices.FEDERAL, - federal_type=DomainRequest.BranchChoices.EXECUTIVE, + federal_type=BranchChoices.EXECUTIVE, is_election_board=False, organization_name="Test", address_line1="100 Main St.", @@ -152,7 +154,7 @@ class TestDomainRequest(TestCase): information = DomainInformation.objects.create( creator=user, generic_org_type=DomainInformation.OrganizationChoices.FEDERAL, - federal_type=DomainInformation.BranchChoices.EXECUTIVE, + federal_type=BranchChoices.EXECUTIVE, is_election_board=False, organization_name="Test", address_line1="100 Main St.", diff --git a/src/registrar/utility/constants.py b/src/registrar/utility/constants.py new file mode 100644 index 000000000..9ec5e7d5e --- /dev/null +++ b/src/registrar/utility/constants.py @@ -0,0 +1,7 @@ +from django.db import models + + +class BranchChoices(models.TextChoices): + EXECUTIVE = "executive", "Executive" + JUDICIAL = "judicial", "Judicial" + LEGISLATIVE = "legislative", "Legislative"