From 6f61eb8020b7e454153ddd0679a955034e25f594 Mon Sep 17 00:00:00 2001 From: CocoByte Date: Mon, 8 Jul 2024 21:03:04 -0600 Subject: [PATCH 01/11] Enable super-admins to edit federal_agency --- src/registrar/admin.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/registrar/admin.py b/src/registrar/admin.py index ef78880054..0f191de301 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -1326,10 +1326,11 @@ class DomainInformationAdmin(ListHeaderAdmin, ImportExportModelAdmin): ] # Readonly fields for analysts and superusers - readonly_fields = ("other_contacts", "is_election_board", "federal_agency") + readonly_fields = ("other_contacts", "is_election_board") # Read only that we'll leverage for CISA Analysts analyst_readonly_fields = [ + "federal_agency", "creator", "type_of_work", "more_organization_information", @@ -1642,13 +1643,13 @@ def status_history(self, obj): "current_websites", "alternative_domains", "is_election_board", - "federal_agency", "status_history", "action_needed_reason_email", ) # Read only that we'll leverage for CISA Analysts analyst_readonly_fields = [ + "federal_agency", "creator", "about_your_organization", "requested_domain", From c370d6766e40b42fa5cc1cf1f5b7182f69e4c956 Mon Sep 17 00:00:00 2001 From: CocoByte Date: Wed, 10 Jul 2024 16:11:54 -0600 Subject: [PATCH 02/11] Added inline form to Portfolio to manage related domain groups and suborganizations --- src/registrar/admin.py | 24 ++++++++++--- .../django/admin/portfolio_change_form.html | 34 +++++++++++++++++++ 2 files changed, 53 insertions(+), 5 deletions(-) create mode 100644 src/registrar/templates/django/admin/portfolio_change_form.html diff --git a/src/registrar/admin.py b/src/registrar/admin.py index 0f682e76f9..c056dc00d6 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -9,6 +9,8 @@ from django.http import HttpResponseRedirect from django.shortcuts import redirect from django_fsm import get_available_FIELD_transitions, FSMField +from registrar.models.domain_group import DomainGroup +from registrar.models.suborganization import Suborganization from waffle.decorators import flag_is_active from django.contrib import admin, messages from django.contrib.auth.admin import UserAdmin as BaseUserAdmin @@ -2686,21 +2688,33 @@ def save_model(self, request, obj, form, change): obj.requestor = request.user if request.user.is_authenticated else None super().save_model(request, obj, form, change) - class PortfolioAdmin(ListHeaderAdmin): - # NOTE: these are just placeholders. Not part of ACs (haven't been defined yet). Update in future tickets. + + change_form_template = "django/admin/portfolio_change_form.html" + list_display = ("organization_name", "federal_agency", "creator") search_fields = ["organization_name"] search_help_text = "Search by organization name." - # readonly_fields = [ - # "requestor", - # ] + # Creates select2 fields (with search bars) autocomplete_fields = [ "creator", "federal_agency", ] + def change_view(self, request, object_id, form_url="", extra_context=None): + """Add related suborganizations and domain groups""" + obj = self.get_object(request, object_id) + + # ---- Domain Groups + domain_groups = DomainGroup.objects.filter(portfolio=obj) + + # ---- Suborganizations + suborganizations = Suborganization.objects.filter(portfolio=obj) + + extra_context = {"domain_groups": domain_groups, "suborganizations": suborganizations} + return super().change_view(request, object_id, form_url, extra_context) + def save_model(self, request, obj, form, change): if obj.creator is not None: diff --git a/src/registrar/templates/django/admin/portfolio_change_form.html b/src/registrar/templates/django/admin/portfolio_change_form.html new file mode 100644 index 0000000000..edd83eea93 --- /dev/null +++ b/src/registrar/templates/django/admin/portfolio_change_form.html @@ -0,0 +1,34 @@ +{% extends 'django/admin/email_clipboard_change_form.html' %} +{% load i18n static %} + +{% block after_related_objects %} +
+

Associated domain groups and suborganizations

+
+
+

Domain groups

+ +
+
+

Suborganizations

+ +
+
+
+{% endblock %} From 27555706a68401f890f2aeae41dec30229008621 Mon Sep 17 00:00:00 2001 From: CocoByte Date: Wed, 10 Jul 2024 16:14:57 -0600 Subject: [PATCH 03/11] Revert "Added inline form to Portfolio to manage related domain groups and suborganizations" This reverts commit c370d6766e40b42fa5cc1cf1f5b7182f69e4c956. --- src/registrar/admin.py | 24 +++---------- .../django/admin/portfolio_change_form.html | 34 ------------------- 2 files changed, 5 insertions(+), 53 deletions(-) delete mode 100644 src/registrar/templates/django/admin/portfolio_change_form.html diff --git a/src/registrar/admin.py b/src/registrar/admin.py index c056dc00d6..0f682e76f9 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -9,8 +9,6 @@ from django.http import HttpResponseRedirect from django.shortcuts import redirect from django_fsm import get_available_FIELD_transitions, FSMField -from registrar.models.domain_group import DomainGroup -from registrar.models.suborganization import Suborganization from waffle.decorators import flag_is_active from django.contrib import admin, messages from django.contrib.auth.admin import UserAdmin as BaseUserAdmin @@ -2688,33 +2686,21 @@ def save_model(self, request, obj, form, change): obj.requestor = request.user if request.user.is_authenticated else None super().save_model(request, obj, form, change) -class PortfolioAdmin(ListHeaderAdmin): - - change_form_template = "django/admin/portfolio_change_form.html" +class PortfolioAdmin(ListHeaderAdmin): + # NOTE: these are just placeholders. Not part of ACs (haven't been defined yet). Update in future tickets. list_display = ("organization_name", "federal_agency", "creator") search_fields = ["organization_name"] search_help_text = "Search by organization name." - + # readonly_fields = [ + # "requestor", + # ] # Creates select2 fields (with search bars) autocomplete_fields = [ "creator", "federal_agency", ] - def change_view(self, request, object_id, form_url="", extra_context=None): - """Add related suborganizations and domain groups""" - obj = self.get_object(request, object_id) - - # ---- Domain Groups - domain_groups = DomainGroup.objects.filter(portfolio=obj) - - # ---- Suborganizations - suborganizations = Suborganization.objects.filter(portfolio=obj) - - extra_context = {"domain_groups": domain_groups, "suborganizations": suborganizations} - return super().change_view(request, object_id, form_url, extra_context) - def save_model(self, request, obj, form, change): if obj.creator is not None: diff --git a/src/registrar/templates/django/admin/portfolio_change_form.html b/src/registrar/templates/django/admin/portfolio_change_form.html deleted file mode 100644 index edd83eea93..0000000000 --- a/src/registrar/templates/django/admin/portfolio_change_form.html +++ /dev/null @@ -1,34 +0,0 @@ -{% extends 'django/admin/email_clipboard_change_form.html' %} -{% load i18n static %} - -{% block after_related_objects %} -
-

Associated domain groups and suborganizations

-
-
-

Domain groups

- -
-
-

Suborganizations

- -
-
-
-{% endblock %} From 1c05dbfbb6164523264728e276a6093c72b14fc8 Mon Sep 17 00:00:00 2001 From: CocoByte Date: Thu, 11 Jul 2024 14:08:22 -0600 Subject: [PATCH 04/11] fixing unit tests to reflect new read-only fields --- src/registrar/admin.py | 24 +++++++++++++++++++----- src/registrar/tests/test_admin.py | 3 +-- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/registrar/admin.py b/src/registrar/admin.py index 0f682e76f9..c056dc00d6 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -9,6 +9,8 @@ from django.http import HttpResponseRedirect from django.shortcuts import redirect from django_fsm import get_available_FIELD_transitions, FSMField +from registrar.models.domain_group import DomainGroup +from registrar.models.suborganization import Suborganization from waffle.decorators import flag_is_active from django.contrib import admin, messages from django.contrib.auth.admin import UserAdmin as BaseUserAdmin @@ -2686,21 +2688,33 @@ def save_model(self, request, obj, form, change): obj.requestor = request.user if request.user.is_authenticated else None super().save_model(request, obj, form, change) - class PortfolioAdmin(ListHeaderAdmin): - # NOTE: these are just placeholders. Not part of ACs (haven't been defined yet). Update in future tickets. + + change_form_template = "django/admin/portfolio_change_form.html" + list_display = ("organization_name", "federal_agency", "creator") search_fields = ["organization_name"] search_help_text = "Search by organization name." - # readonly_fields = [ - # "requestor", - # ] + # Creates select2 fields (with search bars) autocomplete_fields = [ "creator", "federal_agency", ] + def change_view(self, request, object_id, form_url="", extra_context=None): + """Add related suborganizations and domain groups""" + obj = self.get_object(request, object_id) + + # ---- Domain Groups + domain_groups = DomainGroup.objects.filter(portfolio=obj) + + # ---- Suborganizations + suborganizations = Suborganization.objects.filter(portfolio=obj) + + extra_context = {"domain_groups": domain_groups, "suborganizations": suborganizations} + return super().change_view(request, object_id, form_url, extra_context) + def save_model(self, request, obj, form, change): if obj.creator is not None: diff --git a/src/registrar/tests/test_admin.py b/src/registrar/tests/test_admin.py index bbc66fc21e..dd412ce74b 100644 --- a/src/registrar/tests/test_admin.py +++ b/src/registrar/tests/test_admin.py @@ -2328,9 +2328,9 @@ def test_readonly_fields_for_analyst(self): "current_websites", "alternative_domains", "is_election_board", - "federal_agency", "status_history", "action_needed_reason_email", + "federal_agency", "creator", "about_your_organization", "requested_domain", @@ -2360,7 +2360,6 @@ def test_readonly_fields_for_superuser(self): "current_websites", "alternative_domains", "is_election_board", - "federal_agency", "status_history", "action_needed_reason_email", ] From e50c1c41da449ef1f859a5ba41b713798c016db2 Mon Sep 17 00:00:00 2001 From: CocoByte Date: Thu, 11 Jul 2024 14:19:15 -0600 Subject: [PATCH 05/11] fixing unit tests to reflect new read-only fields --- src/registrar/tests/test_admin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/registrar/tests/test_admin.py b/src/registrar/tests/test_admin.py index dd412ce74b..052ad44ec8 100644 --- a/src/registrar/tests/test_admin.py +++ b/src/registrar/tests/test_admin.py @@ -2266,7 +2266,6 @@ def test_readonly_when_restricted_creator(self): "current_websites", "alternative_domains", "is_election_board", - "federal_agency", "status_history", "action_needed_reason_email", "id", @@ -2328,9 +2327,9 @@ def test_readonly_fields_for_analyst(self): "current_websites", "alternative_domains", "is_election_board", + "federal_agency", "status_history", "action_needed_reason_email", - "federal_agency", "creator", "about_your_organization", "requested_domain", @@ -2360,6 +2359,7 @@ def test_readonly_fields_for_superuser(self): "current_websites", "alternative_domains", "is_election_board", + "federal_agency", "status_history", "action_needed_reason_email", ] From 075dc97a9f25f65c4ff5d92107ebffae26cb9250 Mon Sep 17 00:00:00 2001 From: CocoByte Date: Thu, 11 Jul 2024 14:32:22 -0600 Subject: [PATCH 06/11] fixing tests --- src/registrar/tests/test_admin.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/registrar/tests/test_admin.py b/src/registrar/tests/test_admin.py index 052ad44ec8..6169e02dfa 100644 --- a/src/registrar/tests/test_admin.py +++ b/src/registrar/tests/test_admin.py @@ -2359,7 +2359,6 @@ def test_readonly_fields_for_superuser(self): "current_websites", "alternative_domains", "is_election_board", - "federal_agency", "status_history", "action_needed_reason_email", ] From 37780c01a55f124dee0dbe2164aaf07021a30e6b Mon Sep 17 00:00:00 2001 From: CocoByte Date: Thu, 11 Jul 2024 14:33:32 -0600 Subject: [PATCH 07/11] fixing tests --- src/registrar/tests/test_admin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/registrar/tests/test_admin.py b/src/registrar/tests/test_admin.py index 6169e02dfa..413c770615 100644 --- a/src/registrar/tests/test_admin.py +++ b/src/registrar/tests/test_admin.py @@ -2327,9 +2327,9 @@ def test_readonly_fields_for_analyst(self): "current_websites", "alternative_domains", "is_election_board", - "federal_agency", "status_history", "action_needed_reason_email", + "federal_agency", "creator", "about_your_organization", "requested_domain", From 9e57248a9ede837519acbac5d7d5602d7b8b6610 Mon Sep 17 00:00:00 2001 From: CocoByte Date: Thu, 11 Jul 2024 14:43:19 -0600 Subject: [PATCH 08/11] linted --- src/registrar/admin.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/registrar/admin.py b/src/registrar/admin.py index c056dc00d6..c3ee7d7263 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -2688,6 +2688,7 @@ def save_model(self, request, obj, form, change): obj.requestor = request.user if request.user.is_authenticated else None super().save_model(request, obj, form, change) + class PortfolioAdmin(ListHeaderAdmin): change_form_template = "django/admin/portfolio_change_form.html" @@ -2695,7 +2696,7 @@ class PortfolioAdmin(ListHeaderAdmin): list_display = ("organization_name", "federal_agency", "creator") search_fields = ["organization_name"] search_help_text = "Search by organization name." - + # Creates select2 fields (with search bars) autocomplete_fields = [ "creator", From adf1c741902bc1e660021599f496e7640e62937c Mon Sep 17 00:00:00 2001 From: CocoByte Date: Wed, 17 Jul 2024 13:34:50 -0600 Subject: [PATCH 09/11] Removed stray code from other ticket --- src/registrar/admin.py | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/registrar/admin.py b/src/registrar/admin.py index d079a53ab4..b428f7c6a1 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -2649,8 +2649,6 @@ def save_model(self, request, obj, form, change): class PortfolioAdmin(ListHeaderAdmin): - change_form_template = "django/admin/portfolio_change_form.html" - list_display = ("organization_name", "federal_agency", "creator") search_fields = ["organization_name"] search_help_text = "Search by organization name." @@ -2661,19 +2659,6 @@ class PortfolioAdmin(ListHeaderAdmin): "federal_agency", ] - def change_view(self, request, object_id, form_url="", extra_context=None): - """Add related suborganizations and domain groups""" - obj = self.get_object(request, object_id) - - # ---- Domain Groups - domain_groups = DomainGroup.objects.filter(portfolio=obj) - - # ---- Suborganizations - suborganizations = Suborganization.objects.filter(portfolio=obj) - - extra_context = {"domain_groups": domain_groups, "suborganizations": suborganizations} - return super().change_view(request, object_id, form_url, extra_context) - def save_model(self, request, obj, form, change): if obj.creator is not None: From c6935e244737519ab3cd4f8cb9fcf75e729f8f26 Mon Sep 17 00:00:00 2001 From: CocoByte Date: Thu, 18 Jul 2024 10:47:38 -0600 Subject: [PATCH 10/11] fixing tests --- src/registrar/tests/test_admin.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/registrar/tests/test_admin.py b/src/registrar/tests/test_admin.py index cb64835882..0b5129e061 100644 --- a/src/registrar/tests/test_admin.py +++ b/src/registrar/tests/test_admin.py @@ -2305,7 +2305,6 @@ def test_readonly_when_restricted_creator(self): "current_websites", "alternative_domains", "is_election_board", - "federal_agency", "status_history", "id", "created_at", @@ -2367,7 +2366,6 @@ def test_readonly_fields_for_analyst(self): "alternative_domains", "is_election_board", "status_history", - "action_needed_reason_email", "federal_agency", "creator", "about_your_organization", From b7622a00b9cd9b0fb7805f9df003790abe9c246f Mon Sep 17 00:00:00 2001 From: CocoByte Date: Tue, 23 Jul 2024 21:18:13 -0600 Subject: [PATCH 11/11] linted --- src/registrar/admin.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/registrar/admin.py b/src/registrar/admin.py index 492058ee06..123e367b28 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -9,8 +9,6 @@ from django.http import HttpResponseRedirect from django.shortcuts import redirect from django_fsm import get_available_FIELD_transitions, FSMField -from registrar.models.domain_group import DomainGroup -from registrar.models.suborganization import Suborganization from waffle.decorators import flag_is_active from django.contrib import admin, messages from django.contrib.auth.admin import UserAdmin as BaseUserAdmin