diff --git a/atst/models/portfolio_role.py b/atst/models/portfolio_role.py index eb589157..a0c19bc0 100644 --- a/atst/models/portfolio_role.py +++ b/atst/models/portfolio_role.py @@ -7,6 +7,7 @@ from atst.models import Base, mixins from .types import Id from atst.database import db +from atst.utils import first_or_none from atst.models.environment_role import EnvironmentRole from atst.models.application import Application from atst.models.environment import Environment @@ -111,6 +112,11 @@ class PortfolioRole(Base, mixins.TimestampsMixin, mixins.AuditableMixin): else: return MEMBER_STATUSES["unknown"] + def has_permission_set(self, perm_set_name): + return first_or_none( + lambda prms: prms.name == perm_set_name, self.permission_sets + ) + @property def has_dod_id_error(self): return self.latest_invitation and self.latest_invitation.is_rejected_wrong_user diff --git a/atst/routes/portfolios/index.py b/atst/routes/portfolios/index.py index 367b0883..fbbffd27 100644 --- a/atst/routes/portfolios/index.py +++ b/atst/routes/portfolios/index.py @@ -10,6 +10,7 @@ from atst.domain.authz import Authorization from atst.domain.common import Paginator from atst.forms.portfolio import PortfolioForm from atst.models.permissions import Permissions +from atst.domain.permission_sets import PermissionSets @portfolios_bp.route("/portfolios") @@ -22,6 +23,20 @@ def portfolios(): return render_template("portfolios/blank_slate.html") +def serialize_member(member): + return { + "member": member, + "app_mgmt": member.has_permission_set( + PermissionSets.EDIT_PORTFOLIO_APPLICATION_MANAGEMENT + ), + "funding": member.has_permission_set(PermissionSets.EDIT_PORTFOLIO_FUNDING), + "reporting": member.has_permission_set(PermissionSets.EDIT_PORTFOLIO_REPORTS), + "portfolio_mgmt": member.has_permission_set( + PermissionSets.EDIT_PORTFOLIO_ADMIN + ), + } + + @portfolios_bp.route("/portfolios//admin") def portfolio_admin(portfolio_id): portfolio = Portfolios.get_for_update_information(g.current_user, portfolio_id) @@ -30,12 +45,14 @@ def portfolio_admin(portfolio_id): audit_events = AuditLog.get_portfolio_events( g.current_user, portfolio, pagination_opts ) + members_data = [serialize_member(member) for member in portfolio.members] return render_template( "portfolios/admin.html", form=form, portfolio=portfolio, audit_events=audit_events, user=g.current_user, + members_data=members_data, ) diff --git a/templates/fragments/admin/portfolio_members.html b/templates/fragments/admin/portfolio_members.html index b7de6530..b9301368 100644 --- a/templates/fragments/admin/portfolio_members.html +++ b/templates/fragments/admin/portfolio_members.html @@ -35,17 +35,17 @@ - {% for member in portfolio.members %} + {% for member_data in members_data %} - {{ member.user_name }} - {% if member.user == user %} + {{ member_data.member.user_name }} + {% if member_data.member.user == user %} (you) {% endif %} - {% set heading_perms = ['edit_application', 'view_portfolio_funding', 'view_portfolio_reports', 'edit_portfolio_name'] %} + {% set heading_perms = [member_data.app_mgmt, member_data.funding, member_data.reporting, member_data.portfolio_mgmt] %} - {% for perm in heading_perms %} - {% if perm in member.permissions %} + {% for has_perm in heading_perms %} + {% if has_perm %} Edit Access {% else %} View Only