Skip to content

Commit

Permalink
Merge pull request #3083 from cisagov/za/2737-members-csv-report
Browse files Browse the repository at this point in the history
#2737: Members csv report - [MEOWARD]
  • Loading branch information
zandercymatics authored Nov 26, 2024
2 parents 8a58070 + d0f0d56 commit d11bffe
Show file tree
Hide file tree
Showing 11 changed files with 682 additions and 72 deletions.
6 changes: 6 additions & 0 deletions src/registrar/config/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
ExportDomainRequestDataFull,
ExportDataTypeUser,
ExportDataTypeRequests,
ExportMembersPortfolio,
)

# --jsons
Expand Down Expand Up @@ -239,6 +240,11 @@
name="get-rejection-email-for-user-json",
),
path("admin/", admin.site.urls),
path(
"reports/export_members_portfolio/",
ExportMembersPortfolio.as_view(),
name="export_members_portfolio",
),
path(
"reports/export_data_type_user/",
ExportDataTypeUser.as_view(),
Expand Down
33 changes: 32 additions & 1 deletion src/registrar/models/user_portfolio_permission.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from django.forms import ValidationError
from registrar.models.user_domain_role import UserDomainRole
from registrar.utility.waffle import flag_is_active_for_user
from registrar.models.utility.portfolio_helper import UserPortfolioPermissionChoices, UserPortfolioRoleChoices
from registrar.models.utility.portfolio_helper import UserPortfolioPermissionChoices, UserPortfolioRoleChoices, DomainRequestPermissionDisplay, MemberPermissionDisplay
from .utility.time_stamped_model import TimeStampedModel
from django.contrib.postgres.fields import ArrayField

Expand Down Expand Up @@ -106,6 +106,37 @@ def get_portfolio_permissions(cls, roles, additional_permissions):
portfolio_permissions.update(additional_permissions)
return list(portfolio_permissions)

@classmethod
def get_domain_request_permission_display(cls, roles, additional_permissions):
"""Class method to return a readable string for domain request permissions"""
# Tracks if they can view, create requests, or not do anything
all_permissions = UserPortfolioPermission.get_portfolio_permissions(roles, additional_permissions)
all_domain_perms = [
UserPortfolioPermissionChoices.VIEW_ALL_REQUESTS,
UserPortfolioPermissionChoices.EDIT_REQUESTS,
]

if all(perm in all_permissions for perm in all_domain_perms):
return DomainRequestPermissionDisplay.VIEWER_REQUESTER
elif UserPortfolioPermissionChoices.VIEW_ALL_REQUESTS in all_permissions:
return DomainRequestPermissionDisplay.VIEWER
else:
return DomainRequestPermissionDisplay.NONE

@classmethod
def get_member_permission_display(cls, roles, additional_permissions):
"""Class method to return a readable string for member permissions"""
# Tracks if they can view, create requests, or not do anything.
# This is different than get_domain_request_permission_display because member tracks
# permissions slightly differently.
all_permissions = UserPortfolioPermission.get_portfolio_permissions(roles, additional_permissions)
if UserPortfolioPermissionChoices.EDIT_MEMBERS in all_permissions:
return MemberPermissionDisplay.MANAGER
elif UserPortfolioPermissionChoices.VIEW_MEMBERS in all_permissions:
return MemberPermissionDisplay.VIEWER
else:
return MemberPermissionDisplay.NONE

def clean(self):
"""Extends clean method to perform additional validation, which can raise errors in django admin."""
super().clean()
Expand Down
8 changes: 8 additions & 0 deletions src/registrar/models/utility/orm_helper.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from django.db.models.expressions import Func


class ArrayRemoveNull(Func):
"""Custom Func to use array_remove to remove null values"""

function = "array_remove"
template = "%(function)s(%(expressions)s, NULL)"
27 changes: 27 additions & 0 deletions src/registrar/models/utility/portfolio_helper.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from registrar.utility import StrEnum
from django.db import models


Expand Down Expand Up @@ -40,3 +41,29 @@ def get_user_portfolio_permission_label(cls, user_portfolio_permission):
@classmethod
def to_dict(cls):
return {key: value.value for key, value in cls.__members__.items()}


class DomainRequestPermissionDisplay(StrEnum):
"""Stores display values for domain request permission combinations.
Overview of values:
- VIEWER_REQUESTER: "Viewer Requester"
- VIEWER: "Viewer"
- NONE: "None"
"""
VIEWER_REQUESTER = "Viewer Requester"
VIEWER = "Viewer"
NONE = "None"


class MemberPermissionDisplay(StrEnum):
"""Stores display values for member permission combinations.
Overview of values:
- MANAGER: "Manager"
- VIEWER: "Viewer"
- NONE: "None"
"""
MANAGER = "Manager"
VIEWER = "Viewer"
NONE = "None"
11 changes: 10 additions & 1 deletion src/registrar/templates/includes/members_table.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
<section class="section-outlined members margin-top-0 section-outlined--border-base-light" id="members">
<div class="section-outlined__header margin-bottom-3 grid-row">
<!-- ---------- SEARCH ---------- -->
<div class="section-outlined__search mobile:grid-col-12 desktop:grid-col-6">
<div class="section-outlined__search mobile:grid-col-12 desktop:grid-col-6 {% if is_widescreen_mode %} section-outlined__search--widescreen {% endif %}">
<section aria-label="Members search component" class="margin-top-2">
<form class="usa-search usa-search--small" method="POST" role="search">
{% csrf_token %}
Expand Down Expand Up @@ -36,6 +36,15 @@
</form>
</section>
</div>
<div class="section-outlined__utility-button mobile-lg:padding-right-105 {% if portfolio %} mobile:grid-col-12 desktop:grid-col-6 desktop:padding-left-3{% endif %}">
<section aria-label="Domains report component" class="margin-top-205">
<a href="{% url 'export_members_portfolio' %}" class="usa-button usa-button--unstyled usa-button--with-icon usa-button--justify-right" role="button">
<svg class="usa-icon usa-icon--big" aria-hidden="true" focusable="false" role="img" width="24" height="24">
<use xlink:href="{%static 'img/sprite.svg'%}#file_download"></use>
</svg>Export as CSV
</a>
</section>
</div>
</div>

<!-- ---------- MAIN TABLE ---------- -->
Expand Down
Loading

0 comments on commit d11bffe

Please sign in to comment.