From bd8b2a5a258e88731f313a3ba55535e6c5424e4d Mon Sep 17 00:00:00 2001 From: Erin Song <121973038+erinysong@users.noreply.github.com> Date: Fri, 2 May 2025 14:18:08 -0700 Subject: [PATCH] 3634: Update admin table descriptions [AB] (#3760) * Update admin table descriptions * Add Host rename migration --- .../migrations/0147_alter_hostip_options.py | 17 +++++++++ src/registrar/models/host_ip.py | 4 ++ .../templates/admin/model_descriptions.html | 14 +++++++ .../allowed_email_description.html | 14 +++++-- .../descriptions/contact_description.html | 10 ++--- .../domain_group_description.html | 1 + .../domain_request_description.html | 37 ++++++++++++++++--- .../federal_agency_description.html | 21 +++++++++++ .../descriptions/host_ip_description.html | 5 +++ .../descriptions/portfolio_description.html | 10 +++++ .../senior_official_description.html | 11 ++++++ .../suborganization_description.html | 9 +++++ ...user_portfolio_permission_description.html | 2 +- .../descriptions/waffle_flag_description.html | 13 +++++++ src/registrar/tests/test_admin.py | 4 +- src/registrar/tests/test_admin_request.py | 2 +- 16 files changed, 154 insertions(+), 20 deletions(-) create mode 100644 src/registrar/migrations/0147_alter_hostip_options.py create mode 100644 src/registrar/templates/django/admin/includes/descriptions/domain_group_description.html create mode 100644 src/registrar/templates/django/admin/includes/descriptions/federal_agency_description.html create mode 100644 src/registrar/templates/django/admin/includes/descriptions/host_ip_description.html create mode 100644 src/registrar/templates/django/admin/includes/descriptions/portfolio_description.html create mode 100644 src/registrar/templates/django/admin/includes/descriptions/senior_official_description.html create mode 100644 src/registrar/templates/django/admin/includes/descriptions/suborganization_description.html create mode 100644 src/registrar/templates/django/admin/includes/descriptions/waffle_flag_description.html diff --git a/src/registrar/migrations/0147_alter_hostip_options.py b/src/registrar/migrations/0147_alter_hostip_options.py new file mode 100644 index 000000000..14658aadb --- /dev/null +++ b/src/registrar/migrations/0147_alter_hostip_options.py @@ -0,0 +1,17 @@ +# Generated by Django 4.2.20 on 2025-04-29 21:17 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("registrar", "0146_remove_domainrequest_eop_stakeholder_email_and_more"), + ] + + operations = [ + migrations.AlterModelOptions( + name="hostip", + options={"verbose_name": "Host IP", "verbose_name_plural": "Host IPs"}, + ), + ] diff --git a/src/registrar/models/host_ip.py b/src/registrar/models/host_ip.py index e0c5bb1c9..972a0626e 100644 --- a/src/registrar/models/host_ip.py +++ b/src/registrar/models/host_ip.py @@ -14,6 +14,10 @@ class HostIP(TimeStampedModel): available when registry is not available. """ + class Meta: + verbose_name = "Host IP" + verbose_name_plural = "Host IPs" + address = models.CharField( max_length=46, null=False, diff --git a/src/registrar/templates/admin/model_descriptions.html b/src/registrar/templates/admin/model_descriptions.html index 9b163c407..130cd023c 100644 --- a/src/registrar/templates/admin/model_descriptions.html +++ b/src/registrar/templates/admin/model_descriptions.html @@ -36,6 +36,20 @@ {% include "django/admin/includes/descriptions/portfolio_invitation_description.html" %} {% elif opts.model_name == 'allowedemail' %} {% include "django/admin/includes/descriptions/allowed_email_description.html" %} + {% elif opts.model_name == 'federalagency' %} + {% include "django/admin/includes/descriptions/federal_agency_description.html" %} + {% elif opts.model_name == 'hostip' %} + {% include "django/admin/includes/descriptions/host_ip_description.html" %} + {% elif opts.model_name == 'portfolio' %} + {% include "django/admin/includes/descriptions/portfolio_description.html" %} + {% elif opts.model_name == 'seniorofficial' %} + {% include "django/admin/includes/descriptions/senior_official_description.html" %} + {% elif opts.model_name == 'suborganization' %} + {% include "django/admin/includes/descriptions/suborganization_description.html" %} + {% elif opts.model_name == 'waffleflag' %} + {% include "django/admin/includes/descriptions/waffle_flag_description.html" %} + {% elif opts.model_name == 'domaingroup' %} + {% include "django/admin/includes/descriptions/domain_group_description.html" %} {% else %}

This table does not have a description yet.

{% endif %} diff --git a/src/registrar/templates/django/admin/includes/descriptions/allowed_email_description.html b/src/registrar/templates/django/admin/includes/descriptions/allowed_email_description.html index 602935ab7..8aa142303 100644 --- a/src/registrar/templates/django/admin/includes/descriptions/allowed_email_description.html +++ b/src/registrar/templates/django/admin/includes/descriptions/allowed_email_description.html @@ -1,6 +1,12 @@ -

This table is an email allow list for non-production environments.

- If an email is sent out and the email does not exist within this table (or is not a subset of it), - then no email will be sent. + This table contains all email addresses that have been added to the allowlist for + non-production environments. +

+

+ If an email is triggered and the intended recipient doesn’t appear within this table + (or isn’t a subset of an entry in this table), then the message won’t be sent to that email address. +

+

+ If this table is populated in a production environment, it won’t have an effect on sending emails and + will simply be ignored.

-

If this table is populated in a production environment, no change will occur as it will simply be ignored.

diff --git a/src/registrar/templates/django/admin/includes/descriptions/contact_description.html b/src/registrar/templates/django/admin/includes/descriptions/contact_description.html index e29041168..715cfb3d1 100644 --- a/src/registrar/templates/django/admin/includes/descriptions/contact_description.html +++ b/src/registrar/templates/django/admin/includes/descriptions/contact_description.html @@ -1,10 +1,8 @@

-Contacts include anyone who has access to the registrar (known as “users”) and anyone listed in a domain request, -including other employees and senior officials. -Only contacts who have access to the registrar will have -a corresponding record within the Users table. + This table contains anyone listed in a non-portfolio domain request, including other employees + and senior officials. They aren't necessarily users with an account for the registrar unless + they are also in the Users table.

-

-Updating someone’s contact information here will not affect that person’s Login.gov information. + Updating someone’s contact information here will not affect that person’s User record or Login.gov information.

diff --git a/src/registrar/templates/django/admin/includes/descriptions/domain_group_description.html b/src/registrar/templates/django/admin/includes/descriptions/domain_group_description.html new file mode 100644 index 000000000..19dae0ef2 --- /dev/null +++ b/src/registrar/templates/django/admin/includes/descriptions/domain_group_description.html @@ -0,0 +1 @@ +

This table isn’t being used in the registrar yet and can be ignored.

diff --git a/src/registrar/templates/django/admin/includes/descriptions/domain_request_description.html b/src/registrar/templates/django/admin/includes/descriptions/domain_request_description.html index 5adc07454..de1f03a37 100644 --- a/src/registrar/templates/django/admin/includes/descriptions/domain_request_description.html +++ b/src/registrar/templates/django/admin/includes/descriptions/domain_request_description.html @@ -1,11 +1,36 @@

-This table contains all domain requests that have been started within the registrar and the status of those requests. -Updating values here will immediately update the corresponding values that users see in the registrar. + This table contains all .gov domain requests. If a green checkmark appears next to the “requested domain” + in this table, then it came from a portfolio organization. Updating values in this table will immediately + update the corresponding values that users see in the registrar.

-Once a domain request has been adjudicated, the details of that request should not be modified. -To update attributes (like an organization’s name) after a domain’s approval, -go to Domains. -Similar fields display on each Domain page, but edits made there will not affect the corresponding domain request. + A domain request will have one of the following + statuses: +

+ + +

+ If you change the status to one of those marked with an asterisk, then an email will be sent to the creator of that request. +

+

+ Once a domain request has been adjudicated (i.e., set to Rejected, Withdrawn, Ineligible, or Approved), the details of that + request should not be modified. To update attributes (like an organization’s name) after a domain’s approval, go to + Domains. Similar fields display on each + domain page, but edits made there will not affect the corresponding request. +

+ +

+ If a domain is accidentally approved, an entry will be added to the + Domains table and an approval email will + be sent. However, if the status is changed back before name servers are added, the request can be processed normally.

diff --git a/src/registrar/templates/django/admin/includes/descriptions/federal_agency_description.html b/src/registrar/templates/django/admin/includes/descriptions/federal_agency_description.html new file mode 100644 index 000000000..b80c92830 --- /dev/null +++ b/src/registrar/templates/django/admin/includes/descriptions/federal_agency_description.html @@ -0,0 +1,21 @@ +

This table is used to populate “federal agency” drop-down menus in the registrar and in the following Django tables:

+ + + +

+ If a federal agency name is incorrect or needs to be changed, you should edit the existing record rather than create a + new one. That way relationships with that record do not break within other Django tables. +

diff --git a/src/registrar/templates/django/admin/includes/descriptions/host_ip_description.html b/src/registrar/templates/django/admin/includes/descriptions/host_ip_description.html new file mode 100644 index 000000000..8048650e2 --- /dev/null +++ b/src/registrar/templates/django/admin/includes/descriptions/host_ip_description.html @@ -0,0 +1,5 @@ +

+ This table contains all IP addresses associated with name servers for .gov domains. + A single name server can have multiple IP addresses in any combination of ip v4 or v6. + This table is primarily used for troubleshooting. +

diff --git a/src/registrar/templates/django/admin/includes/descriptions/portfolio_description.html b/src/registrar/templates/django/admin/includes/descriptions/portfolio_description.html new file mode 100644 index 000000000..0387215f1 --- /dev/null +++ b/src/registrar/templates/django/admin/includes/descriptions/portfolio_description.html @@ -0,0 +1,10 @@ +

+ This table contains all portfolios in the registrar. + Portfolios are used to group an organization with all its domains, requests, suborganizations, and members. +

+ +

+ For portfolio organizations, the mailing address is stored in this table, and the senior official is listed in the + Senior officials table. + For non-portfolio organizations, that information is managed at the domain or request level. +

diff --git a/src/registrar/templates/django/admin/includes/descriptions/senior_official_description.html b/src/registrar/templates/django/admin/includes/descriptions/senior_official_description.html new file mode 100644 index 000000000..69ead8691 --- /dev/null +++ b/src/registrar/templates/django/admin/includes/descriptions/senior_official_description.html @@ -0,0 +1,11 @@ +

This table includes all senior officials that can be associated with a portfolio organization.

+ +

+ To maintain data integrity, each organization should have only one senior official. + When adding a new senior official, selecting a federal agency will automatically link the official to that agency’s portfolio. +

+ +

+ The senior official for non-portfolio organizations is managed at the domain or request level. + Those contacts do not appear in this table. +

diff --git a/src/registrar/templates/django/admin/includes/descriptions/suborganization_description.html b/src/registrar/templates/django/admin/includes/descriptions/suborganization_description.html new file mode 100644 index 000000000..babd93ad3 --- /dev/null +++ b/src/registrar/templates/django/admin/includes/descriptions/suborganization_description.html @@ -0,0 +1,9 @@ +

+ This table contains all suborganizations created for portfolio organizations. + A suborganization is any entity (agency, bureau, office) that falls under the overarching organization. +

+ +

+ Domains or requests within a portfolio can be linked to a suborganization. + If linked, the suborganization’s name will be publicly shown as the domain registrant. +

diff --git a/src/registrar/templates/django/admin/includes/descriptions/user_portfolio_permission_description.html b/src/registrar/templates/django/admin/includes/descriptions/user_portfolio_permission_description.html index fd8919b8f..fa5b20612 100644 --- a/src/registrar/templates/django/admin/includes/descriptions/user_portfolio_permission_description.html +++ b/src/registrar/templates/django/admin/includes/descriptions/user_portfolio_permission_description.html @@ -8,4 +8,4 @@

If you add or remove someone to a portfolio by using this table, those actions won’t trigger notification emails. -

\ No newline at end of file +

diff --git a/src/registrar/templates/django/admin/includes/descriptions/waffle_flag_description.html b/src/registrar/templates/django/admin/includes/descriptions/waffle_flag_description.html new file mode 100644 index 000000000..32e454b04 --- /dev/null +++ b/src/registrar/templates/django/admin/includes/descriptions/waffle_flag_description.html @@ -0,0 +1,13 @@ +

Waffle flags control whether certain features are turned on or off in the registrar.

+ +

+ You can adjust settings for specific user groups (superusers, staff), but the setting for "Everyone" + takes priority and overrides individual group settings. +

+ +

If “Everyone” is set to:

+ diff --git a/src/registrar/tests/test_admin.py b/src/registrar/tests/test_admin.py index 8fd2744ec..55d7712f4 100644 --- a/src/registrar/tests/test_admin.py +++ b/src/registrar/tests/test_admin.py @@ -3536,7 +3536,7 @@ class TestContactAdmin(TestCase): self.assertEqual(response.status_code, 200) # Test for a description snippet - self.assertContains(response, "Contacts include anyone who has access to the registrar (known as “users”)") + self.assertContains(response, "This table contains anyone listed in a non-portfolio domain request") self.assertContains(response, "Show more") def test_readonly_when_restricted_staffuser(self): @@ -3867,7 +3867,7 @@ class TestFederalAgencyAdmin(TestCase): self.assertEqual(response.status_code, 200) # Test for a description snippet - self.assertContains(response, "This table does not have a description yet.") + self.assertContains(response, "If a federal agency name is incorrect") self.assertContains(response, "Show more") diff --git a/src/registrar/tests/test_admin_request.py b/src/registrar/tests/test_admin_request.py index fd54631ff..7442fee9e 100644 --- a/src/registrar/tests/test_admin_request.py +++ b/src/registrar/tests/test_admin_request.py @@ -294,7 +294,7 @@ class TestDomainRequestAdmin(MockEppLib): self.assertEqual(response.status_code, 200) # Test for a description snippet - self.assertContains(response, "This table contains all domain requests") + self.assertContains(response, "This table contains all .gov domain requests") self.assertContains(response, "Show more") @less_console_noise_decorator