cleanup pt 2

This commit is contained in:
zandercymatics 2024-12-18 11:51:03 -07:00
parent 437981ff30
commit 08082fb0aa
No known key found for this signature in database
GPG key ID: FF4636ABEC9682B7
5 changed files with 135 additions and 153 deletions

View file

@ -41,7 +41,7 @@ export function initPortfolioNewMemberPageToggle() {
}); });
}); });
} }
}); });
} }
@ -55,28 +55,28 @@ if (!add_member_form){
return; return;
} }
document.getElementById("confirm_new_member_submit").addEventListener("click", function() { document.getElementById("confirm_new_member_submit").addEventListener("click", function() {
// Upon confirmation, submit the form // Upon confirmation, submit the form
document.getElementById("add_member_form").submit(); document.getElementById("add_member_form").submit();
}); });
document.getElementById("add_member_form").addEventListener("submit", function(event) { document.getElementById("add_member_form").addEventListener("submit", function(event) {
event.preventDefault(); // Prevents the form from submitting event.preventDefault(); // Prevents the form from submitting
const form = document.getElementById("add_member_form") const form = document.getElementById("add_member_form")
const formData = new FormData(form); const formData = new FormData(form);
// Check if the form is valid // Check if the form is valid
// If the form is valid, open the confirmation modal // If the form is valid, open the confirmation modal
// If the form is invalid, submit it to trigger error // If the form is invalid, submit it to trigger error
fetch(form.action, { fetch(form.action, {
method: "POST", method: "POST",
body: formData, body: formData,
headers: { headers: {
"X-Requested-With": "XMLHttpRequest", "X-Requested-With": "XMLHttpRequest",
"X-CSRFToken": getCsrfToken() "X-CSRFToken": getCsrfToken()
} }
}) })
.then(response => response.json()) .then(response => response.json())
.then(data => { .then(data => {
if (data.is_valid) { if (data.is_valid) {
// If the form is valid, show the confirmation modal before submitting // If the form is valid, show the confirmation modal before submitting
openAddMemberConfirmationModal(); openAddMemberConfirmationModal();
@ -84,28 +84,28 @@ document.getElementById("add_member_form").addEventListener("submit", function(e
// If the form is not valid, trigger error messages by firing a submit event // If the form is not valid, trigger error messages by firing a submit event
form.submit(); form.submit();
} }
}); });
}); });
/* /*
Helper function to capitalize the first letter in a string (for display purposes) Helper function to capitalize the first letter in a string (for display purposes)
*/ */
function capitalizeFirstLetter(text) { function capitalizeFirstLetter(text) {
if (!text) return ''; // Return empty string if input is falsy if (!text) return ''; // Return empty string if input is falsy
return text.charAt(0).toUpperCase() + text.slice(1); return text.charAt(0).toUpperCase() + text.slice(1);
} }
/* /*
Populates contents of the "Add Member" confirmation modal Populates contents of the "Add Member" confirmation modal
*/ */
function populatePermissionDetails(permission_details_div_id) { function populatePermissionDetails(permission_details_div_id) {
const permissionDetailsContainer = document.getElementById("permission_details"); const permissionDetailsContainer = document.getElementById("permission_details");
permissionDetailsContainer.innerHTML = ""; // Clear previous content permissionDetailsContainer.innerHTML = ""; // Clear previous content
// Get all permission sections (divs with h3 and radio inputs) // Get all permission sections (divs with h3 and radio inputs)
const permissionSections = document.querySelectorAll(`#${permission_details_div_id} > h3`); const permissionSections = document.querySelectorAll(`#${permission_details_div_id} > h3`);
permissionSections.forEach(section => { permissionSections.forEach(section => {
// Find the <h3> element text // Find the <h3> element text
const sectionTitle = section.textContent; const sectionTitle = section.textContent;
@ -137,11 +137,11 @@ function populatePermissionDetails(permission_details_div_id) {
permissionDetailsContainer.appendChild(titleElement); permissionDetailsContainer.appendChild(titleElement);
permissionDetailsContainer.appendChild(permissionElement); permissionDetailsContainer.appendChild(permissionElement);
} }
}); });
} }
/* /*
Updates and opens the "Add Member" confirmation modal. Updates and opens the "Add Member" confirmation modal.
*/ */
function openAddMemberConfirmationModal() { function openAddMemberConfirmationModal() {
//------- Populate modal details //------- Populate modal details

View file

@ -190,3 +190,4 @@
{% endblock portfolio_content%} {% endblock portfolio_content%}

View file

@ -2567,20 +2567,18 @@ class TestPortfolioInviteNewMemberView(TestWithUser, WebTest):
final_response = self.client.post( final_response = self.client.post(
reverse("new-member"), reverse("new-member"),
{ {
"role": "organization_member", "member_access_level": "basic",
"domain_request_permission_member": "view_all_requests", "basic_org_domain_request_permissions": "view_only",
"email": self.new_member_email, "email": self.new_member_email,
}, },
) )
# Ensure the final submission is successful # Ensure the final submission is successful
self.assertEqual(final_response.status_code, 302) # redirects after success self.assertEqual(final_response.status_code, 302) # redirects after success
# Validate Database Changes # Validate Database Changes
portfolio_invite = PortfolioInvitation.objects.filter( portfolio_invite = PortfolioInvitation.objects.filter(
email=self.new_member_email, email=self.new_member_email, portfolio=self.portfolio
portfolio=self.portfolio,
roles__exact=[UserPortfolioRoleChoices.ORGANIZATION_MEMBER],
additional_permissions__exact=[UserPortfolioPermissionChoices.VIEW_ALL_REQUESTS],
).first() ).first()
self.assertIsNotNone(portfolio_invite) self.assertIsNotNone(portfolio_invite)
self.assertEqual(portfolio_invite.email, self.new_member_email) self.assertEqual(portfolio_invite.email, self.new_member_email)
@ -2602,14 +2600,15 @@ class TestPortfolioInviteNewMemberView(TestWithUser, WebTest):
response = self.client.post( response = self.client.post(
reverse("new-member"), reverse("new-member"),
{ {
"role": "organization_member", "member_access_level": "basic",
"domain_request_permission_member": "view_all_requests", "basic_org_domain_request_permissions": "view_only",
"email": self.invited_member_email, "email": self.invited_member_email,
}, },
) )
# Unsucessful form submissions return the same page with a 200 self.assertEqual(response.status_code, 302) # Redirects
self.assertEqual(response.status_code, 200)
self.assertEqual(response.context["form"].errors["email"][0], "An invitation already exists for this user.") # TODO: verify messages
# Validate Database has not changed # Validate Database has not changed
invite_count_after = PortfolioInvitation.objects.count() invite_count_after = PortfolioInvitation.objects.count()
self.assertEqual(invite_count_after, invite_count_before) self.assertEqual(invite_count_after, invite_count_before)
@ -2631,13 +2630,14 @@ class TestPortfolioInviteNewMemberView(TestWithUser, WebTest):
response = self.client.post( response = self.client.post(
reverse("new-member"), reverse("new-member"),
{ {
"role": "organization_member", "member_access_level": "basic",
"domain_request_permissions_member": "view_all_requests", "basic_org_domain_request_permissions": "view_only",
"email": self.user.email, "email": self.user.email,
}, },
) )
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 302) # Redirects
self.assertEqual(response.context["form"].errors["email"][0], "User is already a member of this portfolio.")
# TODO: verify messages
# Validate Database has not changed # Validate Database has not changed
invite_count_after = PortfolioInvitation.objects.count() invite_count_after = PortfolioInvitation.objects.count()
@ -2645,6 +2645,7 @@ class TestPortfolioInviteNewMemberView(TestWithUser, WebTest):
class TestEditPortfolioMemberView(WebTest): class TestEditPortfolioMemberView(WebTest):
"""Tests for the edit member page on portfolios"""
def setUp(self): def setUp(self):
self.user = create_user() self.user = create_user()

View file

@ -466,24 +466,6 @@ class PortfolioBasePermission(PermissionsLoginMixin):
return self.request.user.is_org_user(self.request) return self.request.user.is_org_user(self.request)
class PortfolioInvitationCreatePermission(PortfolioBasePermission):
"""Permission mixin that redirects to portfolio pages if user
has access, otherwise 403"""
def has_permission(self):
"""Check if this user has access to this portfolio.
The user is in self.request.user and the portfolio can be looked
up from the portfolio's primary key in self.kwargs["pk"]
"""
has_perm = super().has_permission()
if not has_perm:
return False
portfolio = self.request.session.get("portfolio")
return self.request.user.has_edit_members_portfolio_permission(portfolio)
class PortfolioDomainsPermission(PortfolioBasePermission): class PortfolioDomainsPermission(PortfolioBasePermission):
"""Permission mixin that allows access to portfolio domain pages if user """Permission mixin that allows access to portfolio domain pages if user
has access, otherwise 403""" has access, otherwise 403"""

View file

@ -3,7 +3,6 @@
import abc # abstract base class import abc # abstract base class
from django.views.generic import DetailView, DeleteView, TemplateView, UpdateView from django.views.generic import DetailView, DeleteView, TemplateView, UpdateView
from registrar.models import Domain, DomainRequest, DomainInvitation, Portfolio from registrar.models import Domain, DomainRequest, DomainInvitation, Portfolio
from registrar.models.portfolio_invitation import PortfolioInvitation
from registrar.models.user import User from registrar.models.user import User
from registrar.models.user_domain_role import UserDomainRole from registrar.models.user_domain_role import UserDomainRole
@ -15,7 +14,6 @@ from .mixins import (
DomainRequestWizardPermission, DomainRequestWizardPermission,
PortfolioDomainRequestsPermission, PortfolioDomainRequestsPermission,
PortfolioDomainsPermission, PortfolioDomainsPermission,
PortfolioInvitationCreatePermission,
PortfolioMemberDomainsPermission, PortfolioMemberDomainsPermission,
PortfolioMemberDomainsEditPermission, PortfolioMemberDomainsEditPermission,
PortfolioMemberEditPermission, PortfolioMemberEditPermission,