diff --git a/src/registrar/admin.py b/src/registrar/admin.py
index e3bd5c9f76..fb830378ca 100644
--- a/src/registrar/admin.py
+++ b/src/registrar/admin.py
@@ -963,7 +963,9 @@ def change_view(self, request, object_id, form_url="", extra_context=None):
domain_ids = user_domain_roles.values_list("domain_id", flat=True)
domains = Domain.objects.filter(id__in=domain_ids).exclude(state=Domain.State.DELETED)
- extra_context = {"domain_requests": domain_requests, "domains": domains}
+ portfolio_ids = obj.get_portfolios().values_list("portfolio", flat=True)
+ portfolios = models.Portfolio.objects.filter(id__in=portfolio_ids)
+ extra_context = {"domain_requests": domain_requests, "domains": domains, "portfolios": portfolios}
return super().change_view(request, object_id, form_url, extra_context)
diff --git a/src/registrar/models/user.py b/src/registrar/models/user.py
index 5c3d934245..05cd1f4563 100644
--- a/src/registrar/models/user.py
+++ b/src/registrar/models/user.py
@@ -298,6 +298,9 @@ def portfolio_role_summary(self, portfolio):
return roles
+ def get_portfolios(self):
+ return self.portfolio_permissions.all()
+
@classmethod
def needs_identity_verification(cls, email, uuid):
"""A method used by our oidc classes to test whether a user needs email/uuid verification
diff --git a/src/registrar/templates/django/admin/user_change_form.html b/src/registrar/templates/django/admin/user_change_form.html
index c0ddd8cafa..736f12ba46 100644
--- a/src/registrar/templates/django/admin/user_change_form.html
+++ b/src/registrar/templates/django/admin/user_change_form.html
@@ -17,6 +17,26 @@
{% endblock %}
{% block after_related_objects %}
+ {% if portfolios %}
+
+
Portfolio information
+
+
+ {% endif %}
+
Associated requests and domains
diff --git a/src/registrar/tests/test_admin.py b/src/registrar/tests/test_admin.py
index 25d7e5fd20..83114b3b34 100644
--- a/src/registrar/tests/test_admin.py
+++ b/src/registrar/tests/test_admin.py
@@ -2,6 +2,7 @@
from django.utils import timezone
from django.test import TestCase, RequestFactory, Client
from django.contrib.admin.sites import AdminSite
+from django_webtest import WebTest # type: ignore
from api.tests.common import less_console_noise_decorator
from django.urls import reverse
from registrar.admin import (
@@ -41,13 +42,12 @@
TransitionDomain,
Portfolio,
Suborganization,
+ UserPortfolioPermission,
+ UserDomainRole,
+ SeniorOfficial,
+ PortfolioInvitation,
+ VerifiedByStaff,
)
-from registrar.models.portfolio_invitation import PortfolioInvitation
-from registrar.models.senior_official import SeniorOfficial
-from registrar.models.user_domain_role import UserDomainRole
-from registrar.models.user_portfolio_permission import UserPortfolioPermission
-from registrar.models.utility.portfolio_helper import UserPortfolioPermissionChoices, UserPortfolioRoleChoices
-from registrar.models.verified_by_staff import VerifiedByStaff
from .common import (
MockDbForSharedTests,
AuditedAdminMockData,
@@ -60,10 +60,11 @@
multiple_unalphabetical_domain_objects,
GenericTestHelper,
)
+from registrar.models.utility.portfolio_helper import UserPortfolioPermissionChoices, UserPortfolioRoleChoices
from django.contrib.sessions.backends.db import SessionStore
from django.contrib.auth import get_user_model
from unittest.mock import ANY, patch, Mock
-from django_webtest import WebTest # type: ignore
+
import logging
@@ -973,7 +974,7 @@ def test_get_filters(self):
)
-class TestMyUserAdmin(MockDbForSharedTests):
+class TestMyUserAdmin(MockDbForSharedTests, WebTest):
"""Tests for the MyUserAdmin class as super or staff user
Notes:
@@ -993,6 +994,7 @@ def setUpClass(cls):
def setUp(self):
super().setUp()
+ self.app.set_user(self.superuser.username)
self.client = Client(HTTP_HOST="localhost:8080")
def tearDown(self):
@@ -1227,6 +1229,20 @@ def test_analyst_cannot_see_selects_for_portfolio_role_and_permissions_in_user_f
self.assertNotContains(response, "Portfolio roles:")
self.assertNotContains(response, "Portfolio additional permissions:")
+ @less_console_noise_decorator
+ def test_user_can_see_related_portfolios(self):
+ """Tests if a user can see the portfolios they are associated with on the user page"""
+ portfolio, _ = Portfolio.objects.get_or_create(organization_name="test", creator=self.superuser)
+ permission, _ = UserPortfolioPermission.objects.get_or_create(
+ user=self.superuser, portfolio=portfolio, roles=[UserPortfolioRoleChoices.ORGANIZATION_ADMIN]
+ )
+ response = self.app.get(reverse("admin:registrar_user_change", args=[self.superuser.pk]))
+ expected_href = reverse("admin:registrar_portfolio_change", args=[portfolio.pk])
+ self.assertContains(response, expected_href)
+ self.assertContains(response, str(portfolio))
+ permission.delete()
+ portfolio.delete()
+
class AuditedAdminTest(TestCase):