From a5e96b93bf39f41bd30b7b9ddbd9202d8119ddcf Mon Sep 17 00:00:00 2001 From: Abe Alam <143724440+abe-alam-ecs@users.noreply.github.com> Date: Mon, 23 Jun 2025 17:47:13 -0400 Subject: [PATCH] #3829: Return an alphabetized list in /admin and in-registrar on various fields - [aa] (#3878) * Correcting sort in Admin: Domains, Portfolios * Adding ordering to Suborganization table * Validated user-facing ordering in Domain Request Suborganization dropdown * Adding test for alphabetization --------- Co-authored-by: CocoByte --- .../0151_alter_suborganization_options.py | 17 +++++++++++++++++ src/registrar/models/portfolio.py | 2 +- src/registrar/models/suborganization.py | 3 +++ src/registrar/tests/test_admin.py | 11 ++++++++++- src/registrar/views/utility/api_views.py | 2 +- 5 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 src/registrar/migrations/0151_alter_suborganization_options.py diff --git a/src/registrar/migrations/0151_alter_suborganization_options.py b/src/registrar/migrations/0151_alter_suborganization_options.py new file mode 100644 index 000000000..a2296925f --- /dev/null +++ b/src/registrar/migrations/0151_alter_suborganization_options.py @@ -0,0 +1,17 @@ +# Generated by Django 4.2.20 on 2025-06-16 19:58 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("registrar", "0150_remove_domainrequest_eop_stakeholder_first_name_and_more"), + ] + + operations = [ + migrations.AlterModelOptions( + name="suborganization", + options={"ordering": ["name"]}, + ), + ] diff --git a/src/registrar/models/portfolio.py b/src/registrar/models/portfolio.py index 9607736f2..82935cfeb 100644 --- a/src/registrar/models/portfolio.py +++ b/src/registrar/models/portfolio.py @@ -192,4 +192,4 @@ class Portfolio(TimeStampedModel): # == Getters for suborganization == # def get_suborganizations(self): """Returns all suborganizations associated with this portfolio""" - return self.portfolio_suborganizations.all() + return self.portfolio_suborganizations.all().order_by("name") diff --git a/src/registrar/models/suborganization.py b/src/registrar/models/suborganization.py index 087490244..c9f874697 100644 --- a/src/registrar/models/suborganization.py +++ b/src/registrar/models/suborganization.py @@ -9,6 +9,9 @@ class Suborganization(TimeStampedModel): Suborganization under an organization (portfolio) """ + class Meta: + ordering = ["name"] + name = models.CharField( unique=True, max_length=1000, diff --git a/src/registrar/tests/test_admin.py b/src/registrar/tests/test_admin.py index 2e4b1adbe..132ff7091 100644 --- a/src/registrar/tests/test_admin.py +++ b/src/registrar/tests/test_admin.py @@ -9,6 +9,7 @@ from registrar.utility.errors import MissingEmailError from waffle.testutils import override_flag from django_webtest import WebTest # type: ignore from api.tests.common import less_console_noise_decorator +from bs4 import BeautifulSoup from django.urls import reverse from registrar.admin import ( DomainAdmin, @@ -4166,14 +4167,22 @@ class TestPortfolioAdmin(TestCase): @less_console_noise_decorator def test_suborganizations_display(self): """Tests the custom suborg field which displays all related suborgs""" - Suborganization.objects.create(name="Sub1", portfolio=self.portfolio) Suborganization.objects.create(name="Sub2", portfolio=self.portfolio) + Suborganization.objects.create(name="Sub1", portfolio=self.portfolio) + Suborganization.objects.create(name="Sub5", portfolio=self.portfolio) + Suborganization.objects.create(name="Sub3", portfolio=self.portfolio) + Suborganization.objects.create(name="Sub4", portfolio=self.portfolio) suborganizations = self.admin.suborganizations(self.portfolio) self.assertIn("Sub1", suborganizations) self.assertIn("Sub2", suborganizations) self.assertIn('