Merge branch 'main' into za/2166-domain-request-csv-report

This commit is contained in:
zandercymatics 2024-06-11 12:23:34 -06:00
commit 194accd90e
No known key found for this signature in database
GPG key ID: FF4636ABEC9682B7
4 changed files with 211 additions and 94 deletions

View file

@ -1,11 +1,15 @@
# Complete model documentation # Complete model documentation
This is an auto-generated diagram of our data models generated with the This is an auto-generated diagram of our data models generated with the
[django-model2puml](https://github.com/sen-den/django-model2puml) library [django-model2puml](https://github.com/sen-den/django-model2puml) library.
using the command
## How to generate the puml
1. Uncomment `puml_generator` from `INSTALLED_APPS` in settings.py and docker-compose down and up
2. Run the following command to generate a puml file
```bash ```bash
$ docker compose app ./manage.py generate_puml --include registrar docker compose exec app ./manage.py generate_puml --include registrar
``` ```
![Complete data models diagram](./models_diagram.svg) ![Complete data models diagram](./models_diagram.svg)
@ -13,12 +17,19 @@ $ docker compose app ./manage.py generate_puml --include registrar
<details> <details>
<summary>PlantUML source code</summary> <summary>PlantUML source code</summary>
To regenerate this image using Docker, run ## How To regenerate the database svg image
1. Copy your puml file contents into the bottom of this file and replace the current code marked by `plantuml`
2. Run the following command
```bash ```bash
$ docker run -v $(pwd):$(pwd) -w $(pwd) -it plantuml/plantuml -tsvg models_diagram.md docker run -v $(pwd):$(pwd) -w $(pwd) -it plantuml/plantuml -tsvg models_diagram.md
``` ```
3. Remove the puml file from earlier (if you still have it)
4. Commit the new image and the md file
```plantuml ```plantuml
@startuml @startuml
class "registrar.Contact <Registrar>" as registrar.Contact #d6f4e9 { class "registrar.Contact <Registrar>" as registrar.Contact #d6f4e9 {
@ -28,17 +39,97 @@ class "registrar.Contact <Registrar>" as registrar.Contact #d6f4e9 {
+ created_at (DateTimeField) + created_at (DateTimeField)
+ updated_at (DateTimeField) + updated_at (DateTimeField)
~ user (OneToOneField) ~ user (OneToOneField)
+ first_name (TextField) + first_name (CharField)
+ middle_name (TextField) + middle_name (CharField)
+ last_name (TextField) + last_name (CharField)
+ title (TextField) + title (CharField)
+ email (TextField) + email (EmailField)
+ phone (PhoneNumberField) + phone (PhoneNumberField)
-- --
} }
registrar.Contact -- registrar.User registrar.Contact -- registrar.User
class "registrar.Host <Registrar>" as registrar.Host #d6f4e9 {
host
--
+ id (BigAutoField)
+ created_at (DateTimeField)
+ updated_at (DateTimeField)
+ name (CharField)
~ domain (ForeignKey)
--
}
registrar.Host -- registrar.Domain
class "registrar.HostIP <Registrar>" as registrar.HostIP #d6f4e9 {
host ip
--
+ id (BigAutoField)
+ created_at (DateTimeField)
+ updated_at (DateTimeField)
+ address (CharField)
~ host (ForeignKey)
--
}
registrar.HostIP -- registrar.Host
class "registrar.PublicContact <Registrar>" as registrar.PublicContact #d6f4e9 {
public contact
--
+ id (BigAutoField)
+ created_at (DateTimeField)
+ updated_at (DateTimeField)
+ contact_type (CharField)
+ registry_id (CharField)
~ domain (ForeignKey)
+ name (CharField)
+ org (CharField)
+ street1 (CharField)
+ street2 (CharField)
+ street3 (CharField)
+ city (CharField)
+ sp (CharField)
+ pc (CharField)
+ cc (CharField)
+ email (EmailField)
+ voice (CharField)
+ fax (CharField)
+ pw (CharField)
--
}
registrar.PublicContact -- registrar.Domain
class "registrar.Domain <Registrar>" as registrar.Domain #d6f4e9 {
domain
--
+ id (BigAutoField)
+ created_at (DateTimeField)
+ updated_at (DateTimeField)
+ name (DomainField)
+ state (FSMField)
+ expiration_date (DateField)
+ security_contact_registry_id (TextField)
+ deleted (DateField)
+ first_ready (DateField)
--
}
class "registrar.FederalAgency <Registrar>" as registrar.FederalAgency #d6f4e9 {
Federal agency
--
+ id (BigAutoField)
+ created_at (DateTimeField)
+ updated_at (DateTimeField)
+ agency (CharField)
--
}
class "registrar.DomainRequest <Registrar>" as registrar.DomainRequest #d6f4e9 { class "registrar.DomainRequest <Registrar>" as registrar.DomainRequest #d6f4e9 {
domain request domain request
-- --
@ -46,24 +137,25 @@ class "registrar.DomainRequest <Registrar>" as registrar.DomainRequest #d6f4e9 {
+ created_at (DateTimeField) + created_at (DateTimeField)
+ updated_at (DateTimeField) + updated_at (DateTimeField)
+ status (FSMField) + status (FSMField)
+ rejection_reason (TextField)
~ federal_agency (ForeignKey)
~ creator (ForeignKey) ~ creator (ForeignKey)
~ investigator (ForeignKey) ~ investigator (ForeignKey)
+ generic_org_type (CharField)
+ is_election_board (BooleanField)
+ organization_type (CharField) + organization_type (CharField)
+ federally_recognized_tribe (BooleanField) + federally_recognized_tribe (BooleanField)
+ state_recognized_tribe (BooleanField) + state_recognized_tribe (BooleanField)
+ tribe_name (TextField) + tribe_name (CharField)
+ federal_agency (TextField)
+ federal_type (CharField) + federal_type (CharField)
+ is_election_board (BooleanField) + organization_name (CharField)
+ organization_name (TextField) + address_line1 (CharField)
+ address_line1 (TextField)
+ address_line2 (CharField) + address_line2 (CharField)
+ city (TextField) + city (CharField)
+ state_territory (CharField) + state_territory (CharField)
+ zipcode (CharField) + zipcode (CharField)
+ urbanization (TextField) + urbanization (CharField)
+ type_of_work (TextField) + about_your_organization (TextField)
+ more_organization_information (TextField)
~ authorizing_official (ForeignKey) ~ authorizing_official (ForeignKey)
~ approved_domain (OneToOneField) ~ approved_domain (OneToOneField)
~ requested_domain (OneToOneField) ~ requested_domain (OneToOneField)
@ -71,17 +163,23 @@ class "registrar.DomainRequest <Registrar>" as registrar.DomainRequest #d6f4e9 {
+ purpose (TextField) + purpose (TextField)
+ no_other_contacts_rationale (TextField) + no_other_contacts_rationale (TextField)
+ anything_else (TextField) + anything_else (TextField)
+ has_anything_else_text (BooleanField)
+ cisa_representative_email (EmailField)
+ has_cisa_representative (BooleanField)
+ is_policy_acknowledged (BooleanField) + is_policy_acknowledged (BooleanField)
+ submission_date (DateField)
+ notes (TextField)
# current_websites (ManyToManyField) # current_websites (ManyToManyField)
# alternative_domains (ManyToManyField) # alternative_domains (ManyToManyField)
# other_contacts (ManyToManyField) # other_contacts (ManyToManyField)
-- --
} }
registrar.DomainRequest -- registrar.FederalAgency
registrar.DomainRequest -- registrar.User registrar.DomainRequest -- registrar.User
registrar.DomainRequest -- registrar.User registrar.DomainRequest -- registrar.User
registrar.DomainRequest -- registrar.Contact registrar.DomainRequest -- registrar.Contact
registrar.DomainRequest -- registrar.DraftDomain
registrar.DomainRequest -- registrar.Domain registrar.DomainRequest -- registrar.Domain
registrar.DomainRequest -- registrar.DraftDomain
registrar.DomainRequest -- registrar.Contact registrar.DomainRequest -- registrar.Contact
registrar.DomainRequest *--* registrar.Website registrar.DomainRequest *--* registrar.Website
registrar.DomainRequest *--* registrar.Website registrar.DomainRequest *--* registrar.Website
@ -94,35 +192,37 @@ class "registrar.DomainInformation <Registrar>" as registrar.DomainInformation #
+ id (BigAutoField) + id (BigAutoField)
+ created_at (DateTimeField) + created_at (DateTimeField)
+ updated_at (DateTimeField) + updated_at (DateTimeField)
~ federal_agency (ForeignKey)
~ creator (ForeignKey) ~ creator (ForeignKey)
~ domain_request (OneToOneField) ~ domain_request (OneToOneField)
+ generic_org_type (CharField)
+ organization_type (CharField) + organization_type (CharField)
+ federally_recognized_tribe (BooleanField) + federally_recognized_tribe (BooleanField)
+ state_recognized_tribe (BooleanField) + state_recognized_tribe (BooleanField)
+ tribe_name (TextField) + tribe_name (CharField)
+ federal_agency (TextField)
+ federal_type (CharField) + federal_type (CharField)
+ is_election_board (BooleanField) + is_election_board (BooleanField)
+ organization_name (TextField) + organization_name (CharField)
+ address_line1 (TextField) + address_line1 (CharField)
+ address_line2 (CharField) + address_line2 (CharField)
+ city (TextField) + city (CharField)
+ state_territory (CharField) + state_territory (CharField)
+ zipcode (CharField) + zipcode (CharField)
+ urbanization (TextField) + urbanization (CharField)
+ type_of_work (TextField) + about_your_organization (TextField)
+ more_organization_information (TextField)
~ authorizing_official (ForeignKey) ~ authorizing_official (ForeignKey)
~ domain (OneToOneField) ~ domain (OneToOneField)
~ submitter (ForeignKey) ~ submitter (ForeignKey)
+ purpose (TextField) + purpose (TextField)
+ no_other_contacts_rationale (TextField) + no_other_contacts_rationale (TextField)
+ anything_else (TextField) + anything_else (TextField)
+ cisa_representative_email (EmailField)
+ is_policy_acknowledged (BooleanField) + is_policy_acknowledged (BooleanField)
+ security_email (EmailField) + notes (TextField)
# other_contacts (ManyToManyField) # other_contacts (ManyToManyField)
-- --
} }
registrar.DomainInformation -- registrar.FederalAgency
registrar.DomainInformation -- registrar.User registrar.DomainInformation -- registrar.User
registrar.DomainInformation -- registrar.DomainRequest registrar.DomainInformation -- registrar.DomainRequest
registrar.DomainInformation -- registrar.Contact registrar.DomainInformation -- registrar.Contact
@ -142,43 +242,6 @@ class "registrar.DraftDomain <Registrar>" as registrar.DraftDomain #d6f4e9 {
} }
class "registrar.Domain <Registrar>" as registrar.Domain #d6f4e9 {
domain
--
+ id (BigAutoField)
+ created_at (DateTimeField)
+ updated_at (DateTimeField)
+ name (CharField)
--
}
class "registrar.HostIP <Registrar>" as registrar.HostIP #d6f4e9 {
host ip
--
+ id (BigAutoField)
+ created_at (DateTimeField)
+ updated_at (DateTimeField)
+ address (CharField)
~ host (ForeignKey)
--
}
registrar.HostIP -- registrar.Host
class "registrar.Host <Registrar>" as registrar.Host #d6f4e9 {
host
--
+ id (BigAutoField)
+ created_at (DateTimeField)
+ updated_at (DateTimeField)
+ name (CharField)
~ domain (ForeignKey)
--
}
registrar.Host -- registrar.Domain
class "registrar.UserDomainRole <Registrar>" as registrar.UserDomainRole #d6f4e9 { class "registrar.UserDomainRole <Registrar>" as registrar.UserDomainRole #d6f4e9 {
user domain role user domain role
-- --
@ -208,47 +271,49 @@ class "registrar.DomainInvitation <Registrar>" as registrar.DomainInvitation #d6
registrar.DomainInvitation -- registrar.Domain registrar.DomainInvitation -- registrar.Domain
class "registrar.Nameserver <Registrar>" as registrar.Nameserver #d6f4e9 { class "registrar.TransitionDomain <Registrar>" as registrar.TransitionDomain #d6f4e9 {
nameserver transition domain
-- --
+ id (BigAutoField) + id (BigAutoField)
+ created_at (DateTimeField) + created_at (DateTimeField)
+ updated_at (DateTimeField) + updated_at (DateTimeField)
+ name (CharField) + username (CharField)
~ domain (ForeignKey) + domain_name (CharField)
~ host_ptr (OneToOneField) + status (CharField)
+ email_sent (BooleanField)
+ processed (BooleanField)
+ generic_org_type (CharField)
+ organization_name (CharField)
+ federal_type (CharField)
+ federal_agency (CharField)
+ epp_creation_date (DateField)
+ epp_expiration_date (DateField)
+ first_name (CharField)
+ middle_name (CharField)
+ last_name (CharField)
+ title (CharField)
+ email (EmailField)
+ phone (CharField)
+ address_line (CharField)
+ city (CharField)
+ state_territory (CharField)
+ zipcode (CharField)
-- --
} }
registrar.Nameserver -- registrar.Domain
registrar.Nameserver -- registrar.Host
class "registrar.PublicContact <Registrar>" as registrar.PublicContact #d6f4e9 { class "registrar.VerifiedByStaff <Registrar>" as registrar.VerifiedByStaff #d6f4e9 {
public contact verified by staff
-- --
+ id (BigAutoField) + id (BigAutoField)
+ created_at (DateTimeField) + created_at (DateTimeField)
+ updated_at (DateTimeField) + updated_at (DateTimeField)
+ contact_type (CharField) + email (EmailField)
+ registry_id (CharField) ~ requestor (ForeignKey)
~ domain (ForeignKey) + notes (TextField)
+ name (TextField)
+ org (TextField)
+ street1 (TextField)
+ street2 (TextField)
+ street3 (TextField)
+ city (TextField)
+ sp (TextField)
+ pc (TextField)
+ cc (TextField)
+ email (TextField)
+ voice (TextField)
+ fax (TextField)
+ pw (TextField)
-- --
} }
registrar.VerifiedByStaff -- registrar.User
registrar.PublicContact -- registrar.Domain
class "registrar.User <Registrar>" as registrar.User #d6f4e9 { class "registrar.User <Registrar>" as registrar.User #d6f4e9 {
@ -265,7 +330,11 @@ class "registrar.User <Registrar>" as registrar.User #d6f4e9 {
+ is_staff (BooleanField) + is_staff (BooleanField)
+ is_active (BooleanField) + is_active (BooleanField)
+ date_joined (DateTimeField) + date_joined (DateTimeField)
+ status (CharField)
+ phone (PhoneNumberField) + phone (PhoneNumberField)
+ middle_name (CharField)
+ title (CharField)
+ verification_type (CharField)
# groups (ManyToManyField) # groups (ManyToManyField)
# user_permissions (ManyToManyField) # user_permissions (ManyToManyField)
# domains (ManyToManyField) # domains (ManyToManyField)
@ -274,6 +343,17 @@ class "registrar.User <Registrar>" as registrar.User #d6f4e9 {
registrar.User *--* registrar.Domain registrar.User *--* registrar.Domain
class "registrar.UserGroup <Registrar>" as registrar.UserGroup #d6f4e9 {
User group
--
- id (AutoField)
+ name (CharField)
~ group_ptr (OneToOneField)
# permissions (ManyToManyField)
--
}
class "registrar.Website <Registrar>" as registrar.Website #d6f4e9 { class "registrar.Website <Registrar>" as registrar.Website #d6f4e9 {
website website
-- --
@ -285,6 +365,29 @@ class "registrar.Website <Registrar>" as registrar.Website #d6f4e9 {
} }
class "registrar.WaffleFlag <Registrar>" as registrar.WaffleFlag #d6f4e9 {
waffle flag
--
+ id (BigAutoField)
+ name (CharField)
+ everyone (BooleanField)
+ percent (DecimalField)
+ testing (BooleanField)
+ superusers (BooleanField)
+ staff (BooleanField)
+ authenticated (BooleanField)
+ languages (TextField)
+ rollout (BooleanField)
+ note (TextField)
+ created (DateTimeField)
+ modified (DateTimeField)
# groups (ManyToManyField)
# users (ManyToManyField)
--
}
registrar.WaffleFlag *--* registrar.User
@enduml @enduml
``` ```

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 97 KiB

Before After
Before After

View file

@ -106,6 +106,12 @@ class UserFixture:
"last_name": "Orr", "last_name": "Orr",
"email": "riley+320@truss.works", "email": "riley+320@truss.works",
}, },
{
"username": "76612d84-66b0-4ae9-9870-81e98b9858b6",
"first_name": "Anna",
"last_name": "Gingle",
"email": "annagingle@truss.works",
},
] ]
STAFF = [ STAFF = [
@ -194,6 +200,12 @@ class UserFixture:
"last_name": "Orr-Analyst", "last_name": "Orr-Analyst",
"email": "riley+321@truss.works", "email": "riley+321@truss.works",
}, },
{
"username": "e1e350b1-cfc1-4753-a6cb-3ae6d912f99c",
"first_name": "Anna-Analyst",
"last_name": "Gingle-Analyst",
"email": "annagingle+analyst@truss.works",
},
] ]
def load_users(cls, users, group_name, are_superusers=False): def load_users(cls, users, group_name, are_superusers=False):

View file

@ -1080,6 +1080,8 @@ class DomainRequest(TimeStampedModel):
is_complete = self._is_city_complete() is_complete = self._is_city_complete()
case DomainRequest.OrganizationChoices.SPECIAL_DISTRICT: case DomainRequest.OrganizationChoices.SPECIAL_DISTRICT:
is_complete = self._is_special_district_complete() is_complete = self._is_special_district_complete()
case DomainRequest.OrganizationChoices.SCHOOL_DISTRICT:
is_complete = True
case _: case _:
# NOTE: Shouldn't happen, this is only if somehow they didn't choose an org type # NOTE: Shouldn't happen, this is only if somehow they didn't choose an org type
is_complete = False is_complete = False