diff --git a/docs/architecture/diagrams/models_diagram.md b/docs/architecture/diagrams/models_diagram.md index df0e39b7e..837906934 100644 --- a/docs/architecture/diagrams/models_diagram.md +++ b/docs/architecture/diagrams/models_diagram.md @@ -1,11 +1,15 @@ # Complete model documentation This is an auto-generated diagram of our data models generated with the -[django-model2puml](https://github.com/sen-den/django-model2puml) library -using the command +[django-model2puml](https://github.com/sen-den/django-model2puml) library. + +## 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 -$ 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) @@ -13,12 +17,19 @@ $ docker compose app ./manage.py generate_puml --include registrar
PlantUML source code -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 -$ 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 @startuml class "registrar.Contact " as registrar.Contact #d6f4e9 { @@ -28,17 +39,97 @@ class "registrar.Contact " as registrar.Contact #d6f4e9 { + created_at (DateTimeField) + updated_at (DateTimeField) ~ user (OneToOneField) - + first_name (TextField) - + middle_name (TextField) - + last_name (TextField) - + title (TextField) - + email (TextField) + + first_name (CharField) + + middle_name (CharField) + + last_name (CharField) + + title (CharField) + + email (EmailField) + phone (PhoneNumberField) -- } registrar.Contact -- registrar.User +class "registrar.Host " as registrar.Host #d6f4e9 { + host + -- + + id (BigAutoField) + + created_at (DateTimeField) + + updated_at (DateTimeField) + + name (CharField) + ~ domain (ForeignKey) + -- +} +registrar.Host -- registrar.Domain + + +class "registrar.HostIP " 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 " 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 " 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 " as registrar.FederalAgency #d6f4e9 { + Federal agency + -- + + id (BigAutoField) + + created_at (DateTimeField) + + updated_at (DateTimeField) + + agency (CharField) + -- +} + + class "registrar.DomainRequest " as registrar.DomainRequest #d6f4e9 { domain request -- @@ -46,24 +137,25 @@ class "registrar.DomainRequest " as registrar.DomainRequest #d6f4e9 { + created_at (DateTimeField) + updated_at (DateTimeField) + status (FSMField) + + rejection_reason (TextField) + ~ federal_agency (ForeignKey) ~ creator (ForeignKey) ~ investigator (ForeignKey) + + generic_org_type (CharField) + + is_election_board (BooleanField) + organization_type (CharField) + federally_recognized_tribe (BooleanField) + state_recognized_tribe (BooleanField) - + tribe_name (TextField) - + federal_agency (TextField) + + tribe_name (CharField) + federal_type (CharField) - + is_election_board (BooleanField) - + organization_name (TextField) - + address_line1 (TextField) + + organization_name (CharField) + + address_line1 (CharField) + address_line2 (CharField) - + city (TextField) + + city (CharField) + state_territory (CharField) + zipcode (CharField) - + urbanization (TextField) - + type_of_work (TextField) - + more_organization_information (TextField) + + urbanization (CharField) + + about_your_organization (TextField) ~ authorizing_official (ForeignKey) ~ approved_domain (OneToOneField) ~ requested_domain (OneToOneField) @@ -71,17 +163,23 @@ class "registrar.DomainRequest " as registrar.DomainRequest #d6f4e9 { + purpose (TextField) + no_other_contacts_rationale (TextField) + anything_else (TextField) + + has_anything_else_text (BooleanField) + + cisa_representative_email (EmailField) + + has_cisa_representative (BooleanField) + is_policy_acknowledged (BooleanField) + + submission_date (DateField) + + notes (TextField) # current_websites (ManyToManyField) # alternative_domains (ManyToManyField) # other_contacts (ManyToManyField) -- } +registrar.DomainRequest -- registrar.FederalAgency registrar.DomainRequest -- registrar.User registrar.DomainRequest -- registrar.User registrar.DomainRequest -- registrar.Contact -registrar.DomainRequest -- registrar.DraftDomain registrar.DomainRequest -- registrar.Domain +registrar.DomainRequest -- registrar.DraftDomain registrar.DomainRequest -- registrar.Contact registrar.DomainRequest *--* registrar.Website registrar.DomainRequest *--* registrar.Website @@ -94,35 +192,37 @@ class "registrar.DomainInformation " as registrar.DomainInformation # + id (BigAutoField) + created_at (DateTimeField) + updated_at (DateTimeField) + ~ federal_agency (ForeignKey) ~ creator (ForeignKey) ~ domain_request (OneToOneField) + + generic_org_type (CharField) + organization_type (CharField) + federally_recognized_tribe (BooleanField) + state_recognized_tribe (BooleanField) - + tribe_name (TextField) - + federal_agency (TextField) + + tribe_name (CharField) + federal_type (CharField) + is_election_board (BooleanField) - + organization_name (TextField) - + address_line1 (TextField) + + organization_name (CharField) + + address_line1 (CharField) + address_line2 (CharField) - + city (TextField) + + city (CharField) + state_territory (CharField) + zipcode (CharField) - + urbanization (TextField) - + type_of_work (TextField) - + more_organization_information (TextField) + + urbanization (CharField) + + about_your_organization (TextField) ~ authorizing_official (ForeignKey) ~ domain (OneToOneField) ~ submitter (ForeignKey) + purpose (TextField) + no_other_contacts_rationale (TextField) + anything_else (TextField) + + cisa_representative_email (EmailField) + is_policy_acknowledged (BooleanField) - + security_email (EmailField) + + notes (TextField) # other_contacts (ManyToManyField) -- } +registrar.DomainInformation -- registrar.FederalAgency registrar.DomainInformation -- registrar.User registrar.DomainInformation -- registrar.DomainRequest registrar.DomainInformation -- registrar.Contact @@ -142,43 +242,6 @@ class "registrar.DraftDomain " as registrar.DraftDomain #d6f4e9 { } -class "registrar.Domain " as registrar.Domain #d6f4e9 { - domain - -- - + id (BigAutoField) - + created_at (DateTimeField) - + updated_at (DateTimeField) - + name (CharField) - -- -} - - -class "registrar.HostIP " 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 " as registrar.Host #d6f4e9 { - host - -- - + id (BigAutoField) - + created_at (DateTimeField) - + updated_at (DateTimeField) - + name (CharField) - ~ domain (ForeignKey) - -- -} -registrar.Host -- registrar.Domain - - class "registrar.UserDomainRole " as registrar.UserDomainRole #d6f4e9 { user domain role -- @@ -208,47 +271,49 @@ class "registrar.DomainInvitation " as registrar.DomainInvitation #d6 registrar.DomainInvitation -- registrar.Domain -class "registrar.Nameserver " as registrar.Nameserver #d6f4e9 { - nameserver +class "registrar.TransitionDomain " as registrar.TransitionDomain #d6f4e9 { + transition domain -- + id (BigAutoField) + created_at (DateTimeField) + updated_at (DateTimeField) - + name (CharField) - ~ domain (ForeignKey) - ~ host_ptr (OneToOneField) + + username (CharField) + + domain_name (CharField) + + 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 " as registrar.PublicContact #d6f4e9 { - public contact +class "registrar.VerifiedByStaff " as registrar.VerifiedByStaff #d6f4e9 { + verified by staff -- + id (BigAutoField) + created_at (DateTimeField) + updated_at (DateTimeField) - + contact_type (CharField) - + registry_id (CharField) - ~ domain (ForeignKey) - + 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) + + email (EmailField) + ~ requestor (ForeignKey) + + notes (TextField) -- } - -registrar.PublicContact -- registrar.Domain +registrar.VerifiedByStaff -- registrar.User class "registrar.User " as registrar.User #d6f4e9 { @@ -265,7 +330,11 @@ class "registrar.User " as registrar.User #d6f4e9 { + is_staff (BooleanField) + is_active (BooleanField) + date_joined (DateTimeField) + + status (CharField) + phone (PhoneNumberField) + + middle_name (CharField) + + title (CharField) + + verification_type (CharField) # groups (ManyToManyField) # user_permissions (ManyToManyField) # domains (ManyToManyField) @@ -274,6 +343,17 @@ class "registrar.User " as registrar.User #d6f4e9 { registrar.User *--* registrar.Domain +class "registrar.UserGroup " as registrar.UserGroup #d6f4e9 { + User group + -- + - id (AutoField) + + name (CharField) + ~ group_ptr (OneToOneField) + # permissions (ManyToManyField) + -- +} + + class "registrar.Website " as registrar.Website #d6f4e9 { website -- @@ -285,6 +365,29 @@ class "registrar.Website " as registrar.Website #d6f4e9 { } +class "registrar.WaffleFlag " 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 ``` diff --git a/docs/architecture/diagrams/models_diagram.svg b/docs/architecture/diagrams/models_diagram.svg index 49999454c..3fbc7dc10 100644 --- a/docs/architecture/diagrams/models_diagram.svg +++ b/docs/architecture/diagrams/models_diagram.svg @@ -1 +1 @@ -registrarregistrar.ContactRegistrarcontactid (BigAutoField)created_at (DateTimeField)updated_at (DateTimeField)user (OneToOneField)first_name (TextField)middle_name (TextField)last_name (TextField)title (TextField)email (TextField)phone (PhoneNumberField)registrar.UserRegistraruserid (BigAutoField)password (CharField)last_login (DateTimeField)is_superuser (BooleanField)username (CharField)first_name (CharField)last_name (CharField)email (EmailField)is_staff (BooleanField)is_active (BooleanField)date_joined (DateTimeField)phone (PhoneNumberField)groups (ManyToManyField)user_permissions (ManyToManyField)domains (ManyToManyField)registrar.DomainRequestRegistrardomain requestid (BigAutoField)created_at (DateTimeField)updated_at (DateTimeField)status (FSMField)creator (ForeignKey)investigator (ForeignKey)organization_type (CharField)federally_recognized_tribe (BooleanField)state_recognized_tribe (BooleanField)tribe_name (TextField)federal_agency (TextField)federal_type (CharField)is_election_board (BooleanField)organization_name (TextField)address_line1 (TextField)address_line2 (CharField)city (TextField)state_territory (CharField)zipcode (CharField)urbanization (TextField)type_of_work (TextField)more_organization_information (TextField)authorizing_official (ForeignKey)approved_domain (OneToOneField)requested_domain (OneToOneField)submitter (ForeignKey)purpose (TextField)no_other_contacts_rationale (TextField)anything_else (TextField)is_policy_acknowledged (BooleanField)current_websites (ManyToManyField)alternative_domains (ManyToManyField)other_contacts (ManyToManyField)registrar.DraftDomainRegistrardraft domainid (BigAutoField)created_at (DateTimeField)updated_at (DateTimeField)name (CharField)registrar.DomainRegistrardomainid (BigAutoField)created_at (DateTimeField)updated_at (DateTimeField)name (CharField)registrar.WebsiteRegistrarwebsiteid (BigAutoField)created_at (DateTimeField)updated_at (DateTimeField)website (CharField)registrar.DomainInformationRegistrardomain informationid (BigAutoField)created_at (DateTimeField)updated_at (DateTimeField)creator (ForeignKey)domain_request (OneToOneField)organization_type (CharField)federally_recognized_tribe (BooleanField)state_recognized_tribe (BooleanField)tribe_name (TextField)federal_agency (TextField)federal_type (CharField)is_election_board (BooleanField)organization_name (TextField)address_line1 (TextField)address_line2 (CharField)city (TextField)state_territory (CharField)zipcode (CharField)urbanization (TextField)type_of_work (TextField)more_organization_information (TextField)authorizing_official (ForeignKey)domain (OneToOneField)submitter (ForeignKey)purpose (TextField)no_other_contacts_rationale (TextField)anything_else (TextField)is_policy_acknowledged (BooleanField)security_email (EmailField)other_contacts (ManyToManyField)registrar.HostIPRegistrarhost ipid (BigAutoField)created_at (DateTimeField)updated_at (DateTimeField)address (CharField)host (ForeignKey)registrar.HostRegistrarhostid (BigAutoField)created_at (DateTimeField)updated_at (DateTimeField)name (CharField)domain (ForeignKey)registrar.UserDomainRoleRegistraruser domain roleid (BigAutoField)created_at (DateTimeField)updated_at (DateTimeField)user (ForeignKey)domain (ForeignKey)role (TextField)registrar.DomainInvitationRegistrardomain invitationid (BigAutoField)created_at (DateTimeField)updated_at (DateTimeField)email (EmailField)domain (ForeignKey)status (FSMField)registrar.NameserverRegistrarnameserverid (BigAutoField)created_at (DateTimeField)updated_at (DateTimeField)name (CharField)domain (ForeignKey)host_ptr (OneToOneField)registrar.PublicContactRegistrarpublic contactid (BigAutoField)created_at (DateTimeField)updated_at (DateTimeField)contact_type (CharField)registry_id (CharField)domain (ForeignKey)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) \ No newline at end of file +registrarregistrar.ContactRegistrarcontactid (BigAutoField)created_at (DateTimeField)updated_at (DateTimeField)user (OneToOneField)first_name (CharField)middle_name (CharField)last_name (CharField)title (CharField)email (EmailField)phone (PhoneNumberField)registrar.UserRegistraruserid (BigAutoField)password (CharField)last_login (DateTimeField)is_superuser (BooleanField)username (CharField)first_name (CharField)last_name (CharField)email (EmailField)is_staff (BooleanField)is_active (BooleanField)date_joined (DateTimeField)status (CharField)phone (PhoneNumberField)middle_name (CharField)title (CharField)verification_type (CharField)groups (ManyToManyField)user_permissions (ManyToManyField)domains (ManyToManyField)registrar.HostRegistrarhostid (BigAutoField)created_at (DateTimeField)updated_at (DateTimeField)name (CharField)domain (ForeignKey)registrar.DomainRegistrardomainid (BigAutoField)created_at (DateTimeField)updated_at (DateTimeField)name (DomainField)state (FSMField)expiration_date (DateField)security_contact_registry_id (TextField)deleted (DateField)first_ready (DateField)registrar.HostIPRegistrarhost ipid (BigAutoField)created_at (DateTimeField)updated_at (DateTimeField)address (CharField)host (ForeignKey)registrar.PublicContactRegistrarpublic contactid (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.FederalAgencyRegistrarFederal agencyid (BigAutoField)created_at (DateTimeField)updated_at (DateTimeField)agency (CharField)registrar.DomainRequestRegistrardomain requestid (BigAutoField)created_at (DateTimeField)updated_at (DateTimeField)status (FSMField)rejection_reason (TextField)federal_agency (ForeignKey)creator (ForeignKey)investigator (ForeignKey)generic_org_type (CharField)is_election_board (BooleanField)organization_type (CharField)federally_recognized_tribe (BooleanField)state_recognized_tribe (BooleanField)tribe_name (CharField)federal_type (CharField)organization_name (CharField)address_line1 (CharField)address_line2 (CharField)city (CharField)state_territory (CharField)zipcode (CharField)urbanization (CharField)about_your_organization (TextField)authorizing_official (ForeignKey)approved_domain (OneToOneField)requested_domain (OneToOneField)submitter (ForeignKey)purpose (TextField)no_other_contacts_rationale (TextField)anything_else (TextField)has_anything_else_text (BooleanField)cisa_representative_email (EmailField)has_cisa_representative (BooleanField)is_policy_acknowledged (BooleanField)submission_date (DateField)notes (TextField)current_websites (ManyToManyField)alternative_domains (ManyToManyField)other_contacts (ManyToManyField)registrar.DraftDomainRegistrardraft domainid (BigAutoField)created_at (DateTimeField)updated_at (DateTimeField)name (CharField)registrar.WebsiteRegistrarwebsiteid (BigAutoField)created_at (DateTimeField)updated_at (DateTimeField)website (CharField)registrar.DomainInformationRegistrardomain informationid (BigAutoField)created_at (DateTimeField)updated_at (DateTimeField)federal_agency (ForeignKey)creator (ForeignKey)domain_request (OneToOneField)generic_org_type (CharField)organization_type (CharField)federally_recognized_tribe (BooleanField)state_recognized_tribe (BooleanField)tribe_name (CharField)federal_type (CharField)is_election_board (BooleanField)organization_name (CharField)address_line1 (CharField)address_line2 (CharField)city (CharField)state_territory (CharField)zipcode (CharField)urbanization (CharField)about_your_organization (TextField)authorizing_official (ForeignKey)domain (OneToOneField)submitter (ForeignKey)purpose (TextField)no_other_contacts_rationale (TextField)anything_else (TextField)cisa_representative_email (EmailField)is_policy_acknowledged (BooleanField)notes (TextField)other_contacts (ManyToManyField)registrar.UserDomainRoleRegistraruser domain roleid (BigAutoField)created_at (DateTimeField)updated_at (DateTimeField)user (ForeignKey)domain (ForeignKey)role (TextField)registrar.DomainInvitationRegistrardomain invitationid (BigAutoField)created_at (DateTimeField)updated_at (DateTimeField)email (EmailField)domain (ForeignKey)status (FSMField)registrar.TransitionDomainRegistrartransition domainid (BigAutoField)created_at (DateTimeField)updated_at (DateTimeField)username (CharField)domain_name (CharField)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.VerifiedByStaffRegistrarverified by staffid (BigAutoField)created_at (DateTimeField)updated_at (DateTimeField)email (EmailField)requestor (ForeignKey)notes (TextField)registrar.UserGroupRegistrarUser groupid (AutoField)name (CharField)group_ptr (OneToOneField)permissions (ManyToManyField)registrar.WaffleFlagRegistrarwaffle flagid (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) \ No newline at end of file diff --git a/src/registrar/fixtures_users.py b/src/registrar/fixtures_users.py index c31acacfd..2aa9d224b 100644 --- a/src/registrar/fixtures_users.py +++ b/src/registrar/fixtures_users.py @@ -106,6 +106,12 @@ class UserFixture: "last_name": "Orr", "email": "riley+320@truss.works", }, + { + "username": "76612d84-66b0-4ae9-9870-81e98b9858b6", + "first_name": "Anna", + "last_name": "Gingle", + "email": "annagingle@truss.works", + }, ] STAFF = [ @@ -194,6 +200,12 @@ class UserFixture: "last_name": "Orr-Analyst", "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): diff --git a/src/registrar/models/domain_request.py b/src/registrar/models/domain_request.py index b2e1b93e4..72aad40b6 100644 --- a/src/registrar/models/domain_request.py +++ b/src/registrar/models/domain_request.py @@ -1080,6 +1080,8 @@ class DomainRequest(TimeStampedModel): is_complete = self._is_city_complete() case DomainRequest.OrganizationChoices.SPECIAL_DISTRICT: is_complete = self._is_special_district_complete() + case DomainRequest.OrganizationChoices.SCHOOL_DISTRICT: + is_complete = True case _: # NOTE: Shouldn't happen, this is only if somehow they didn't choose an org type is_complete = False