mirror of
https://github.com/cisagov/manage.get.gov.git
synced 2025-05-17 18:09:25 +02:00
Merge remote-tracking branch 'origin/main' into nl/1895-CISA-regions-questions-domain-req
This commit is contained in:
commit
e0f9c2bac0
33 changed files with 1552 additions and 245 deletions
|
@ -9,6 +9,7 @@ from django.db import models
|
|||
from django_fsm import FSMField, transition # type: ignore
|
||||
from django.utils import timezone
|
||||
from registrar.models.domain import Domain
|
||||
from registrar.models.utility.generic_helper import CreateOrUpdateOrganizationTypeHelper
|
||||
from registrar.utility.errors import FSMDomainRequestError, FSMErrorCodes
|
||||
|
||||
from .utility.time_stamped_model import TimeStampedModel
|
||||
|
@ -100,8 +101,8 @@ class DomainRequest(TimeStampedModel):
|
|||
class OrganizationChoices(models.TextChoices):
|
||||
"""
|
||||
Primary organization choices:
|
||||
For use in django admin
|
||||
Keys need to match OrganizationChoicesVerbose
|
||||
For use in the domain request experience
|
||||
Keys need to match OrgChoicesElectionOffice and OrganizationChoicesVerbose
|
||||
"""
|
||||
|
||||
FEDERAL = "federal", "Federal"
|
||||
|
@ -113,9 +114,77 @@ class DomainRequest(TimeStampedModel):
|
|||
SPECIAL_DISTRICT = "special_district", "Special district"
|
||||
SCHOOL_DISTRICT = "school_district", "School district"
|
||||
|
||||
class OrgChoicesElectionOffice(models.TextChoices):
|
||||
"""
|
||||
Primary organization choices for Django admin:
|
||||
Keys need to match OrganizationChoices and OrganizationChoicesVerbose.
|
||||
|
||||
The enums here come in two variants:
|
||||
Regular (matches the choices from OrganizationChoices)
|
||||
Election (Appends " - Election" to the string)
|
||||
|
||||
When adding the election variant, you must append "_election" to the end of the string.
|
||||
"""
|
||||
|
||||
# We can't inherit OrganizationChoices due to models.TextChoices being an enum.
|
||||
# We can redefine these values instead.
|
||||
FEDERAL = "federal", "Federal"
|
||||
INTERSTATE = "interstate", "Interstate"
|
||||
STATE_OR_TERRITORY = "state_or_territory", "State or territory"
|
||||
TRIBAL = "tribal", "Tribal"
|
||||
COUNTY = "county", "County"
|
||||
CITY = "city", "City"
|
||||
SPECIAL_DISTRICT = "special_district", "Special district"
|
||||
SCHOOL_DISTRICT = "school_district", "School district"
|
||||
|
||||
# Election variants
|
||||
STATE_OR_TERRITORY_ELECTION = "state_or_territory_election", "State or territory - Election"
|
||||
TRIBAL_ELECTION = "tribal_election", "Tribal - Election"
|
||||
COUNTY_ELECTION = "county_election", "County - Election"
|
||||
CITY_ELECTION = "city_election", "City - Election"
|
||||
SPECIAL_DISTRICT_ELECTION = "special_district_election", "Special district - Election"
|
||||
|
||||
@classmethod
|
||||
def get_org_election_to_org_generic(cls):
|
||||
"""
|
||||
Creates and returns a dictionary mapping from election-specific organization
|
||||
choice enums to their corresponding general organization choice enums.
|
||||
|
||||
If no such mapping exists, it is simple excluded from the map.
|
||||
"""
|
||||
# This can be mapped automatically but its harder to read.
|
||||
# For clarity reasons, we manually define this.
|
||||
org_election_map = {
|
||||
cls.STATE_OR_TERRITORY_ELECTION: cls.STATE_OR_TERRITORY,
|
||||
cls.TRIBAL_ELECTION: cls.TRIBAL,
|
||||
cls.COUNTY_ELECTION: cls.COUNTY,
|
||||
cls.CITY_ELECTION: cls.CITY,
|
||||
cls.SPECIAL_DISTRICT_ELECTION: cls.SPECIAL_DISTRICT,
|
||||
}
|
||||
return org_election_map
|
||||
|
||||
@classmethod
|
||||
def get_org_generic_to_org_election(cls):
|
||||
"""
|
||||
Creates and returns a dictionary mapping from general organization
|
||||
choice enums to their corresponding election-specific organization enums.
|
||||
|
||||
If no such mapping exists, it is simple excluded from the map.
|
||||
"""
|
||||
# This can be mapped automatically but its harder to read.
|
||||
# For clarity reasons, we manually define this.
|
||||
org_election_map = {
|
||||
cls.STATE_OR_TERRITORY: cls.STATE_OR_TERRITORY_ELECTION,
|
||||
cls.TRIBAL: cls.TRIBAL_ELECTION,
|
||||
cls.COUNTY: cls.COUNTY_ELECTION,
|
||||
cls.CITY: cls.CITY_ELECTION,
|
||||
cls.SPECIAL_DISTRICT: cls.SPECIAL_DISTRICT_ELECTION,
|
||||
}
|
||||
return org_election_map
|
||||
|
||||
class OrganizationChoicesVerbose(models.TextChoices):
|
||||
"""
|
||||
Secondary organization choices
|
||||
Tertiary organization choices
|
||||
For use in the domain request form and on the templates
|
||||
Keys need to match OrganizationChoices
|
||||
"""
|
||||
|
@ -406,6 +475,21 @@ class DomainRequest(TimeStampedModel):
|
|||
help_text="Type of organization",
|
||||
)
|
||||
|
||||
is_election_board = models.BooleanField(
|
||||
null=True,
|
||||
blank=True,
|
||||
help_text="Is your organization an election office?",
|
||||
)
|
||||
|
||||
# TODO - Ticket #1911: stub this data from DomainRequest
|
||||
organization_type = models.CharField(
|
||||
max_length=255,
|
||||
choices=OrgChoicesElectionOffice.choices,
|
||||
null=True,
|
||||
blank=True,
|
||||
help_text="Type of organization - Election office",
|
||||
)
|
||||
|
||||
federally_recognized_tribe = models.BooleanField(
|
||||
null=True,
|
||||
help_text="Is the tribe federally recognized",
|
||||
|
@ -437,18 +521,13 @@ class DomainRequest(TimeStampedModel):
|
|||
help_text="Federal government branch",
|
||||
)
|
||||
|
||||
is_election_board = models.BooleanField(
|
||||
null=True,
|
||||
blank=True,
|
||||
help_text="Is your organization an election office?",
|
||||
)
|
||||
|
||||
organization_name = models.CharField(
|
||||
null=True,
|
||||
blank=True,
|
||||
help_text="Organization name",
|
||||
db_index=True,
|
||||
)
|
||||
|
||||
address_line1 = models.CharField(
|
||||
null=True,
|
||||
blank=True,
|
||||
|
@ -525,6 +604,7 @@ class DomainRequest(TimeStampedModel):
|
|||
related_name="domain_request",
|
||||
on_delete=models.PROTECT,
|
||||
)
|
||||
|
||||
alternative_domains = models.ManyToManyField(
|
||||
"registrar.Website",
|
||||
blank=True,
|
||||
|
@ -592,6 +672,34 @@ class DomainRequest(TimeStampedModel):
|
|||
help_text="Notes about this request",
|
||||
)
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
"""Save override for custom properties"""
|
||||
|
||||
# Define mappings between generic org and election org.
|
||||
# These have to be defined here, as you'd get a cyclical import error
|
||||
# otherwise.
|
||||
|
||||
# For any given organization type, return the "_election" variant.
|
||||
# For example: STATE_OR_TERRITORY => STATE_OR_TERRITORY_ELECTION
|
||||
generic_org_map = self.OrgChoicesElectionOffice.get_org_generic_to_org_election()
|
||||
|
||||
# For any given "_election" variant, return the base org type.
|
||||
# For example: STATE_OR_TERRITORY_ELECTION => STATE_OR_TERRITORY
|
||||
election_org_map = self.OrgChoicesElectionOffice.get_org_election_to_org_generic()
|
||||
|
||||
# Manages the "organization_type" variable and keeps in sync with
|
||||
# "is_election_office" and "generic_organization_type"
|
||||
org_type_helper = CreateOrUpdateOrganizationTypeHelper(
|
||||
sender=self.__class__,
|
||||
instance=self,
|
||||
generic_org_to_org_map=generic_org_map,
|
||||
election_org_to_generic_org_map=election_org_map,
|
||||
)
|
||||
|
||||
# Actually updates the organization_type field
|
||||
org_type_helper.create_or_update_organization_type()
|
||||
super().save(*args, **kwargs)
|
||||
|
||||
def __str__(self):
|
||||
try:
|
||||
if self.requested_domain and self.requested_domain.name:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue