diff --git a/src/registrar/utility/admin_helpers.py b/src/registrar/utility/admin_helpers.py
index 0b99bba13..32d2ad09d 100644
--- a/src/registrar/utility/admin_helpers.py
+++ b/src/registrar/utility/admin_helpers.py
@@ -1,5 +1,9 @@
from registrar.models.domain_request import DomainRequest
from django.template.loader import get_template
+from django.utils.html import format_html
+from django.urls import reverse
+from django.utils.html import escape
+from registrar.models.utility.generic_helper import value_of_attribute
def get_all_action_needed_reason_emails(request, domain_request):
@@ -34,3 +38,50 @@ def get_action_needed_reason_default_email(request, domain_request, action_neede
email_body_text_cleaned = email_body_text.strip().lstrip("\n")
return email_body_text_cleaned
+
+
+def get_field_links_as_list(
+ queryset, model_name, attribute_name=None, link_info_attribute=None, separator=None
+ ):
+ """
+ Generate HTML links for items in a queryset, using a specified attribute for link text.
+
+ Args:
+ queryset: The queryset of items to generate links for.
+ model_name: The model name used to construct the admin change URL.
+ attribute_name: The attribute or method name to use for link text. If None, the item itself is used.
+ link_info_attribute: Appends f"({value_of_attribute})" to the end of the link.
+ separator: The separator to use between links in the resulting HTML.
+ If none, an unordered list is returned.
+
+ Returns:
+ A formatted HTML string with links to the admin change pages for each item.
+ """
+ links = []
+ for item in queryset:
+
+ # This allows you to pass in attribute_name="get_full_name" for instance.
+ if attribute_name:
+ item_display_value = value_of_attribute(item, attribute_name)
+ else:
+ item_display_value = item
+
+ if item_display_value:
+ change_url = reverse(f"admin:registrar_{model_name}_change", args=[item.pk])
+
+ link = f'
{escape(item_display_value)}'
+ if link_info_attribute:
+ link += f" ({value_of_attribute(item, link_info_attribute)})"
+
+ if separator:
+ links.append(link)
+ else:
+ links.append(f"
{link}")
+
+ # If no separator is specified, just return an unordered list.
+ if separator:
+ return format_html(separator.join(links)) if links else "-"
+ else:
+ links = "".join(links)
+ return format_html(f'
') if links else "-"
+
From 4c756bba69a950763cf6ced2189aeeb0b376ccef Mon Sep 17 00:00:00 2001
From: zandercymatics <141044360+zandercymatics@users.noreply.github.com>
Date: Mon, 30 Sep 2024 08:24:42 -0600
Subject: [PATCH 35/42] User changes
---
src/registrar/admin.py | 2 +-
src/registrar/utility/admin_helpers.py | 8 +++++---
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/src/registrar/admin.py b/src/registrar/admin.py
index e3a3b2b2d..1ac081eeb 100644
--- a/src/registrar/admin.py
+++ b/src/registrar/admin.py
@@ -865,7 +865,7 @@ class MyUserAdmin(BaseUserAdmin, ImportExportModelAdmin):
"""Returns a list of links for each related suborg"""
portfolio_ids = obj.get_portfolios().values_list("portfolio", flat=True)
queryset = models.Portfolio.objects.filter(id__in=portfolio_ids)
- return get_field_links_as_list(queryset, "portfolio")
+ return get_field_links_as_list(queryset, "portfolio", msg_for_none="No portfolios.")
portfolios.short_description = "Portfolios" # type: ignore
diff --git a/src/registrar/utility/admin_helpers.py b/src/registrar/utility/admin_helpers.py
index 32d2ad09d..a6428f826 100644
--- a/src/registrar/utility/admin_helpers.py
+++ b/src/registrar/utility/admin_helpers.py
@@ -41,7 +41,7 @@ def get_action_needed_reason_default_email(request, domain_request, action_neede
def get_field_links_as_list(
- queryset, model_name, attribute_name=None, link_info_attribute=None, separator=None
+ queryset, model_name, attribute_name=None, link_info_attribute=None, separator=None, msg_for_none="-",
):
"""
Generate HTML links for items in a queryset, using a specified attribute for link text.
@@ -53,6 +53,8 @@ def get_field_links_as_list(
link_info_attribute: Appends f"({value_of_attribute})" to the end of the link.
separator: The separator to use between links in the resulting HTML.
If none, an unordered list is returned.
+ msg_for_none: What to return when the field would otherwise display None.
+ Defaults to `-`.
Returns:
A formatted HTML string with links to the admin change pages for each item.
@@ -80,8 +82,8 @@ def get_field_links_as_list(
# If no separator is specified, just return an unordered list.
if separator:
- return format_html(separator.join(links)) if links else "-"
+ return format_html(separator.join(links)) if links else msg_for_none
else:
links = "".join(links)
- return format_html(f'
') if links else "-"
+ return format_html(f'
') if links else msg_for_none
From e798410ac4cf942a44b6a1456ba42588ba4912d6 Mon Sep 17 00:00:00 2001
From: zandercymatics <141044360+zandercymatics@users.noreply.github.com>
Date: Mon, 30 Sep 2024 08:32:46 -0600
Subject: [PATCH 36/42] update domain info / domain request
---
...er_domaininformation_portfolio_and_more.py | 64 +++++++++++++++++++
src/registrar/models/domain_information.py | 5 +-
src/registrar/models/domain_request.py | 5 +-
3 files changed, 70 insertions(+), 4 deletions(-)
create mode 100644 src/registrar/migrations/0131_alter_domaininformation_portfolio_and_more.py
diff --git a/src/registrar/migrations/0131_alter_domaininformation_portfolio_and_more.py b/src/registrar/migrations/0131_alter_domaininformation_portfolio_and_more.py
new file mode 100644
index 000000000..bf1513f7d
--- /dev/null
+++ b/src/registrar/migrations/0131_alter_domaininformation_portfolio_and_more.py
@@ -0,0 +1,64 @@
+# Generated by Django 4.2.10 on 2024-09-30 14:31
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("registrar", "0130_remove_federalagency_initials_federalagency_acronym_and_more"),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name="domaininformation",
+ name="portfolio",
+ field=models.ForeignKey(
+ blank=True,
+ help_text="If blank, domain is not associated with a portfolio.",
+ null=True,
+ on_delete=django.db.models.deletion.PROTECT,
+ related_name="information_portfolio",
+ to="registrar.portfolio",
+ ),
+ ),
+ migrations.AlterField(
+ model_name="domaininformation",
+ name="sub_organization",
+ field=models.ForeignKey(
+ blank=True,
+ help_text="If blank, domain is associated with the overarching organization for this portfolio.",
+ null=True,
+ on_delete=django.db.models.deletion.PROTECT,
+ related_name="information_sub_organization",
+ to="registrar.suborganization",
+ verbose_name="Suborganization",
+ ),
+ ),
+ migrations.AlterField(
+ model_name="domainrequest",
+ name="portfolio",
+ field=models.ForeignKey(
+ blank=True,
+ help_text="If blank, request is not associated with a portfolio.",
+ null=True,
+ on_delete=django.db.models.deletion.PROTECT,
+ related_name="DomainRequest_portfolio",
+ to="registrar.portfolio",
+ ),
+ ),
+ migrations.AlterField(
+ model_name="domainrequest",
+ name="sub_organization",
+ field=models.ForeignKey(
+ blank=True,
+ help_text="If blank, request is associated with the overarching organization for this portfolio.",
+ null=True,
+ on_delete=django.db.models.deletion.PROTECT,
+ related_name="request_sub_organization",
+ to="registrar.suborganization",
+ verbose_name="Suborganization",
+ ),
+ ),
+ ]
diff --git a/src/registrar/models/domain_information.py b/src/registrar/models/domain_information.py
index d04f09c07..6e99dfbee 100644
--- a/src/registrar/models/domain_information.py
+++ b/src/registrar/models/domain_information.py
@@ -63,7 +63,7 @@ class DomainInformation(TimeStampedModel):
null=True,
blank=True,
related_name="information_portfolio",
- help_text="Portfolio associated with this domain",
+ help_text="If blank, domain is not associated with a portfolio.",
)
sub_organization = models.ForeignKey(
@@ -72,7 +72,8 @@ class DomainInformation(TimeStampedModel):
null=True,
blank=True,
related_name="information_sub_organization",
- help_text="The suborganization that this domain is included under",
+ help_text="If blank, domain is associated with the overarching organization for this portfolio.",
+ verbose_name="Suborganization",
)
domain_request = models.OneToOneField(
diff --git a/src/registrar/models/domain_request.py b/src/registrar/models/domain_request.py
index bb8693ac1..35c121f3e 100644
--- a/src/registrar/models/domain_request.py
+++ b/src/registrar/models/domain_request.py
@@ -327,7 +327,7 @@ class DomainRequest(TimeStampedModel):
null=True,
blank=True,
related_name="DomainRequest_portfolio",
- help_text="Portfolio associated with this domain request",
+ help_text="If blank, request is not associated with a portfolio.",
)
sub_organization = models.ForeignKey(
@@ -336,7 +336,8 @@ class DomainRequest(TimeStampedModel):
null=True,
blank=True,
related_name="request_sub_organization",
- help_text="The suborganization that this domain request is included under",
+ help_text="If blank, request is associated with the overarching organization for this portfolio.",
+ verbose_name="Suborganization",
)
# This is the domain request user who created this domain request.
From df3f37bf404372edc1dda26869b644cc1a2dc15c Mon Sep 17 00:00:00 2001
From: zandercymatics <141044360+zandercymatics@users.noreply.github.com>
Date: Mon, 30 Sep 2024 08:36:19 -0600
Subject: [PATCH 37/42] fix script
---
docs/operations/data_migration.md | 2 +-
.../commands/populate_federal_agency_initials_and_fceb.py | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/docs/operations/data_migration.md b/docs/operations/data_migration.md
index 5e1aa688a..a234d882b 100644
--- a/docs/operations/data_migration.md
+++ b/docs/operations/data_migration.md
@@ -754,7 +754,7 @@ Example: `cf ssh getgov-za`
| 1 | **emailTo** | Specifies where the email will be emailed. Defaults to help@get.gov on production. |
## Populate federal agency initials and FCEB
-This script adds to the "is_fceb" and "initials" fields on the FederalAgency model. This script expects a CSV of federal CIOs to pull from, which can be sourced from [here](https://docs.google.com/spreadsheets/d/14oXHFpKyUXS5_mDWARPusghGdHCrP67jCleOknaSx38/edit?gid=479328070#gid=479328070).
+This script adds to the "is_fceb" and "acronym" fields on the FederalAgency model. This script expects a CSV of federal CIOs to pull from, which can be sourced from [here](https://docs.google.com/spreadsheets/d/14oXHFpKyUXS5_mDWARPusghGdHCrP67jCleOknaSx38/edit?gid=479328070#gid=479328070).
### Running on sandboxes
diff --git a/src/registrar/management/commands/populate_federal_agency_initials_and_fceb.py b/src/registrar/management/commands/populate_federal_agency_initials_and_fceb.py
index 30ae08b47..50b481e7f 100644
--- a/src/registrar/management/commands/populate_federal_agency_initials_and_fceb.py
+++ b/src/registrar/management/commands/populate_federal_agency_initials_and_fceb.py
@@ -36,7 +36,7 @@ class Command(BaseCommand, PopulateScriptTemplate):
self.federal_agency_dict[agency_name.strip()] = (initials, agency_status)
# Update every federal agency record
- self.mass_update_records(FederalAgency, {"agency__isnull": False}, ["initials", "is_fceb"])
+ self.mass_update_records(FederalAgency, {"agency__isnull": False}, ["acronym", "is_fceb"])
def update_record(self, record: FederalAgency):
"""For each record, update the initials and is_fceb field if data exists for it"""
From 7602629dc5fade38c81aecf2444dd1e991e8938c Mon Sep 17 00:00:00 2001
From: zandercymatics <141044360+zandercymatics@users.noreply.github.com>
Date: Mon, 30 Sep 2024 09:08:01 -0600
Subject: [PATCH 38/42] linting
---
src/registrar/admin.py | 6 +-
.../models/utility/generic_helper.py | 1 +
src/registrar/utility/admin_helpers.py | 86 ++++++++++---------
3 files changed, 51 insertions(+), 42 deletions(-)
diff --git a/src/registrar/admin.py b/src/registrar/admin.py
index 1ac081eeb..ca51e8b72 100644
--- a/src/registrar/admin.py
+++ b/src/registrar/admin.py
@@ -20,7 +20,11 @@ from epplibwrapper.errors import ErrorCode, RegistryError
from registrar.models.user_domain_role import UserDomainRole
from waffle.admin import FlagAdmin
from waffle.models import Sample, Switch
-from registrar.utility.admin_helpers import get_all_action_needed_reason_emails, get_action_needed_reason_default_email, get_field_links_as_list
+from registrar.utility.admin_helpers import (
+ get_all_action_needed_reason_emails,
+ get_action_needed_reason_default_email,
+ get_field_links_as_list,
+)
from registrar.models import Contact, Domain, DomainRequest, DraftDomain, User, Website, SeniorOfficial
from registrar.utility.constants import BranchChoices
from registrar.utility.errors import FSMDomainRequestError, FSMErrorCodes
diff --git a/src/registrar/models/utility/generic_helper.py b/src/registrar/models/utility/generic_helper.py
index b02068de0..5e425f5a3 100644
--- a/src/registrar/models/utility/generic_helper.py
+++ b/src/registrar/models/utility/generic_helper.py
@@ -335,6 +335,7 @@ def get_url_name(path):
logger.error(f"No matching URL name found for path: {path}")
return None
+
def value_of_attribute(obj, attribute_name: str):
"""Returns the value of getattr if the attribute isn't callable.
If it is, execute the underlying function and return that result instead."""
diff --git a/src/registrar/utility/admin_helpers.py b/src/registrar/utility/admin_helpers.py
index a6428f826..2af9d0b3c 100644
--- a/src/registrar/utility/admin_helpers.py
+++ b/src/registrar/utility/admin_helpers.py
@@ -41,49 +41,53 @@ def get_action_needed_reason_default_email(request, domain_request, action_neede
def get_field_links_as_list(
- queryset, model_name, attribute_name=None, link_info_attribute=None, separator=None, msg_for_none="-",
- ):
- """
- Generate HTML links for items in a queryset, using a specified attribute for link text.
+ queryset,
+ model_name,
+ attribute_name=None,
+ link_info_attribute=None,
+ separator=None,
+ msg_for_none="-",
+):
+ """
+ Generate HTML links for items in a queryset, using a specified attribute for link text.
- Args:
- queryset: The queryset of items to generate links for.
- model_name: The model name used to construct the admin change URL.
- attribute_name: The attribute or method name to use for link text. If None, the item itself is used.
- link_info_attribute: Appends f"({value_of_attribute})" to the end of the link.
- separator: The separator to use between links in the resulting HTML.
- If none, an unordered list is returned.
- msg_for_none: What to return when the field would otherwise display None.
- Defaults to `-`.
+ Args:
+ queryset: The queryset of items to generate links for.
+ model_name: The model name used to construct the admin change URL.
+ attribute_name: The attribute or method name to use for link text. If None, the item itself is used.
+ link_info_attribute: Appends f"({value_of_attribute})" to the end of the link.
+ separator: The separator to use between links in the resulting HTML.
+ If none, an unordered list is returned.
+ msg_for_none: What to return when the field would otherwise display None.
+ Defaults to `-`.
- Returns:
- A formatted HTML string with links to the admin change pages for each item.
- """
- links = []
- for item in queryset:
+ Returns:
+ A formatted HTML string with links to the admin change pages for each item.
+ """
+ links = []
+ for item in queryset:
- # This allows you to pass in attribute_name="get_full_name" for instance.
- if attribute_name:
- item_display_value = value_of_attribute(item, attribute_name)
- else:
- item_display_value = item
-
- if item_display_value:
- change_url = reverse(f"admin:registrar_{model_name}_change", args=[item.pk])
-
- link = f'
{escape(item_display_value)}'
- if link_info_attribute:
- link += f" ({value_of_attribute(item, link_info_attribute)})"
-
- if separator:
- links.append(link)
- else:
- links.append(f"
{link}")
-
- # If no separator is specified, just return an unordered list.
- if separator:
- return format_html(separator.join(links)) if links else msg_for_none
+ # This allows you to pass in attribute_name="get_full_name" for instance.
+ if attribute_name:
+ item_display_value = value_of_attribute(item, attribute_name)
else:
- links = "".join(links)
- return format_html(f'
') if links else msg_for_none
+ item_display_value = item
+ if item_display_value:
+ change_url = reverse(f"admin:registrar_{model_name}_change", args=[item.pk])
+
+ link = f'
{escape(item_display_value)}'
+ if link_info_attribute:
+ link += f" ({value_of_attribute(item, link_info_attribute)})"
+
+ if separator:
+ links.append(link)
+ else:
+ links.append(f"
{link}")
+
+ # If no separator is specified, just return an unordered list.
+ if separator:
+ return format_html(separator.join(links)) if links else msg_for_none
+ else:
+ links = "".join(links)
+ return format_html(f'
') if links else msg_for_none
From 1122edc5c588d2722c9a29234c89708880c85d12 Mon Sep 17 00:00:00 2001
From: zandercymatics <141044360+zandercymatics@users.noreply.github.com>
Date: Mon, 30 Sep 2024 12:06:19 -0600
Subject: [PATCH 39/42] Fix migrations
---
...nitials_federalagency_acronym_and_more.py} | 61 ++++++++++++++++--
...roups_v17.py => 0130_create_groups_v17.py} | 2 +-
...er_domaininformation_portfolio_and_more.py | 64 -------------------
src/registrar/models/user_group.py | 5 ++
4 files changed, 62 insertions(+), 70 deletions(-)
rename src/registrar/migrations/{0130_remove_federalagency_initials_federalagency_acronym_and_more.py => 0129_remove_federalagency_initials_federalagency_acronym_and_more.py} (56%)
rename src/registrar/migrations/{0129_create_groups_v17.py => 0130_create_groups_v17.py} (93%)
delete mode 100644 src/registrar/migrations/0131_alter_domaininformation_portfolio_and_more.py
diff --git a/src/registrar/migrations/0130_remove_federalagency_initials_federalagency_acronym_and_more.py b/src/registrar/migrations/0129_remove_federalagency_initials_federalagency_acronym_and_more.py
similarity index 56%
rename from src/registrar/migrations/0130_remove_federalagency_initials_federalagency_acronym_and_more.py
rename to src/registrar/migrations/0129_remove_federalagency_initials_federalagency_acronym_and_more.py
index 6e5935748..8371d8136 100644
--- a/src/registrar/migrations/0130_remove_federalagency_initials_federalagency_acronym_and_more.py
+++ b/src/registrar/migrations/0129_remove_federalagency_initials_federalagency_acronym_and_more.py
@@ -1,4 +1,4 @@
-# Generated by Django 4.2.10 on 2024-09-27 20:20
+# Generated by Django 4.2.10 on 2024-09-30 17:59
from django.db import migrations, models
import django.db.models.deletion
@@ -8,15 +8,16 @@ import registrar.models.federal_agency
class Migration(migrations.Migration):
dependencies = [
- ("registrar", "0129_create_groups_v17"),
+ ("registrar", "0128_alter_domaininformation_state_territory_and_more"),
]
operations = [
- migrations.RemoveField(
+ migrations.RenameField(
model_name="federalagency",
- name="initials",
+ old_name="initials",
+ new_name="acronym",
),
- migrations.AddField(
+ migrations.AlterField(
model_name="federalagency",
name="acronym",
field=models.CharField(
@@ -26,6 +27,56 @@ class Migration(migrations.Migration):
null=True,
),
),
+ migrations.AlterField(
+ model_name="domaininformation",
+ name="portfolio",
+ field=models.ForeignKey(
+ blank=True,
+ help_text="If blank, domain is not associated with a portfolio.",
+ null=True,
+ on_delete=django.db.models.deletion.PROTECT,
+ related_name="information_portfolio",
+ to="registrar.portfolio",
+ ),
+ ),
+ migrations.AlterField(
+ model_name="domaininformation",
+ name="sub_organization",
+ field=models.ForeignKey(
+ blank=True,
+ help_text="If blank, domain is associated with the overarching organization for this portfolio.",
+ null=True,
+ on_delete=django.db.models.deletion.PROTECT,
+ related_name="information_sub_organization",
+ to="registrar.suborganization",
+ verbose_name="Suborganization",
+ ),
+ ),
+ migrations.AlterField(
+ model_name="domainrequest",
+ name="portfolio",
+ field=models.ForeignKey(
+ blank=True,
+ help_text="If blank, request is not associated with a portfolio.",
+ null=True,
+ on_delete=django.db.models.deletion.PROTECT,
+ related_name="DomainRequest_portfolio",
+ to="registrar.portfolio",
+ ),
+ ),
+ migrations.AlterField(
+ model_name="domainrequest",
+ name="sub_organization",
+ field=models.ForeignKey(
+ blank=True,
+ help_text="If blank, request is associated with the overarching organization for this portfolio.",
+ null=True,
+ on_delete=django.db.models.deletion.PROTECT,
+ related_name="request_sub_organization",
+ to="registrar.suborganization",
+ verbose_name="Suborganization",
+ ),
+ ),
migrations.AlterField(
model_name="federalagency",
name="federal_type",
diff --git a/src/registrar/migrations/0129_create_groups_v17.py b/src/registrar/migrations/0130_create_groups_v17.py
similarity index 93%
rename from src/registrar/migrations/0129_create_groups_v17.py
rename to src/registrar/migrations/0130_create_groups_v17.py
index 7e0ae99ad..c7d10693a 100644
--- a/src/registrar/migrations/0129_create_groups_v17.py
+++ b/src/registrar/migrations/0130_create_groups_v17.py
@@ -25,7 +25,7 @@ def create_groups(apps, schema_editor) -> Any:
class Migration(migrations.Migration):
dependencies = [
- ("registrar", "0128_alter_domaininformation_state_territory_and_more"),
+ ("registrar", "0129_remove_federalagency_initials_federalagency_acronym_and_more"),
]
operations = [
diff --git a/src/registrar/migrations/0131_alter_domaininformation_portfolio_and_more.py b/src/registrar/migrations/0131_alter_domaininformation_portfolio_and_more.py
deleted file mode 100644
index bf1513f7d..000000000
--- a/src/registrar/migrations/0131_alter_domaininformation_portfolio_and_more.py
+++ /dev/null
@@ -1,64 +0,0 @@
-# Generated by Django 4.2.10 on 2024-09-30 14:31
-
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
- dependencies = [
- ("registrar", "0130_remove_federalagency_initials_federalagency_acronym_and_more"),
- ]
-
- operations = [
- migrations.AlterField(
- model_name="domaininformation",
- name="portfolio",
- field=models.ForeignKey(
- blank=True,
- help_text="If blank, domain is not associated with a portfolio.",
- null=True,
- on_delete=django.db.models.deletion.PROTECT,
- related_name="information_portfolio",
- to="registrar.portfolio",
- ),
- ),
- migrations.AlterField(
- model_name="domaininformation",
- name="sub_organization",
- field=models.ForeignKey(
- blank=True,
- help_text="If blank, domain is associated with the overarching organization for this portfolio.",
- null=True,
- on_delete=django.db.models.deletion.PROTECT,
- related_name="information_sub_organization",
- to="registrar.suborganization",
- verbose_name="Suborganization",
- ),
- ),
- migrations.AlterField(
- model_name="domainrequest",
- name="portfolio",
- field=models.ForeignKey(
- blank=True,
- help_text="If blank, request is not associated with a portfolio.",
- null=True,
- on_delete=django.db.models.deletion.PROTECT,
- related_name="DomainRequest_portfolio",
- to="registrar.portfolio",
- ),
- ),
- migrations.AlterField(
- model_name="domainrequest",
- name="sub_organization",
- field=models.ForeignKey(
- blank=True,
- help_text="If blank, request is associated with the overarching organization for this portfolio.",
- null=True,
- on_delete=django.db.models.deletion.PROTECT,
- related_name="request_sub_organization",
- to="registrar.suborganization",
- verbose_name="Suborganization",
- ),
- ),
- ]
diff --git a/src/registrar/models/user_group.py b/src/registrar/models/user_group.py
index 41ae67c06..84b4da701 100644
--- a/src/registrar/models/user_group.py
+++ b/src/registrar/models/user_group.py
@@ -76,6 +76,11 @@ class UserGroup(Group):
"model": "suborganization",
"permissions": ["add_suborganization", "change_suborganization", "delete_suborganization"],
},
+ {
+ "app_label": "registrar",
+ "model": "seniorofficial",
+ "permissions": ["add_seniorofficial", "change_seniorofficial", "delete_seniorofficial"],
+ },
{
"app_label": "registrar",
"model": "userportfoliopermission",
From 0e7969f7c781e16e85af529f9468575219df900a Mon Sep 17 00:00:00 2001
From: zandercymatics <141044360+zandercymatics@users.noreply.github.com>
Date: Mon, 30 Sep 2024 12:27:41 -0600
Subject: [PATCH 40/42] fix test
---
src/registrar/tests/test_migrations.py | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/registrar/tests/test_migrations.py b/src/registrar/tests/test_migrations.py
index d646a03de..eaaae8727 100644
--- a/src/registrar/tests/test_migrations.py
+++ b/src/registrar/tests/test_migrations.py
@@ -43,6 +43,9 @@ class TestGroups(TestCase):
"add_portfolio",
"change_portfolio",
"delete_portfolio",
+ "add_seniorofficial",
+ "change_seniorofficial",
+ "delete_seniorofficial",
"add_suborganization",
"change_suborganization",
"delete_suborganization",
From f67c4e0da2b3ea47d9e90f19db3268bdb61a14bc Mon Sep 17 00:00:00 2001
From: zandercymatics <141044360+zandercymatics@users.noreply.github.com>
Date: Wed, 2 Oct 2024 08:17:29 -0600
Subject: [PATCH 41/42] Remove helper text
---
...er_domaininformation_portfolio_and_more.py | 36 +++++++++++++++++++
src/registrar/models/domain_information.py | 1 -
src/registrar/models/domain_request.py | 1 -
3 files changed, 36 insertions(+), 2 deletions(-)
create mode 100644 src/registrar/migrations/0131_alter_domaininformation_portfolio_and_more.py
diff --git a/src/registrar/migrations/0131_alter_domaininformation_portfolio_and_more.py b/src/registrar/migrations/0131_alter_domaininformation_portfolio_and_more.py
new file mode 100644
index 000000000..ee0232a17
--- /dev/null
+++ b/src/registrar/migrations/0131_alter_domaininformation_portfolio_and_more.py
@@ -0,0 +1,36 @@
+# Generated by Django 4.2.10 on 2024-10-02 14:17
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("registrar", "0130_create_groups_v17"),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name="domaininformation",
+ name="portfolio",
+ field=models.ForeignKey(
+ blank=True,
+ 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,
+ 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 6e99dfbee..5f98197bd 100644
--- a/src/registrar/models/domain_information.py
+++ b/src/registrar/models/domain_information.py
@@ -63,7 +63,6 @@ class DomainInformation(TimeStampedModel):
null=True,
blank=True,
related_name="information_portfolio",
- help_text="If blank, domain is not associated with a portfolio.",
)
sub_organization = models.ForeignKey(
diff --git a/src/registrar/models/domain_request.py b/src/registrar/models/domain_request.py
index 35c121f3e..79bc223e9 100644
--- a/src/registrar/models/domain_request.py
+++ b/src/registrar/models/domain_request.py
@@ -327,7 +327,6 @@ class DomainRequest(TimeStampedModel):
null=True,
blank=True,
related_name="DomainRequest_portfolio",
- help_text="If blank, request is not associated with a portfolio.",
)
sub_organization = models.ForeignKey(
From 8d0c1ba6bf43e21d345be2fa3e7f9946edc5346c Mon Sep 17 00:00:00 2001
From: zandercymatics <141044360+zandercymatics@users.noreply.github.com>
Date: Thu, 3 Oct 2024 13:06:12 -0600
Subject: [PATCH 42/42] fix migrations (merge conflict
---
...ve_federalagency_initials_federalagency_acronym_and_more.py} | 2 +-
.../{0130_create_groups_v17.py => 0131_create_groups_v17.py} | 2 +-
...re.py => 0132_alter_domaininformation_portfolio_and_more.py} | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
rename src/registrar/migrations/{0129_remove_federalagency_initials_federalagency_acronym_and_more.py => 0130_remove_federalagency_initials_federalagency_acronym_and_more.py} (98%)
rename src/registrar/migrations/{0130_create_groups_v17.py => 0131_create_groups_v17.py} (95%)
rename src/registrar/migrations/{0131_alter_domaininformation_portfolio_and_more.py => 0132_alter_domaininformation_portfolio_and_more.py} (95%)
diff --git a/src/registrar/migrations/0129_remove_federalagency_initials_federalagency_acronym_and_more.py b/src/registrar/migrations/0130_remove_federalagency_initials_federalagency_acronym_and_more.py
similarity index 98%
rename from src/registrar/migrations/0129_remove_federalagency_initials_federalagency_acronym_and_more.py
rename to src/registrar/migrations/0130_remove_federalagency_initials_federalagency_acronym_and_more.py
index 8371d8136..c0e2a0b22 100644
--- a/src/registrar/migrations/0129_remove_federalagency_initials_federalagency_acronym_and_more.py
+++ b/src/registrar/migrations/0130_remove_federalagency_initials_federalagency_acronym_and_more.py
@@ -8,7 +8,7 @@ import registrar.models.federal_agency
class Migration(migrations.Migration):
dependencies = [
- ("registrar", "0128_alter_domaininformation_state_territory_and_more"),
+ ("registrar", "0129_alter_portfolioinvitation_portfolio_roles_and_more"),
]
operations = [
diff --git a/src/registrar/migrations/0130_create_groups_v17.py b/src/registrar/migrations/0131_create_groups_v17.py
similarity index 95%
rename from src/registrar/migrations/0130_create_groups_v17.py
rename to src/registrar/migrations/0131_create_groups_v17.py
index c7d10693a..04cd5163c 100644
--- a/src/registrar/migrations/0130_create_groups_v17.py
+++ b/src/registrar/migrations/0131_create_groups_v17.py
@@ -25,7 +25,7 @@ def create_groups(apps, schema_editor) -> Any:
class Migration(migrations.Migration):
dependencies = [
- ("registrar", "0129_remove_federalagency_initials_federalagency_acronym_and_more"),
+ ("registrar", "0130_remove_federalagency_initials_federalagency_acronym_and_more"),
]
operations = [
diff --git a/src/registrar/migrations/0131_alter_domaininformation_portfolio_and_more.py b/src/registrar/migrations/0132_alter_domaininformation_portfolio_and_more.py
similarity index 95%
rename from src/registrar/migrations/0131_alter_domaininformation_portfolio_and_more.py
rename to src/registrar/migrations/0132_alter_domaininformation_portfolio_and_more.py
index ee0232a17..e0d2b35f9 100644
--- a/src/registrar/migrations/0131_alter_domaininformation_portfolio_and_more.py
+++ b/src/registrar/migrations/0132_alter_domaininformation_portfolio_and_more.py
@@ -7,7 +7,7 @@ import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
- ("registrar", "0130_create_groups_v17"),
+ ("registrar", "0131_create_groups_v17"),
]
operations = [