From 08a273c296c85f907022c55dee2a573f7e6f4c61 Mon Sep 17 00:00:00 2001 From: David Kennedy Date: Tue, 8 Oct 2024 14:48:11 -0400 Subject: [PATCH] linted --- src/registrar/forms/portfolio.py | 15 +- src/registrar/models/portfolio_invitation.py | 5 +- .../models/user_portfolio_permission.py | 7 +- src/registrar/tests/test_models.py | 28 +++- .../tests/test_views_members_json.py | 9 +- src/registrar/tests/test_views_portfolio.py | 44 ++--- src/registrar/views/portfolio_members_json.py | 88 +++++----- src/registrar/views/portfolios.py | 150 +++++++++++------- src/registrar/views/utility/mixins.py | 4 +- .../views/utility/permission_views.py | 4 +- 10 files changed, 210 insertions(+), 144 deletions(-) diff --git a/src/registrar/forms/portfolio.py b/src/registrar/forms/portfolio.py index 51f53340c..b8984023a 100644 --- a/src/registrar/forms/portfolio.py +++ b/src/registrar/forms/portfolio.py @@ -99,7 +99,7 @@ class PortfolioSeniorOfficialForm(forms.ModelForm): cleaned_data = super().clean() cleaned_data.pop("full_name", None) return cleaned_data - + class PortfolioMemberForm(forms.ModelForm): """ @@ -108,18 +108,18 @@ class PortfolioMemberForm(forms.ModelForm): roles = forms.MultipleChoiceField( choices=UserPortfolioRoleChoices.choices, - widget=forms.SelectMultiple(attrs={'class': 'usa-select'}), + widget=forms.SelectMultiple(attrs={"class": "usa-select"}), required=False, label="Roles", ) additional_permissions = forms.MultipleChoiceField( choices=UserPortfolioPermissionChoices.choices, - widget=forms.SelectMultiple(attrs={'class': 'usa-select'}), + widget=forms.SelectMultiple(attrs={"class": "usa-select"}), required=False, label="Additional Permissions", ) - + class Meta: model = UserPortfolioPermission fields = [ @@ -135,22 +135,21 @@ class PortfolioInvitedMemberForm(forms.ModelForm): roles = forms.MultipleChoiceField( choices=UserPortfolioRoleChoices.choices, - widget=forms.SelectMultiple(attrs={'class': 'usa-select'}), + widget=forms.SelectMultiple(attrs={"class": "usa-select"}), required=False, label="Roles", ) additional_permissions = forms.MultipleChoiceField( choices=UserPortfolioPermissionChoices.choices, - widget=forms.SelectMultiple(attrs={'class': 'usa-select'}), + widget=forms.SelectMultiple(attrs={"class": "usa-select"}), required=False, label="Additional Permissions", ) - + class Meta: model = PortfolioInvitation fields = [ "roles", "additional_permissions", ] - diff --git a/src/registrar/models/portfolio_invitation.py b/src/registrar/models/portfolio_invitation.py index 2c8caaee3..b1f22ae83 100644 --- a/src/registrar/models/portfolio_invitation.py +++ b/src/registrar/models/portfolio_invitation.py @@ -72,11 +72,10 @@ class PortfolioInvitation(TimeStampedModel): """Return the count of domain invitations managed by the invited user for this portfolio.""" # Filter the UserDomainRole model to get domains where the user has a manager role managed_domains = DomainInvitation.objects.filter( - email=self.email, - domain__domain_info__portfolio=self.portfolio + email=self.email, domain__domain_info__portfolio=self.portfolio ).count() return managed_domains - + def get_portfolio_permissions(self): """ Retrieve the permissions for the user's portfolio roles from the invite. diff --git a/src/registrar/models/user_portfolio_permission.py b/src/registrar/models/user_portfolio_permission.py index 847df7857..80771ca4b 100644 --- a/src/registrar/models/user_portfolio_permission.py +++ b/src/registrar/models/user_portfolio_permission.py @@ -6,6 +6,7 @@ from registrar.models.utility.portfolio_helper import UserPortfolioPermissionCho from .utility.time_stamped_model import TimeStampedModel from django.contrib.postgres.fields import ArrayField + class UserPortfolioPermission(TimeStampedModel): """This is a linking table that connects a user with a role on a portfolio.""" @@ -71,12 +72,10 @@ class UserPortfolioPermission(TimeStampedModel): """Return the count of domains managed by the user for this portfolio.""" # Filter the UserDomainRole model to get domains where the user has a manager role managed_domains = UserDomainRole.objects.filter( - user=self.user, - role=UserDomainRole.Roles.MANAGER, - domain__domain_info__portfolio=self.portfolio + user=self.user, role=UserDomainRole.Roles.MANAGER, domain__domain_info__portfolio=self.portfolio ).count() return managed_domains - + def _get_portfolio_permissions(self): """ Retrieve the permissions for the user's portfolio roles. diff --git a/src/registrar/tests/test_models.py b/src/registrar/tests/test_models.py index 905c0a06b..f565c001e 100644 --- a/src/registrar/tests/test_models.py +++ b/src/registrar/tests/test_models.py @@ -1284,8 +1284,12 @@ class TestPortfolioInvitations(TestCase): domain_in_portfolio, _ = Domain.objects.get_or_create(name="domain_in_portfolio.gov", state=Domain.State.READY) DomainInformation.objects.get_or_create(creator=self.user, domain=domain_in_portfolio, portfolio=self.portfolio) # domain_in_portfolio_and_invited should be included in the count - domain_in_portfolio_and_invited, _ = Domain.objects.get_or_create(name="domain_in_portfolio_and_invited.gov", state=Domain.State.READY) - DomainInformation.objects.get_or_create(creator=self.user, domain=domain_in_portfolio_and_invited, portfolio=self.portfolio) + domain_in_portfolio_and_invited, _ = Domain.objects.get_or_create( + name="domain_in_portfolio_and_invited.gov", state=Domain.State.READY + ) + DomainInformation.objects.get_or_create( + creator=self.user, domain=domain_in_portfolio_and_invited, portfolio=self.portfolio + ) DomainInvitation.objects.get_or_create(email=self.email, domain=domain_in_portfolio_and_invited) # domain_invited should not be included in the count domain_invited, _ = Domain.objects.get_or_create(name="domain_invited.gov", state=Domain.State.READY) @@ -1302,8 +1306,12 @@ class TestPortfolioInvitations(TestCase): # Arrange test_permission_list = set() # add the arrays that are defined in UserPortfolioPermission for member and admin - test_permission_list.update(UserPortfolioPermission.PORTFOLIO_ROLE_PERMISSIONS.get(UserPortfolioRoleChoices.ORGANIZATION_MEMBER, [])) - test_permission_list.update(UserPortfolioPermission.PORTFOLIO_ROLE_PERMISSIONS.get(UserPortfolioRoleChoices.ORGANIZATION_ADMIN, [])) + test_permission_list.update( + UserPortfolioPermission.PORTFOLIO_ROLE_PERMISSIONS.get(UserPortfolioRoleChoices.ORGANIZATION_MEMBER, []) + ) + test_permission_list.update( + UserPortfolioPermission.PORTFOLIO_ROLE_PERMISSIONS.get(UserPortfolioRoleChoices.ORGANIZATION_ADMIN, []) + ) # add the permissions that are added to the invitation as additional_permissions test_permission_list.update([self.portfolio_permission_1, self.portfolio_permission_2]) perm_list = list(test_permission_list) @@ -1393,9 +1401,15 @@ class TestUserPortfolioPermission(TestCase): domain_in_portfolio, _ = Domain.objects.get_or_create(name="domain_in_portfolio.gov", state=Domain.State.READY) DomainInformation.objects.get_or_create(creator=self.user, domain=domain_in_portfolio, portfolio=portfolio) # domain_in_portfolio_and_managed should be included in the count - domain_in_portfolio_and_managed, _ = Domain.objects.get_or_create(name="domain_in_portfolio_and_managed.gov", state=Domain.State.READY) - DomainInformation.objects.get_or_create(creator=self.user, domain=domain_in_portfolio_and_managed, portfolio=portfolio) - UserDomainRole.objects.get_or_create(user=test_user, domain=domain_in_portfolio_and_managed, role=UserDomainRole.Roles.MANAGER) + domain_in_portfolio_and_managed, _ = Domain.objects.get_or_create( + name="domain_in_portfolio_and_managed.gov", state=Domain.State.READY + ) + DomainInformation.objects.get_or_create( + creator=self.user, domain=domain_in_portfolio_and_managed, portfolio=portfolio + ) + UserDomainRole.objects.get_or_create( + user=test_user, domain=domain_in_portfolio_and_managed, role=UserDomainRole.Roles.MANAGER + ) # domain_managed should not be included in the count domain_managed, _ = Domain.objects.get_or_create(name="domain_managed.gov", state=Domain.State.READY) DomainInformation.objects.get_or_create(creator=self.user, domain=domain_managed) diff --git a/src/registrar/tests/test_views_members_json.py b/src/registrar/tests/test_views_members_json.py index a79d81274..9cd4e823c 100644 --- a/src/registrar/tests/test_views_members_json.py +++ b/src/registrar/tests/test_views_members_json.py @@ -109,7 +109,14 @@ class GetPortfolioMembersJsonTest(TestWithUser, WebTest): self.assertEqual(len(data["members"]), 5) # Check member fields - expected_emails = {self.user.email, self.user2.email, self.user3.email, self.user4.email, self.user4.email, self.email5} + expected_emails = { + self.user.email, + self.user2.email, + self.user3.email, + self.user4.email, + self.user4.email, + self.email5, + } actual_emails = {member["email"] for member in data["members"]} self.assertEqual(expected_emails, actual_emails) diff --git a/src/registrar/tests/test_views_portfolio.py b/src/registrar/tests/test_views_portfolio.py index f2dc784f7..13173565c 100644 --- a/src/registrar/tests/test_views_portfolio.py +++ b/src/registrar/tests/test_views_portfolio.py @@ -885,7 +885,7 @@ class TestPortfolio(WebTest): response = self.client.get(reverse("member", kwargs={"pk": 1}), follow=True) # Make sure the page is denied self.assertEqual(response.status_code, 403) - + @less_console_noise_decorator @override_flag("organization_feature", active=True) @override_flag("organization_members", active=True) @@ -917,10 +917,10 @@ class TestPortfolio(WebTest): self.assertContains(response, "This member does not manage any domains.") # Assert buttons and links within the page are correct - self.assertNotContains(response, "usa-button--more-actions") # test that 3 dot is not present - self.assertNotContains(response, "sprite.svg#edit") # test that Edit link is not present - self.assertNotContains(response, "sprite.svg#settings") # test that Manage link is not present - self.assertContains(response, "sprite.svg#visibility") # test that View link is present + self.assertNotContains(response, "usa-button--more-actions") # test that 3 dot is not present + self.assertNotContains(response, "sprite.svg#edit") # test that Edit link is not present + self.assertNotContains(response, "sprite.svg#settings") # test that Manage link is not present + self.assertContains(response, "sprite.svg#visibility") # test that View link is present @less_console_noise_decorator @override_flag("organization_feature", active=True) @@ -950,13 +950,15 @@ class TestPortfolio(WebTest): self.assertContains(response, "Admin access") self.assertContains(response, "View all requests plus create requests") self.assertContains(response, "View all members plus manage members") - self.assertContains(response, "This member does not manage any domains. To assign this member a domain, click \"Manage\"") + self.assertContains( + response, 'This member does not manage any domains. To assign this member a domain, click "Manage"' + ) # Assert buttons and links within the page are correct - self.assertContains(response, "usa-button--more-actions") # test that 3 dot is present - self.assertContains(response, "sprite.svg#edit") # test that Edit link is present - self.assertContains(response, "sprite.svg#settings") # test that Manage link is present - self.assertNotContains(response, "sprite.svg#visibility") # test that View link is not present + self.assertContains(response, "usa-button--more-actions") # test that 3 dot is present + self.assertContains(response, "sprite.svg#edit") # test that Edit link is present + self.assertContains(response, "sprite.svg#settings") # test that Manage link is present + self.assertNotContains(response, "sprite.svg#visibility") # test that View link is not present @less_console_noise_decorator @override_flag("organization_feature", active=True) @@ -987,7 +989,7 @@ class TestPortfolio(WebTest): response = self.client.get(reverse("invitedmember", kwargs={"pk": 1}), follow=True) # Make sure the page is denied self.assertEqual(response.status_code, 403) - + @less_console_noise_decorator @override_flag("organization_feature", active=True) @override_flag("organization_members", active=True) @@ -1027,10 +1029,10 @@ class TestPortfolio(WebTest): self.assertContains(response, "This member does not manage any domains.") # Assert buttons and links within the page are correct - self.assertNotContains(response, "usa-button--more-actions") # test that 3 dot is not present - self.assertNotContains(response, "sprite.svg#edit") # test that Edit link is not present - self.assertNotContains(response, "sprite.svg#settings") # test that Manage link is not present - self.assertContains(response, "sprite.svg#visibility") # test that View link is present + self.assertNotContains(response, "usa-button--more-actions") # test that 3 dot is not present + self.assertNotContains(response, "sprite.svg#edit") # test that Edit link is not present + self.assertNotContains(response, "sprite.svg#settings") # test that Manage link is not present + self.assertContains(response, "sprite.svg#visibility") # test that View link is present @less_console_noise_decorator @override_flag("organization_feature", active=True) @@ -1068,13 +1070,15 @@ class TestPortfolio(WebTest): self.assertContains(response, "Admin access") self.assertContains(response, "View all requests plus create requests") self.assertContains(response, "View all members plus manage members") - self.assertContains(response, "This member does not manage any domains. To assign this member a domain, click \"Manage\"") + self.assertContains( + response, 'This member does not manage any domains. To assign this member a domain, click "Manage"' + ) # Assert buttons and links within the page are correct - self.assertContains(response, "usa-button--more-actions") # test that 3 dot is present - self.assertContains(response, "sprite.svg#edit") # test that Edit link is present - self.assertContains(response, "sprite.svg#settings") # test that Manage link is present - self.assertNotContains(response, "sprite.svg#visibility") # test that View link is not present + self.assertContains(response, "usa-button--more-actions") # test that 3 dot is present + self.assertContains(response, "sprite.svg#edit") # test that Edit link is present + self.assertContains(response, "sprite.svg#settings") # test that Manage link is present + self.assertNotContains(response, "sprite.svg#visibility") # test that View link is not present @less_console_noise_decorator @override_flag("organization_feature", active=True) diff --git a/src/registrar/views/portfolio_members_json.py b/src/registrar/views/portfolio_members_json.py index 8b81a26a9..948baa07a 100644 --- a/src/registrar/views/portfolio_members_json.py +++ b/src/registrar/views/portfolio_members_json.py @@ -2,14 +2,11 @@ from datetime import datetime from django.http import JsonResponse from django.core.paginator import Paginator from django.contrib.auth.decorators import login_required -from django.db.models import Q from django.urls import reverse from registrar.models.portfolio_invitation import PortfolioInvitation -from registrar.models.user import User from registrar.models.user_portfolio_permission import UserPortfolioPermission from registrar.models.utility.portfolio_helper import UserPortfolioRoleChoices -from operator import itemgetter @login_required @@ -18,21 +15,25 @@ def get_portfolio_members_json(request): get all members that are associated with the given portfolio""" portfolio = request.GET.get("portfolio") - permissions = UserPortfolioPermission.objects.filter(portfolio=portfolio).select_related("user").values_list("pk", "user__first_name", "user__last_name", "user__email", "user__last_login", "roles") + permissions = ( + UserPortfolioPermission.objects.filter(portfolio=portfolio) + .select_related("user") + .values_list("pk", "user__first_name", "user__last_name", "user__email", "user__last_login", "roles") + ) invitations = PortfolioInvitation.objects.filter(portfolio=portfolio).values_list( - 'pk', 'email', 'roles', 'additional_permissions', 'status' + "pk", "email", "roles", "additional_permissions", "status" ) # Convert the permissions queryset into a list of dictionaries permission_list = [ { - 'id': perm[0], - 'first_name': perm[1], - 'last_name': perm[2], - 'email': perm[3], - 'last_active': perm[4], - 'roles': perm[5], - 'source': 'permission' # Mark the source as permissions + "id": perm[0], + "first_name": perm[1], + "last_name": perm[2], + "email": perm[3], + "last_active": perm[4], + "roles": perm[5], + "source": "permission", # Mark the source as permissions } for perm in permissions ] @@ -40,15 +41,15 @@ def get_portfolio_members_json(request): # Convert the invitations queryset into a list of dictionaries invitation_list = [ { - 'id': invite[0], - 'first_name': None, # No first name in invitations - 'last_name': None, # No last name in invitations - 'email': invite[1], - 'roles': invite[2], - 'additional_permissions': invite[3], - 'status': invite[4], - 'last_active': 'Invited', - 'source': 'invitation' # Mark the source as invitations + "id": invite[0], + "first_name": None, # No first name in invitations + "last_name": None, # No last name in invitations + "email": invite[1], + "roles": invite[2], + "additional_permissions": invite[3], + "status": invite[4], + "last_active": "Invited", + "source": "invitation", # Mark the source as invitations } for invite in invitations ] @@ -64,12 +65,8 @@ def get_portfolio_members_json(request): paginator = Paginator(combined_list, 10) page_number = request.GET.get("page", 1) page_obj = paginator.get_page(page_number) - - - members = [ - serialize_members(request, portfolio, item, request.user) - for item in page_obj.object_list - ] + + members = [serialize_members(request, portfolio, item, request.user) for item in page_obj.object_list] return JsonResponse( { @@ -90,12 +87,13 @@ def apply_search(data_list, request): if search_term: # Filter the list based on the search term (case-insensitive) data_list = [ - item for item in data_list - if search_term in (item.get('first_name', '') or '').lower() - or search_term in (item.get('last_name', '') or '').lower() - or search_term in (item.get('email', '') or '').lower() + item + for item in data_list + if search_term in (item.get("first_name", "") or "").lower() + or search_term in (item.get("last_name", "") or "").lower() + or search_term in (item.get("email", "") or "").lower() ] - + return data_list @@ -115,11 +113,11 @@ def apply_sorting(data_list, request): # Second element: the actual value to sort by if value is None: return (2, value) # Position None last - if value == 'Invited': + if value == "Invited": return (1, value) # Position 'Invited' before None but after valid datetimes if isinstance(value, datetime): return (0, value) # Position valid datetime values first - + # Default case: return the value as is for comparison return value @@ -144,22 +142,22 @@ def serialize_members(request, portfolio, item, user): # ------- USER STATUSES is_admin = False - if item['roles']: - is_admin = UserPortfolioRoleChoices.ORGANIZATION_ADMIN in item['roles'] + if item["roles"]: + is_admin = UserPortfolioRoleChoices.ORGANIZATION_ADMIN in item["roles"] - action_url = '#' - if item['source'] == 'permission': - action_url = reverse("member", kwargs={"pk": item['id']}) - elif item['source'] == 'invitation': - action_url = reverse("invitedmember", kwargs={"pk": item['id']}) + action_url = "#" + if item["source"] == "permission": + action_url = reverse("member", kwargs={"pk": item["id"]}) + elif item["source"] == "invitation": + action_url = reverse("invitedmember", kwargs={"pk": item["id"]}) # ------- SERIALIZE member_json = { - "id": item['id'], - "name": (item['first_name'] or '') + ' ' + (item['last_name'] or ''), - "email": item['email'], + "id": item["id"], + "name": (item["first_name"] or "") + " " + (item["last_name"] or ""), + "email": item["email"], "is_admin": is_admin, - "last_active": item['last_active'], + "last_active": item["last_active"], "action_url": action_url, "action_label": ("View" if view_only else "Manage"), "svg_icon": ("visibility" if view_only else "settings"), diff --git a/src/registrar/views/portfolios.py b/src/registrar/views/portfolios.py index cd7923668..cc1a09b25 100644 --- a/src/registrar/views/portfolios.py +++ b/src/registrar/views/portfolios.py @@ -3,7 +3,12 @@ from django.http import Http404 from django.shortcuts import render from django.urls import reverse from django.contrib import messages -from registrar.forms.portfolio import PortfolioInvitedMemberForm, PortfolioMemberForm, PortfolioOrgAddressForm, PortfolioSeniorOfficialForm +from registrar.forms.portfolio import ( + PortfolioInvitedMemberForm, + PortfolioMemberForm, + PortfolioOrgAddressForm, + PortfolioSeniorOfficialForm, +) from registrar.models import Portfolio, User from registrar.models.portfolio_invitation import PortfolioInvitation from registrar.models.user_portfolio_permission import UserPortfolioPermission @@ -65,22 +70,34 @@ class PortfolioMemberView(PortfolioMemberPermissionView, View): member = portfolio_permission.user # We have to explicitely name these with member_ otherwise we'll have conflicts with context preprocessors - member_has_view_all_requests_portfolio_permission = member.has_view_all_requests_portfolio_permission(portfolio_permission.portfolio) - member_has_edit_request_portfolio_permission = member.has_edit_request_portfolio_permission(portfolio_permission.portfolio) - member_has_view_members_portfolio_permission = member.has_view_members_portfolio_permission(portfolio_permission.portfolio) - member_has_edit_members_portfolio_permission = member.has_edit_members_portfolio_permission(portfolio_permission.portfolio) + member_has_view_all_requests_portfolio_permission = member.has_view_all_requests_portfolio_permission( + portfolio_permission.portfolio + ) + member_has_edit_request_portfolio_permission = member.has_edit_request_portfolio_permission( + portfolio_permission.portfolio + ) + member_has_view_members_portfolio_permission = member.has_view_members_portfolio_permission( + portfolio_permission.portfolio + ) + member_has_edit_members_portfolio_permission = member.has_edit_members_portfolio_permission( + portfolio_permission.portfolio + ) + + return render( + request, + self.template_name, + { + "edit_url": reverse("member-permissions", args=[pk]), + "portfolio_permission": portfolio_permission, + "member": member, + "member_has_view_all_requests_portfolio_permission": member_has_view_all_requests_portfolio_permission, + "member_has_edit_request_portfolio_permission": member_has_edit_request_portfolio_permission, + "member_has_view_members_portfolio_permission": member_has_view_members_portfolio_permission, + "member_has_edit_members_portfolio_permission": member_has_edit_members_portfolio_permission, + }, + ) - return render(request, self.template_name, { - 'edit_url': reverse('member-permissions', args=[pk]), - 'portfolio_permission': portfolio_permission, - 'member': member, - 'member_has_view_all_requests_portfolio_permission': member_has_view_all_requests_portfolio_permission, - 'member_has_edit_request_portfolio_permission': member_has_edit_request_portfolio_permission, - 'member_has_view_members_portfolio_permission': member_has_view_members_portfolio_permission, - 'member_has_edit_members_portfolio_permission': member_has_edit_members_portfolio_permission - }) - class PortfolioMemberEditView(PortfolioMemberEditPermissionView, View): template_name = "portfolio_member_permissions.html" @@ -89,29 +106,37 @@ class PortfolioMemberEditView(PortfolioMemberEditPermissionView, View): def get(self, request, pk): portfolio_permission = get_object_or_404(UserPortfolioPermission, pk=pk) user = portfolio_permission.user - + form = self.form_class(instance=portfolio_permission) - - return render(request, self.template_name, { - 'form': form, - 'member': user, - }) + + return render( + request, + self.template_name, + { + "form": form, + "member": user, + }, + ) def post(self, request, pk): portfolio_permission = get_object_or_404(UserPortfolioPermission, pk=pk) user = portfolio_permission.user - + form = self.form_class(request.POST, instance=portfolio_permission) - + if form.is_valid(): form.save() - return redirect('member', pk=pk) - - return render(request, self.template_name, { - 'form': form, - 'member': user, # Pass the user object again to the template - }) - + return redirect("member", pk=pk) + + return render( + request, + self.template_name, + { + "form": form, + "member": user, # Pass the user object again to the template + }, + ) + class PortfolioInvitedMemberView(PortfolioInvitedMemberPermissionView, View): @@ -123,19 +148,31 @@ class PortfolioInvitedMemberView(PortfolioInvitedMemberPermissionView, View): # form = self.form_class(instance=portfolio_invitation) # We have to explicitely name these with member_ otherwise we'll have conflicts with context preprocessors - member_has_view_all_requests_portfolio_permission = UserPortfolioPermissionChoices.VIEW_ALL_REQUESTS in portfolio_invitation.get_portfolio_permissions() - member_has_edit_request_portfolio_permission = UserPortfolioPermissionChoices.EDIT_REQUESTS in portfolio_invitation.get_portfolio_permissions() - member_has_view_members_portfolio_permission = UserPortfolioPermissionChoices.VIEW_MEMBERS in portfolio_invitation.get_portfolio_permissions() - member_has_edit_members_portfolio_permission = UserPortfolioPermissionChoices.EDIT_MEMBERS in portfolio_invitation.get_portfolio_permissions() + member_has_view_all_requests_portfolio_permission = ( + UserPortfolioPermissionChoices.VIEW_ALL_REQUESTS in portfolio_invitation.get_portfolio_permissions() + ) + member_has_edit_request_portfolio_permission = ( + UserPortfolioPermissionChoices.EDIT_REQUESTS in portfolio_invitation.get_portfolio_permissions() + ) + member_has_view_members_portfolio_permission = ( + UserPortfolioPermissionChoices.VIEW_MEMBERS in portfolio_invitation.get_portfolio_permissions() + ) + member_has_edit_members_portfolio_permission = ( + UserPortfolioPermissionChoices.EDIT_MEMBERS in portfolio_invitation.get_portfolio_permissions() + ) - return render(request, self.template_name, { - 'edit_url': reverse('invitedmember-permissions', args=[pk]), - 'portfolio_invitation': portfolio_invitation, - 'member_has_view_all_requests_portfolio_permission': member_has_view_all_requests_portfolio_permission, - 'member_has_edit_request_portfolio_permission': member_has_edit_request_portfolio_permission, - 'member_has_view_members_portfolio_permission': member_has_view_members_portfolio_permission, - 'member_has_edit_members_portfolio_permission': member_has_edit_members_portfolio_permission - }) + return render( + request, + self.template_name, + { + "edit_url": reverse("invitedmember-permissions", args=[pk]), + "portfolio_invitation": portfolio_invitation, + "member_has_view_all_requests_portfolio_permission": member_has_view_all_requests_portfolio_permission, + "member_has_edit_request_portfolio_permission": member_has_edit_request_portfolio_permission, + "member_has_view_members_portfolio_permission": member_has_view_members_portfolio_permission, + "member_has_edit_members_portfolio_permission": member_has_edit_members_portfolio_permission, + }, + ) class PortfolioInvitedMemberEditView(PortfolioInvitedMemberEditPermissionView, View): @@ -147,23 +184,30 @@ class PortfolioInvitedMemberEditView(PortfolioInvitedMemberEditPermissionView, V portfolio_invitation = get_object_or_404(PortfolioInvitation, pk=pk) form = self.form_class(instance=portfolio_invitation) - return render(request, self.template_name, { - 'form': form, - 'invitation': portfolio_invitation, - }) + return render( + request, + self.template_name, + { + "form": form, + "invitation": portfolio_invitation, + }, + ) def post(self, request, pk): portfolio_invitation = get_object_or_404(PortfolioInvitation, pk=pk) form = self.form_class(request.POST, instance=portfolio_invitation) if form.is_valid(): form.save() - return redirect('invitedmember', pk=pk) - - return render(request, self.template_name, { - 'form': form, - 'invitation': portfolio_invitation, # Pass the user object again to the template - }) - + return redirect("invitedmember", pk=pk) + + return render( + request, + self.template_name, + { + "form": form, + "invitation": portfolio_invitation, # Pass the user object again to the template + }, + ) class PortfolioNoDomainsView(NoPortfolioDomainsPermissionView, View): diff --git a/src/registrar/views/utility/mixins.py b/src/registrar/views/utility/mixins.py index 94fc0b1c5..70b7d64a7 100644 --- a/src/registrar/views/utility/mixins.py +++ b/src/registrar/views/utility/mixins.py @@ -515,7 +515,7 @@ class PortfolioMemberPermission(PortfolioBasePermission): return False return super().has_permission() - + class PortfolioMemberEditPermission(PortfolioBasePermission): """Permission mixin that allows access to portfolio member pages if user @@ -551,7 +551,7 @@ class PortfolioInvitedMemberPermission(PortfolioBasePermission): return False return super().has_permission() - + class PortfolioInvitedMemberEditPermission(PortfolioBasePermission): """Permission mixin that allows access to portfolio invited member pages if user diff --git a/src/registrar/views/utility/permission_views.py b/src/registrar/views/utility/permission_views.py index 6fb7fee50..c1d25d691 100644 --- a/src/registrar/views/utility/permission_views.py +++ b/src/registrar/views/utility/permission_views.py @@ -288,7 +288,9 @@ class PortfolioInvitedMemberPermissionView(PortfolioInvitedMemberPermission, Por """ -class PortfolioInvitedMemberEditPermissionView(PortfolioInvitedMemberEditPermission, PortfolioBasePermissionView, abc.ABC): +class PortfolioInvitedMemberEditPermissionView( + PortfolioInvitedMemberEditPermission, PortfolioBasePermissionView, abc.ABC +): """Abstract base view for portfolio member edit views that enforces permissions. This abstract view cannot be instantiated. Actual views must specify