From 50ceaa39de666cf473e0c535b20e2fbeafb0230e Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Thu, 5 Sep 2019 16:09:26 -0400 Subject: [PATCH] Move team table into app settings page --- atst/routes/applications/settings.py | 59 ++++++++ .../portfolios/applications/settings.html | 143 ++++++++++++++++++ 2 files changed, 202 insertions(+) diff --git a/atst/routes/applications/settings.py b/atst/routes/applications/settings.py index 9e748651..fa4616a8 100644 --- a/atst/routes/applications/settings.py +++ b/atst/routes/applications/settings.py @@ -5,12 +5,16 @@ from atst.domain.environments import Environments from atst.domain.applications import Applications from atst.domain.audit_log import AuditLog from atst.domain.common import Paginator +from atst.domain.environment_roles import EnvironmentRoles from atst.forms.app_settings import AppEnvRolesForm from atst.forms.application import ApplicationForm, EditEnvironmentForm +from atst.forms.application_member import NewForm as NewMemberForm from atst.forms.data import ENV_ROLE_NO_ACCESS as NO_ACCESS +from atst.forms.team import TeamForm from atst.domain.authz.decorator import user_can_access_decorator as user_can from atst.models.environment_role import CSPRole from atst.models.permissions import Permissions +from atst.domain.permission_sets import PermissionSets from atst.utils.flash import formatted_flash as flash @@ -79,12 +83,65 @@ def data_for_app_env_roles_form(application): return {"envs": nested_data} +def get_form_permission_value(member, edit_perm_set): + if member.has_permission_set(edit_perm_set): + return edit_perm_set + else: + return PermissionSets.VIEW_APPLICATION + + +def get_team_form(application): + team_data = [] + for member in application.members: + permission_sets = { + "perms_team_mgmt": get_form_permission_value( + member, PermissionSets.EDIT_APPLICATION_TEAM + ), + "perms_env_mgmt": get_form_permission_value( + member, PermissionSets.EDIT_APPLICATION_ENVIRONMENTS + ), + "perms_del_env": get_form_permission_value( + member, PermissionSets.DELETE_APPLICATION_ENVIRONMENTS + ), + } + roles = EnvironmentRoles.get_for_application_member(member.id) + environment_roles = [ + { + "environment_id": str(role.environment.id), + "environment_name": role.environment.name, + "role": role.role, + } + for role in roles + ] + team_data.append( + { + "role_id": member.id, + "user_name": member.user_name, + "permission_sets": permission_sets, + "environment_roles": environment_roles, + } + ) + + return TeamForm(data={"members": team_data}) + + +def get_new_member_form(application): + env_roles = [ + {"environment_id": e.id, "environment_name": e.name} + for e in application.environments + ] + + return NewMemberForm(data={"environment_roles": env_roles}) + + def render_settings_page(application, **kwargs): environments_obj = get_environments_obj_for_app(application=application) members_form = AppEnvRolesForm(data=data_for_app_env_roles_form(application)) new_env_form = EditEnvironmentForm() pagination_opts = Paginator.get_pagination_opts(http_request) audit_events = AuditLog.get_application_events(application, pagination_opts) + team_form = get_team_form(application) + new_member_form = get_new_member_form(application) if "application_form" not in kwargs: kwargs["application_form"] = ApplicationForm( @@ -98,6 +155,8 @@ def render_settings_page(application, **kwargs): members_form=members_form, new_env_form=new_env_form, audit_events=audit_events, + team_form=team_form, + new_member_form=new_member_form, **kwargs, ) diff --git a/templates/portfolios/applications/settings.html b/templates/portfolios/applications/settings.html index f715ea8e..939e0063 100644 --- a/templates/portfolios/applications/settings.html +++ b/templates/portfolios/applications/settings.html @@ -3,7 +3,9 @@ {% from "components/alert.html" import Alert %} {% from "components/delete_confirmation.html" import DeleteConfirmation %} {% from "components/icon.html" import Icon %} +{% import "fragments/applications/new_member_modal_content.html" as member_steps %} {% from "components/modal.html" import Modal %} +{% from "components/multi_step_modal_form.html" import MultiStepModalForm %} {% from "components/pagination.html" import Pagination %} {% from "components/save_button.html" import SaveButton %} {% from "components/text_input.html" import TextInput %} @@ -81,6 +83,147 @@ {% endif %} + {% if not application.members %} + {% set user_can_invite = user_can(permissions.CREATE_APPLICATION_MEMBER) %} + +
+

{{ ("portfolios.applications.team_settings.blank_slate.title" | translate) }}

+ + {{ Icon('avatar') }} + + {% if not user_can_invite %} +

{{ ("portfolios.applications.team_settings.blank_slate.sub_message" | translate) }}

+ {% endif %} + + {% if user_can_invite %} + {% set new_member_modal_name = "add-app-mem" %} + + {{ "portfolios.applications.team_settings.blank_slate.action_label" | translate }} + + {{ MultiStepModalForm( + name=new_member_modal_name, + form=new_member_form, + form_action=url_for("applications.create_member", application_id=application.id), + steps=[ + member_steps.MemberStepOne(new_member_form), + member_steps.MemberStepTwo(new_member_form, application) + ], + ) }} + {% endif %} +
+ + {% else %} +
+ {{ 'portfolios.applications.team_settings.subheading' | translate }} +
+ +
+ +
+
+ {% if g.matchesPath("application-members") %} + {% include "fragments/flash.html" %} + {% endif %} +
+
+
+
+ {{ "portfolios.applications.team_settings.section.title" | translate({ "application_name": application.name }) }} +

Members ({{ team_form.members | length }})

+
+
+
+
+ +
+
+
+ {{ "common.name" | translate }} +
+
+ {{ "portfolios.applications.team_settings.section.table.team_management" | translate }} +
+
+ {{ "portfolios.applications.team_settings.section.table.environment_management" | translate }} +
+
+ {{ "portfolios.applications.team_settings.section.table.delete_access" | translate }} +
+
+   +
+
+
    + {% if user_can(permissions.EDIT_APPLICATION_MEMBER) %} + {% include "fragments/applications/edit_team.html" %} + {% elif user_can(permissions.VIEW_APPLICATION_MEMBER) %} + {% include "fragments/applications/read_only_team.html" %} + {% endif %} +
+
+ + +
+
+
+ + {% if user_can(permissions.DELETE_APPLICATION_MEMBER) %} + {% for member_form in team_form.members %} + {% set delete_modal_id = "delete-user-{}".format(member_form.id) %} + {% call Modal(name=delete_modal_id) %} +

+ {{ "portfolios.applications.remove_member.header" | translate }} +

+ + {{ + Alert( + title=("components.modal.destructive_title" | translate), + message=("portfolios.applications.remove_member.alert.message" | translate({"user_name": member_form.user_name.data})), + level="warning" + ) + }} + + {{ + DeleteConfirmation( + modal_id=delete_modal_id, + delete_text=('portfolios.applications.remove_member.button' | translate), + delete_action=url_for('applications.remove_member', application_id=application.id, application_role_id=member_form.data.role_id), + form=member_form + ) + }} + {% endcall %} + {% endfor %} + {% endif %} + + {% if user_can(permissions.CREATE_APPLICATION_MEMBER) %} + {% import "fragments/applications/new_member_modal_content.html" as member_steps %} + {{ MultiStepModalForm( + name=new_member_modal_name, + form=new_member_form, + form_action=url_for("applications.create_member", application_id=application.id), + steps=[ + member_steps.MemberStepOne(new_member_form), + member_steps.MemberStepTwo(new_member_form, application) + ], + ) }} + {% endif %} +
+ {% endif %} +
{% if g.matchesPath("application-environments") %}