From 5d68031dced6c630deaaaaa1832a45eda3278645 Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Wed, 26 Jun 2024 09:37:47 -0600 Subject: [PATCH 01/10] Add fields --- src/registrar/admin.py | 2 + ...ininformation_sub_organization_and_more.py | 62 +++++++++++++++++++ src/registrar/models/domain_information.py | 11 +++- src/registrar/models/domain_request.py | 11 +++- 4 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 src/registrar/migrations/0107_domaininformation_sub_organization_and_more.py diff --git a/src/registrar/admin.py b/src/registrar/admin.py index d1cb287a3..e79990bf8 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -1321,6 +1321,7 @@ class DomainInformationAdmin(ListHeaderAdmin, ImportExportModelAdmin): superuser_only_fields = [ "portfolio", + "sub_organization", ] # DEVELOPER's NOTE: @@ -1621,6 +1622,7 @@ class DomainRequestAdmin(ListHeaderAdmin, ImportExportModelAdmin): superuser_only_fields = [ "portfolio", + "sub_organization", ] # DEVELOPER's NOTE: diff --git a/src/registrar/migrations/0107_domaininformation_sub_organization_and_more.py b/src/registrar/migrations/0107_domaininformation_sub_organization_and_more.py new file mode 100644 index 000000000..69a7e7922 --- /dev/null +++ b/src/registrar/migrations/0107_domaininformation_sub_organization_and_more.py @@ -0,0 +1,62 @@ +# Generated by Django 4.2.10 on 2024-06-26 15:34 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ("registrar", "0106_create_groups_v14"), + ] + + operations = [ + migrations.AddField( + model_name="domaininformation", + name="sub_organization", + field=models.ForeignKey( + blank=True, + help_text="The suborganization that this domain is included under", + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="information_sub_organization", + to="registrar.suborganization", + ), + ), + migrations.AddField( + model_name="domainrequest", + name="sub_organization", + field=models.ForeignKey( + blank=True, + help_text="The suborganization that this domain request is included under", + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="request_sub_organization", + to="registrar.suborganization", + ), + ), + migrations.AlterField( + model_name="domaininformation", + name="portfolio", + field=models.ForeignKey( + blank=True, + help_text="Portfolio associated with this domain", + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="information_portfolio", + to="registrar.portfolio", + ), + ), + migrations.AlterField( + model_name="domainrequest", + name="portfolio", + field=models.ForeignKey( + blank=True, + help_text="Portfolio associated with this domain request", + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="DomainRequest_portfolio", + to="registrar.portfolio", + ), + ), + ] diff --git a/src/registrar/models/domain_information.py b/src/registrar/models/domain_information.py index b6f2dd9a7..aef3461fa 100644 --- a/src/registrar/models/domain_information.py +++ b/src/registrar/models/domain_information.py @@ -63,10 +63,19 @@ class DomainInformation(TimeStampedModel): on_delete=models.PROTECT, null=True, blank=True, - related_name="DomainRequest_portfolio", + related_name="information_portfolio", help_text="Portfolio associated with this domain", ) + sub_organization = models.ForeignKey( + "registrar.Suborganization", + on_delete=models.PROTECT, + null=True, + blank=True, + related_name="information_sub_organization", + help_text="The suborganization that this domain is included under", + ) + domain_request = models.OneToOneField( "registrar.DomainRequest", on_delete=models.PROTECT, diff --git a/src/registrar/models/domain_request.py b/src/registrar/models/domain_request.py index 25b696c2a..685fcd9c8 100644 --- a/src/registrar/models/domain_request.py +++ b/src/registrar/models/domain_request.py @@ -311,10 +311,19 @@ class DomainRequest(TimeStampedModel): on_delete=models.PROTECT, null=True, blank=True, - related_name="DomainInformation_portfolio", + related_name="DomainRequest_portfolio", help_text="Portfolio associated with this domain request", ) + sub_organization = models.ForeignKey( + "registrar.Suborganization", + on_delete=models.PROTECT, + null=True, + blank=True, + related_name="request_sub_organization", + help_text="The suborganization that this domain request is included under", + ) + # This is the domain request user who created this domain request. The contact # information that they gave is in the `submitter` field creator = models.ForeignKey( From 4c3404b8856ef1ada0961d66f08a4e8d4581de07 Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Wed, 26 Jun 2024 10:07:19 -0600 Subject: [PATCH 02/10] Fine tuning --- src/registrar/admin.py | 11 +++++++- ...ininformation_sub_organization_and_more.py | 25 ++++++++++++++++++- src/registrar/models/domain_information.py | 4 +++ src/registrar/models/domain_request.py | 4 +-- 4 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/registrar/admin.py b/src/registrar/admin.py index e79990bf8..5c6ac199e 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -1233,7 +1233,7 @@ class DomainInformationAdmin(ListHeaderAdmin, ImportExportModelAdmin): search_help_text = "Search by domain." fieldsets = [ - (None, {"fields": ["portfolio", "creator", "submitter", "domain_request", "notes"]}), + (None, {"fields": ["portfolio", "sub_organization", "creator", "submitter", "domain_request", "notes"]}), (".gov domain", {"fields": ["domain"]}), ("Contacts", {"fields": ["authorizing_official", "other_contacts", "no_other_contacts_rationale"]}), ("Background info", {"fields": ["anything_else"]}), @@ -1510,6 +1510,7 @@ class DomainRequestAdmin(ListHeaderAdmin, ImportExportModelAdmin): { "fields": [ "portfolio", + "sub_organization", "status", "rejection_reason", "action_needed_reason", @@ -2645,6 +2646,11 @@ class PortfolioAdmin(ListHeaderAdmin): # readonly_fields = [ # "requestor", # ] + # Creates select2 fields (with search bars) + autocomplete_fields = [ + "creator", + "federal_agency", + ] def save_model(self, request, obj, form, change): @@ -2728,6 +2734,9 @@ class DomainGroupAdmin(ListHeaderAdmin, ImportExportModelAdmin): class SuborganizationAdmin(ListHeaderAdmin, ImportExportModelAdmin): list_display = ["name", "portfolio"] + autocomplete_fields = [ + "portfolio", + ] admin.site.unregister(LogEntry) # Unregister the default registration diff --git a/src/registrar/migrations/0107_domaininformation_sub_organization_and_more.py b/src/registrar/migrations/0107_domaininformation_sub_organization_and_more.py index 69a7e7922..d82b2c0e1 100644 --- a/src/registrar/migrations/0107_domaininformation_sub_organization_and_more.py +++ b/src/registrar/migrations/0107_domaininformation_sub_organization_and_more.py @@ -1,4 +1,4 @@ -# Generated by Django 4.2.10 on 2024-06-26 15:34 +# Generated by Django 4.2.10 on 2024-06-26 16:07 from django.db import migrations, models import django.db.models.deletion @@ -47,6 +47,18 @@ class Migration(migrations.Migration): to="registrar.portfolio", ), ), + migrations.AlterField( + model_name="domainrequest", + name="approved_domain", + field=models.OneToOneField( + blank=True, + help_text="Domain associated with this request; will be blank until request is approved", + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="domain_request_approved_domain", + to="registrar.domain", + ), + ), migrations.AlterField( model_name="domainrequest", name="portfolio", @@ -59,4 +71,15 @@ class Migration(migrations.Migration): to="registrar.portfolio", ), ), + migrations.AlterField( + model_name="domainrequest", + name="requested_domain", + field=models.OneToOneField( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="domain_request_requested_domain", + to="registrar.draftdomain", + ), + ), ] diff --git a/src/registrar/models/domain_information.py b/src/registrar/models/domain_information.py index aef3461fa..3cc262387 100644 --- a/src/registrar/models/domain_information.py +++ b/src/registrar/models/domain_information.py @@ -370,6 +370,10 @@ class DomainInformation(TimeStampedModel): # domain_request, if so short circuit the create existing_domain_info = cls.objects.filter(domain_request__id=domain_request.id).first() if existing_domain_info: + logger.info( + f"create_from_da() -> Shortcircuting create on {existing_domain_info}. " + "This record already exists. No values updated!" + ) return existing_domain_info # Get the fields that exist on both DomainRequest and DomainInformation diff --git a/src/registrar/models/domain_request.py b/src/registrar/models/domain_request.py index 685fcd9c8..e5f50c1c7 100644 --- a/src/registrar/models/domain_request.py +++ b/src/registrar/models/domain_request.py @@ -449,7 +449,7 @@ class DomainRequest(TimeStampedModel): null=True, blank=True, help_text="Domain associated with this request; will be blank until request is approved", - related_name="domain_request", + related_name="domain_request_approved_domain", on_delete=models.SET_NULL, ) @@ -457,7 +457,7 @@ class DomainRequest(TimeStampedModel): "DraftDomain", null=True, blank=True, - related_name="domain_request", + related_name="domain_request_requested_domain", on_delete=models.PROTECT, ) From b3904a662a94bea8606e0de5f2df2ab9c955b1b2 Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Wed, 26 Jun 2024 10:12:10 -0600 Subject: [PATCH 03/10] Update admin.py --- src/registrar/admin.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/registrar/admin.py b/src/registrar/admin.py index 5c6ac199e..ff30eb3d8 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -1312,6 +1312,8 @@ class DomainInformationAdmin(ListHeaderAdmin, ImportExportModelAdmin): "authorizing_official", "domain", "submitter", + "portfolio", + "sub_organization" ] # Table ordering @@ -1618,6 +1620,8 @@ class DomainRequestAdmin(ListHeaderAdmin, ImportExportModelAdmin): "creator", "authorizing_official", "investigator", + "portfolio", + "sub_organization", ] filter_horizontal = ("current_websites", "alternative_domains", "other_contacts") @@ -2737,6 +2741,7 @@ class SuborganizationAdmin(ListHeaderAdmin, ImportExportModelAdmin): autocomplete_fields = [ "portfolio", ] + search_fields = ["name"] admin.site.unregister(LogEntry) # Unregister the default registration From 3a46dc0090e26a5175d2b873d9ca92d0de25db2a Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Wed, 26 Jun 2024 10:18:08 -0600 Subject: [PATCH 04/10] Fix bad logic in domaininformationinline Why wasn't this set before?? --- src/registrar/admin.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/registrar/admin.py b/src/registrar/admin.py index ff30eb3d8..dafa17fd2 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -2000,14 +2000,7 @@ class DomainInformationInline(admin.StackedInline): fieldsets = DomainInformationAdmin.fieldsets readonly_fields = DomainInformationAdmin.readonly_fields analyst_readonly_fields = DomainInformationAdmin.analyst_readonly_fields - - autocomplete_fields = [ - "creator", - "domain_request", - "authorizing_official", - "domain", - "submitter", - ] + autocomplete_fields = DomainInformationAdmin.autocomplete_fields def has_change_permission(self, request, obj=None): """Custom has_change_permission override so that we can specify that From 4919e6860645f22628335e9ca81588e2fee92200 Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Wed, 26 Jun 2024 11:34:11 -0600 Subject: [PATCH 05/10] fix unit test --- src/registrar/tests/test_admin.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/registrar/tests/test_admin.py b/src/registrar/tests/test_admin.py index 802974b6e..68eeb4ad5 100644 --- a/src/registrar/tests/test_admin.py +++ b/src/registrar/tests/test_admin.py @@ -2292,6 +2292,7 @@ class TestDomainRequestAdmin(MockEppLib): "action_needed_reason", "federal_agency", "portfolio", + "sub_organization", "creator", "investigator", "generic_org_type", From 08d11fcf85a97ec9b920a2cc045774fc78c3026b Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Wed, 26 Jun 2024 15:21:54 -0600 Subject: [PATCH 06/10] linting --- src/registrar/models/domain_information.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/registrar/models/domain_information.py b/src/registrar/models/domain_information.py index 3cc262387..6a029d3bc 100644 --- a/src/registrar/models/domain_information.py +++ b/src/registrar/models/domain_information.py @@ -371,7 +371,7 @@ class DomainInformation(TimeStampedModel): existing_domain_info = cls.objects.filter(domain_request__id=domain_request.id).first() if existing_domain_info: logger.info( - f"create_from_da() -> Shortcircuting create on {existing_domain_info}. " + f"create_from_da() -> Shortcircuting create on {existing_domain_info}. " "This record already exists. No values updated!" ) return existing_domain_info From fca608727c4e6f9a9a7c48d39f9e2a5f085e5c48 Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Thu, 27 Jun 2024 14:23:53 -0600 Subject: [PATCH 07/10] readd migration --- ...py => 0108_domaininformation_sub_organization_and_more.py} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename src/registrar/migrations/{0107_domaininformation_sub_organization_and_more.py => 0108_domaininformation_sub_organization_and_more.py} (96%) diff --git a/src/registrar/migrations/0107_domaininformation_sub_organization_and_more.py b/src/registrar/migrations/0108_domaininformation_sub_organization_and_more.py similarity index 96% rename from src/registrar/migrations/0107_domaininformation_sub_organization_and_more.py rename to src/registrar/migrations/0108_domaininformation_sub_organization_and_more.py index d82b2c0e1..1c19ac197 100644 --- a/src/registrar/migrations/0107_domaininformation_sub_organization_and_more.py +++ b/src/registrar/migrations/0108_domaininformation_sub_organization_and_more.py @@ -1,4 +1,4 @@ -# Generated by Django 4.2.10 on 2024-06-26 16:07 +# Generated by Django 4.2.10 on 2024-06-27 20:23 from django.db import migrations, models import django.db.models.deletion @@ -7,7 +7,7 @@ import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ - ("registrar", "0106_create_groups_v14"), + ("registrar", "0107_domainrequest_action_needed_reason_email"), ] operations = [ From 686c5515bfb9deeb2d67705e9fa7abe5422868d1 Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Thu, 27 Jun 2024 14:27:03 -0600 Subject: [PATCH 08/10] Update admin.py --- src/registrar/admin.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/registrar/admin.py b/src/registrar/admin.py index e9e821d27..9375d2f5a 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -2155,8 +2155,7 @@ class DomainAdmin(ListHeaderAdmin, ImportExportModelAdmin): ), ) - # this ordering effects the ordering of results - # in autocomplete_fields for domain + # this ordering effects the ordering of results in autocomplete_fields for domain ordering = ["name"] def generic_org_type(self, obj): From 8872b9884a7c0ae552e949cbff4d59df9eec6c56 Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Thu, 27 Jun 2024 14:31:25 -0600 Subject: [PATCH 09/10] Lint --- src/registrar/admin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/registrar/admin.py b/src/registrar/admin.py index 9375d2f5a..17154b63b 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -1314,7 +1314,7 @@ class DomainInformationAdmin(ListHeaderAdmin, ImportExportModelAdmin): "domain", "submitter", "portfolio", - "sub_organization" + "sub_organization", ] # Table ordering From a5f14137e8ef3bf9d4106e3eb55775595df2a353 Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Tue, 2 Jul 2024 10:59:59 -0600 Subject: [PATCH 10/10] Regen migrations after merge --- ...py => 0109_domaininformation_sub_organization_and_more.py} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename src/registrar/migrations/{0108_domaininformation_sub_organization_and_more.py => 0109_domaininformation_sub_organization_and_more.py} (95%) diff --git a/src/registrar/migrations/0108_domaininformation_sub_organization_and_more.py b/src/registrar/migrations/0109_domaininformation_sub_organization_and_more.py similarity index 95% rename from src/registrar/migrations/0108_domaininformation_sub_organization_and_more.py rename to src/registrar/migrations/0109_domaininformation_sub_organization_and_more.py index 1c19ac197..03d0493ef 100644 --- a/src/registrar/migrations/0108_domaininformation_sub_organization_and_more.py +++ b/src/registrar/migrations/0109_domaininformation_sub_organization_and_more.py @@ -1,4 +1,4 @@ -# Generated by Django 4.2.10 on 2024-06-27 20:23 +# Generated by Django 4.2.10 on 2024-07-02 16:59 from django.db import migrations, models import django.db.models.deletion @@ -7,7 +7,7 @@ import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ - ("registrar", "0107_domainrequest_action_needed_reason_email"), + ("registrar", "0108_domaininformation_authorizing_official_and_more"), ] operations = [