This commit is contained in:
zandercymatics 2024-08-19 12:26:14 -06:00
parent 733eee6fcc
commit f587a994f2
No known key found for this signature in database
GPG key ID: FF4636ABEC9682B7
5 changed files with 36 additions and 34 deletions

View file

@ -118,23 +118,6 @@ class FilteredSelectMultipleArrayWidget(FilteredSelectMultiple):
return context 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): class MyUserAdminForm(UserChangeForm):
"""This form utilizes the custom widget for its class's ManyToMany UIs. """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): class PortfolioInvitationAdminForm(UserChangeForm):
"""This form utilizes the custom widget for its class's ManyToMany UIs.""" """This form utilizes the custom widget for its class's ManyToMany UIs."""
@ -1211,8 +1210,10 @@ class UserDomainRoleResource(resources.ModelResource):
class Meta: class Meta:
model = models.UserDomainRole model = models.UserDomainRole
class UserPortfolioPermissionAdmin(ListHeaderAdmin): class UserPortfolioPermissionAdmin(ListHeaderAdmin):
form = UserPortfolioPermissionsForm form = UserPortfolioPermissionsForm
class Meta: class Meta:
"""Contains meta information about this class""" """Contains meta information about this class"""
@ -1227,10 +1228,7 @@ class UserPortfolioPermissionAdmin(ListHeaderAdmin):
"portfolio", "portfolio",
] ]
autocomplete_fields = [ autocomplete_fields = ["user", "portfolio"]
"user",
"portfolio"
]
class UserDomainRoleAdmin(ListHeaderAdmin, ImportExportModelAdmin): class UserDomainRoleAdmin(ListHeaderAdmin, ImportExportModelAdmin):

View file

@ -72,4 +72,4 @@ auditlog.register(Portfolio)
auditlog.register(DomainGroup) auditlog.register(DomainGroup)
auditlog.register(Suborganization) auditlog.register(Suborganization)
auditlog.register(SeniorOfficial) auditlog.register(SeniorOfficial)
auditlog.register(UserPortfolioPermission) auditlog.register(UserPortfolioPermission)

View file

@ -1,16 +1,11 @@
"""People are invited by email to administer domains.""" """People are invited by email to administer domains."""
import logging import logging
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.db import models from django.db import models
from django_fsm import FSMField, transition from django_fsm import FSMField, transition
from waffle import flag_is_active
from registrar.models.user_portfolio_permission import UserPortfolioPermission from registrar.models.user_portfolio_permission import UserPortfolioPermission
from .utility.portfolio_helper import UserPortfolioPermissionChoices, UserPortfolioRoleChoices # type: ignore from .utility.portfolio_helper import UserPortfolioPermissionChoices, UserPortfolioRoleChoices # type: ignore
from .utility.time_stamped_model import TimeStampedModel from .utility.time_stamped_model import TimeStampedModel
from django.contrib.postgres.fields import ArrayField 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.") raise RuntimeError("Cannot find the user to retrieve this portfolio invitation.")
# and create a role for that user on this portfolio # 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: if self.portfolio_roles and len(self.portfolio_roles) > 0:
user_portfolio_permission.portfolio_roles = self.portfolio_roles user_portfolio_permission.portfolio_roles = self.portfolio_roles
if self.portfolio_additional_permissions and len(self.portfolio_additional_permissions) > 0: if self.portfolio_additional_permissions and len(self.portfolio_additional_permissions) > 0:

View file

@ -377,7 +377,9 @@ class User(AbstractUser):
for invitation in PortfolioInvitation.objects.filter( for invitation in PortfolioInvitation.objects.filter(
email__iexact=self.email, status=PortfolioInvitation.PortfolioInvitationStatus.INVITED 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"): if only_single_portfolio or flag_is_active(None, "multiple_portfolios"):
try: try:
invitation.retrieve() invitation.retrieve()
@ -410,6 +412,8 @@ class User(AbstractUser):
def get_user_domain_ids(self, request): def get_user_domain_ids(self, request):
"""Returns either the domains ids associated with this user on UserDomainRole or Portfolio""" """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(): 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: else:
return UserDomainRole.objects.filter(user=self).values_list("domain_id", flat=True) return UserDomainRole.objects.filter(user=self).values_list("domain_id", flat=True)

View file

@ -76,8 +76,9 @@ class UserPortfolioPermission(TimeStampedModel):
def __str__(self): def __str__(self):
return ( return (
f"User '{self.user}' on Portfolio '{self.portfolio}' " f"User '{self.user}' on Portfolio '{self.portfolio}' " f"<Roles: {self.portfolio_roles}>"
f"<Roles: {self.portfolio_roles}>" if self.portfolio_roles
else ""
) )
def _get_portfolio_permissions(self): def _get_portfolio_permissions(self):
@ -95,7 +96,7 @@ class UserPortfolioPermission(TimeStampedModel):
portfolio_permissions.update(self.portfolio_additional_permissions) portfolio_permissions.update(self.portfolio_additional_permissions)
return list(portfolio_permissions) return list(portfolio_permissions)
def clean(self): def clean(self):
"""Extends clean method to perform additional validation, which can raise errors in django admin.""" """Extends clean method to perform additional validation, which can raise errors in django admin."""
super().clean() super().clean()
@ -103,4 +104,6 @@ class UserPortfolioPermission(TimeStampedModel):
if not flag_is_active(None, "multiple_portfolios") and self.pk is None: if not flag_is_active(None, "multiple_portfolios") and self.pk is None:
existing_permissions = UserPortfolioPermission.objects.filter(user=self.user) existing_permissions = UserPortfolioPermission.objects.filter(user=self.user)
if existing_permissions.exists(): 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."
)