From 4eabb98297072210fa55f0d42582bf343cdd206e Mon Sep 17 00:00:00 2001 From: Rebecca Hsieh Date: Tue, 11 Jun 2024 09:01:47 -0700 Subject: [PATCH 1/4] Add Branchchoices to constants and add in new federal type to federal agency model --- src/registrar/admin.py | 1 + src/registrar/forms/domain_request_wizard.py | 3 ++- .../transfer_transition_domains_to_domains.py | 3 ++- .../0099_federalagency_federal_type.py | 24 +++++++++++++++++++ src/registrar/models/domain_information.py | 4 ++-- src/registrar/models/domain_request.py | 6 +---- src/registrar/models/federal_agency.py | 9 +++++++ src/registrar/tests/test_models.py | 6 +++-- src/utils/constants.py | 7 ++++++ 9 files changed, 52 insertions(+), 11 deletions(-) create mode 100644 src/registrar/migrations/0099_federalagency_federal_type.py create mode 100644 src/utils/constants.py diff --git a/src/registrar/admin.py b/src/registrar/admin.py index 44babc0b1..aa0591b98 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -24,6 +24,7 @@ from registrar.views.utility.mixins import OrderableFieldsMixin from django.contrib.admin.views.main import ORDER_VAR from registrar.widgets import NoAutocompleteFilteredSelectMultiple from . import models +from .models import FederalAgency from auditlog.models import LogEntry # type: ignore from auditlog.admin import LogEntryAdmin # type: ignore from django_fsm import TransitionNotAllowed # type: ignore diff --git a/src/registrar/forms/domain_request_wizard.py b/src/registrar/forms/domain_request_wizard.py index 0e9e87f9d..c55fc61f6 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 utils.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..2c11965ae 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 utils.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..b9854e815 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 utils.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..8f0c34384 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 utils.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..b1f1ea9e4 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 utils.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..fd4711deb 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 utils.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/utils/constants.py b/src/utils/constants.py new file mode 100644 index 000000000..9ec5e7d5e --- /dev/null +++ b/src/utils/constants.py @@ -0,0 +1,7 @@ +from django.db import models + + +class BranchChoices(models.TextChoices): + EXECUTIVE = "executive", "Executive" + JUDICIAL = "judicial", "Judicial" + LEGISLATIVE = "legislative", "Legislative" From bc82137a0ed1c2f66a8e48b3563559bdcef7a674 Mon Sep 17 00:00:00 2001 From: Rebecca Hsieh Date: Tue, 11 Jun 2024 09:13:32 -0700 Subject: [PATCH 2/4] Remove unused import --- src/registrar/admin.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/registrar/admin.py b/src/registrar/admin.py index aa0591b98..44babc0b1 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -24,7 +24,6 @@ from registrar.views.utility.mixins import OrderableFieldsMixin from django.contrib.admin.views.main import ORDER_VAR from registrar.widgets import NoAutocompleteFilteredSelectMultiple from . import models -from .models import FederalAgency from auditlog.models import LogEntry # type: ignore from auditlog.admin import LogEntryAdmin # type: ignore from django_fsm import TransitionNotAllowed # type: ignore From 030d254c00b685d2c4b8a7cbf266655ca378f107 Mon Sep 17 00:00:00 2001 From: Rebecca Hsieh Date: Tue, 11 Jun 2024 10:06:41 -0700 Subject: [PATCH 3/4] Fix utility placement --- src/registrar/models/domain_request.py | 2 +- src/registrar/models/federal_agency.py | 2 +- src/registrar/tests/test_models.py | 2 +- src/{utils => registrar/utility}/constants.py | 0 4 files changed, 3 insertions(+), 3 deletions(-) rename src/{utils => registrar/utility}/constants.py (100%) diff --git a/src/registrar/models/domain_request.py b/src/registrar/models/domain_request.py index 8f0c34384..46df4bc30 100644 --- a/src/registrar/models/domain_request.py +++ b/src/registrar/models/domain_request.py @@ -12,7 +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 utils.constants import BranchChoices +from registrar.utility.constants import BranchChoices from .utility.time_stamped_model import TimeStampedModel from ..utility.email import send_templated_email, EmailSendingError diff --git a/src/registrar/models/federal_agency.py b/src/registrar/models/federal_agency.py index b1f1ea9e4..cb09d12ac 100644 --- a/src/registrar/models/federal_agency.py +++ b/src/registrar/models/federal_agency.py @@ -1,7 +1,7 @@ from .utility.time_stamped_model import TimeStampedModel from django.db import models import logging -from utils.constants import BranchChoices +from registrar.utility.constants import BranchChoices logger = logging.getLogger(__name__) diff --git a/src/registrar/tests/test_models.py b/src/registrar/tests/test_models.py index fd4711deb..e42451be9 100644 --- a/src/registrar/tests/test_models.py +++ b/src/registrar/tests/test_models.py @@ -19,7 +19,7 @@ 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 utils.constants import BranchChoices +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 diff --git a/src/utils/constants.py b/src/registrar/utility/constants.py similarity index 100% rename from src/utils/constants.py rename to src/registrar/utility/constants.py From fa263db9fb354702382943e06c76e05dfce08733 Mon Sep 17 00:00:00 2001 From: Rebecca Hsieh Date: Tue, 11 Jun 2024 10:11:14 -0700 Subject: [PATCH 4/4] Fix utility --- src/registrar/forms/domain_request_wizard.py | 2 +- .../commands/transfer_transition_domains_to_domains.py | 2 +- src/registrar/models/domain_information.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/registrar/forms/domain_request_wizard.py b/src/registrar/forms/domain_request_wizard.py index c55fc61f6..fc176ce82 100644 --- a/src/registrar/forms/domain_request_wizard.py +++ b/src/registrar/forms/domain_request_wizard.py @@ -16,7 +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 utils.constants import BranchChoices +from registrar.utility.constants import BranchChoices logger = logging.getLogger(__name__) 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 2c11965ae..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,7 +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 utils.constants import BranchChoices +from registrar.utility.constants import BranchChoices logger = logging.getLogger(__name__) diff --git a/src/registrar/models/domain_information.py b/src/registrar/models/domain_information.py index b9854e815..bc35d4e30 100644 --- a/src/registrar/models/domain_information.py +++ b/src/registrar/models/domain_information.py @@ -3,7 +3,7 @@ from django.db import transaction from registrar.models.utility.domain_helper import DomainHelper from registrar.models.utility.generic_helper import CreateOrUpdateOrganizationTypeHelper -from utils.constants import BranchChoices +from registrar.utility.constants import BranchChoices from .domain_request import DomainRequest from .utility.time_stamped_model import TimeStampedModel