From 199f669fad40fb8cbf5dd1120303b1cab19d65ec Mon Sep 17 00:00:00 2001 From: Rebecca Hsieh Date: Mon, 21 Oct 2024 16:42:02 -0700 Subject: [PATCH] Try to add domain counting logic --- src/registrar/assets/js/get-gov.js | 33 ++++++++++++------- src/registrar/models/user.py | 8 +++++ src/registrar/views/portfolio_members_json.py | 20 +++++++++++ 3 files changed, 49 insertions(+), 12 deletions(-) diff --git a/src/registrar/assets/js/get-gov.js b/src/registrar/assets/js/get-gov.js index d0da73f2c..a775347a3 100644 --- a/src/registrar/assets/js/get-gov.js +++ b/src/registrar/assets/js/get-gov.js @@ -1943,13 +1943,14 @@ class MembersTable extends LoadTableBase { extraActionsHeader.setAttribute('role', 'columnheader'); extraActionsHeader.setAttribute('class', 'extra-actions-header'); extraActionsHeader.innerHTML = ` - Cancel invitation`; + Extra Actions`; let tableHeaderRow = document.querySelector('#members thead tr'); tableHeaderRow.appendChild(extraActionsHeader); } data.members.forEach(member => { const member_name = member.name; + const member_email = member.email; const member_display = member.member_display; const options = { year: 'numeric', month: 'short', day: 'numeric' }; @@ -1963,15 +1964,26 @@ class MembersTable extends LoadTableBase { const member_id = member.id; let isMemberInvited = !last_active || last_active === 'Invited'; let cancelInvitationButton = isMemberInvited ? "Cancel invitation" : "Remove member"; - - let modalHeading = 'asdasdasd'; - let modalDescription = 'asdasdasdasdasd'; + + // TODO: Create a function to fetch how many domains the member MANAGES + // Created get_user_domain_count figure out how to call here and maybe view? + // let modalHeading = ''; + // let modalDescription = ''; + // If member manages 1 or more domains: + let modalHeading = `Are you sure you want to delete ${member_email}?`; + let modalDescription = `${member_email} current manages COUNTHERE domains in the organization \n + Removing them from the organization will remove all of their domains. They will no longer be able to \n + access this organization. This action cannot be undone.`; + // If member manages no domains: + // modalHeading = `Are you sure you want to delete ${member_email}?`; + // modalDescription = `They will no longer be able to access this organization. \n + // This action cannot be undone.`; const modalSubmit = ` + name="">Yes, remove from organizaion ` const modal = document.createElement('div'); @@ -1979,7 +1991,7 @@ class MembersTable extends LoadTableBase { modal.setAttribute('id', `toggle-remove-member-${member_id}`); modal.setAttribute('aria-labelledby', 'Are you sure you want to continue?'); modal.setAttribute('aria-describedby', 'Member will be removed'); - modal.setAttribute('data-force-action', ''); + modal.setAttribute('data-force-action', ''); modal.innerHTML = `
@@ -2023,7 +2035,6 @@ class MembersTable extends LoadTableBase { ` this.tableWrapper.appendChild(modal); - kebob = ` Admin` @@ -2142,8 +2151,8 @@ class MembersTable extends LoadTableBase { pageToDisplay--; } - // Use the PK - // and call a separate function that triggers a new backend AJAX call to remove or delete + // TODO: Use the PK to call a separate function that triggers a new backend AJAX call + // to delete their UserDomainRoles only for this portfolio + remove their UserPortfolioPermissions alert('modal submit') }); diff --git a/src/registrar/models/user.py b/src/registrar/models/user.py index 80c972d38..5489eda86 100644 --- a/src/registrar/models/user.py +++ b/src/registrar/models/user.py @@ -471,3 +471,11 @@ def get_user_domain_request_ids(self, request): return DomainRequest.objects.filter(portfolio=portfolio).values_list("id", flat=True) else: return UserDomainRole.objects.filter(user=self).values_list("id", flat=True) + + # def get_user_domain_count(self, request): + # """Returns the count of domains associated with this user on UserDomainRole or Portfolio""" + # portfolio = request.session.get("portfolio") + # if self.is_org_user(request) and self.has_view_all_domains_portfolio_permission(portfolio): + # return DomainInformation.objects.filter(portfolio=portfolio).count() + # else: + # return UserDomainRole.objects.filter(user=self).count() diff --git a/src/registrar/views/portfolio_members_json.py b/src/registrar/views/portfolio_members_json.py index d2f2276cf..8f42e6fa5 100644 --- a/src/registrar/views/portfolio_members_json.py +++ b/src/registrar/views/portfolio_members_json.py @@ -9,6 +9,8 @@ from registrar.models.portfolio_invitation import PortfolioInvitation from registrar.models.user_portfolio_permission import UserPortfolioPermission from registrar.models.utility.portfolio_helper import UserPortfolioRoleChoices +from registrar.models import DomainInformation, UserDomainRole +from .models import User @login_required @@ -169,3 +171,21 @@ def serialize_members(request, portfolio, item, user): "svg_icon": ("visibility" if view_only else "settings"), } return member_json + + +def get_user_domain_count(request, user_id): + """Returns the count of domains associated with the specified user on UserDomainRole or Portfolio""" + # Fetch the target user based on the user_id provided + try: + target_user = User.objects.get(id=user_id) + except User.DoesNotExist: + return JsonResponse({"error": "User not found."}, status=404) + + portfolio = request.session.get("portfolio") + + if target_user.is_org_user(request) and target_user.has_view_all_domains_portfolio_permission(portfolio): + domain_count = DomainInformation.objects.filter(portfolio=portfolio).count() + else: + domain_count = UserDomainRole.objects.filter(user=target_user).count() + + return JsonResponse({"domain_count": domain_count})