diff --git a/src/registrar/admin.py b/src/registrar/admin.py index 85adeb663..c91bbde48 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -118,23 +118,6 @@ class FilteredSelectMultipleArrayWidget(FilteredSelectMultiple): return context -class UserPortfolioPermissionsForm(forms.ModelForm): - class Meta: - model = models.UserPortfolioPermission - fields = "__all__" - field_classes = {"username": UsernameField} - widgets = { - "portfolio_roles": FilteredSelectMultipleArrayWidget( - "portfolio_roles", is_stacked=False, choices=UserPortfolioRoleChoices.choices - ), - "portfolio_additional_permissions": FilteredSelectMultipleArrayWidget( - "portfolio_additional_permissions", - is_stacked=False, - choices=UserPortfolioPermissionChoices.choices, - ), - } - - class MyUserAdminForm(UserChangeForm): """This form utilizes the custom widget for its class's ManyToMany UIs. @@ -178,6 +161,22 @@ class MyUserAdminForm(UserChangeForm): ) +class UserPortfolioPermissionsForm(forms.ModelForm): + class Meta: + model = models.UserPortfolioPermission + fields = "__all__" + widgets = { + "portfolio_roles": FilteredSelectMultipleArrayWidget( + "portfolio_roles", is_stacked=False, choices=UserPortfolioRoleChoices.choices + ), + "portfolio_additional_permissions": FilteredSelectMultipleArrayWidget( + "portfolio_additional_permissions", + is_stacked=False, + choices=UserPortfolioPermissionChoices.choices, + ), + } + + class PortfolioInvitationAdminForm(UserChangeForm): """This form utilizes the custom widget for its class's ManyToMany UIs.""" @@ -1211,8 +1210,10 @@ class UserDomainRoleResource(resources.ModelResource): class Meta: model = models.UserDomainRole + class UserPortfolioPermissionAdmin(ListHeaderAdmin): form = UserPortfolioPermissionsForm + class Meta: """Contains meta information about this class""" @@ -1227,10 +1228,7 @@ class UserPortfolioPermissionAdmin(ListHeaderAdmin): "portfolio", ] - autocomplete_fields = [ - "user", - "portfolio" - ] + autocomplete_fields = ["user", "portfolio"] class UserDomainRoleAdmin(ListHeaderAdmin, ImportExportModelAdmin): diff --git a/src/registrar/models/__init__.py b/src/registrar/models/__init__.py index 944eeafdb..c1023cafe 100644 --- a/src/registrar/models/__init__.py +++ b/src/registrar/models/__init__.py @@ -72,4 +72,4 @@ auditlog.register(Portfolio) auditlog.register(DomainGroup) auditlog.register(Suborganization) auditlog.register(SeniorOfficial) -auditlog.register(UserPortfolioPermission) \ No newline at end of file +auditlog.register(UserPortfolioPermission) diff --git a/src/registrar/models/portfolio_invitation.py b/src/registrar/models/portfolio_invitation.py index 04c571298..de7bda893 100644 --- a/src/registrar/models/portfolio_invitation.py +++ b/src/registrar/models/portfolio_invitation.py @@ -1,16 +1,11 @@ """People are invited by email to administer domains.""" import logging - from django.contrib.auth import get_user_model from django.db import models - from django_fsm import FSMField, transition -from waffle import flag_is_active - from registrar.models.user_portfolio_permission import UserPortfolioPermission from .utility.portfolio_helper import UserPortfolioPermissionChoices, UserPortfolioRoleChoices # type: ignore - from .utility.time_stamped_model import TimeStampedModel from django.contrib.postgres.fields import ArrayField @@ -90,7 +85,9 @@ class PortfolioInvitation(TimeStampedModel): raise RuntimeError("Cannot find the user to retrieve this portfolio invitation.") # and create a role for that user on this portfolio - user_portfolio_permission, _ = UserPortfolioPermission.objects.get_or_create(portfolio=self.portfolio, user=user) + user_portfolio_permission, _ = UserPortfolioPermission.objects.get_or_create( + portfolio=self.portfolio, user=user + ) if self.portfolio_roles and len(self.portfolio_roles) > 0: user_portfolio_permission.portfolio_roles = self.portfolio_roles if self.portfolio_additional_permissions and len(self.portfolio_additional_permissions) > 0: diff --git a/src/registrar/models/user.py b/src/registrar/models/user.py index 21e7e196f..084b1926a 100644 --- a/src/registrar/models/user.py +++ b/src/registrar/models/user.py @@ -377,7 +377,9 @@ class User(AbstractUser): for invitation in PortfolioInvitation.objects.filter( email__iexact=self.email, status=PortfolioInvitation.PortfolioInvitationStatus.INVITED ): - only_single_portfolio = not flag_is_active(None, "multiple_portfolios") and self.last_selected_portfolio is None + only_single_portfolio = ( + not flag_is_active(None, "multiple_portfolios") and self.last_selected_portfolio is None + ) if only_single_portfolio or flag_is_active(None, "multiple_portfolios"): try: invitation.retrieve() @@ -410,6 +412,8 @@ class User(AbstractUser): def get_user_domain_ids(self, request): """Returns either the domains ids associated with this user on UserDomainRole or Portfolio""" if self.is_org_user(request) and self.has_view_all_domains_permission(): - return DomainInformation.objects.filter(portfolio=self.last_selected_portfolio).values_list("domain_id", flat=True) + return DomainInformation.objects.filter(portfolio=self.last_selected_portfolio).values_list( + "domain_id", flat=True + ) else: return UserDomainRole.objects.filter(user=self).values_list("domain_id", flat=True) diff --git a/src/registrar/models/user_portfolio_permission.py b/src/registrar/models/user_portfolio_permission.py index 44d1199fc..77639f569 100644 --- a/src/registrar/models/user_portfolio_permission.py +++ b/src/registrar/models/user_portfolio_permission.py @@ -76,8 +76,9 @@ class UserPortfolioPermission(TimeStampedModel): def __str__(self): return ( - f"User '{self.user}' on Portfolio '{self.portfolio}' " - f"" + f"User '{self.user}' on Portfolio '{self.portfolio}' " f"" + if self.portfolio_roles + else "" ) def _get_portfolio_permissions(self): @@ -95,7 +96,7 @@ class UserPortfolioPermission(TimeStampedModel): portfolio_permissions.update(self.portfolio_additional_permissions) return list(portfolio_permissions) - + def clean(self): """Extends clean method to perform additional validation, which can raise errors in django admin.""" super().clean() @@ -103,4 +104,6 @@ class UserPortfolioPermission(TimeStampedModel): if not flag_is_active(None, "multiple_portfolios") and self.pk is None: existing_permissions = UserPortfolioPermission.objects.filter(user=self.user) if existing_permissions.exists(): - raise ValidationError("Only one portfolio permission is allowed per user when multiple portfolios are disabled.") + raise ValidationError( + "Only one portfolio permission is allowed per user when multiple portfolios are disabled." + )