diff --git a/atst/routes/applications/settings.py b/atst/routes/applications/settings.py index 309d684f..e12a66f9 100644 --- a/atst/routes/applications/settings.py +++ b/atst/routes/applications/settings.py @@ -7,45 +7,53 @@ from atst.domain.applications import Applications from atst.forms.app_settings import EnvironmentRolesForm from atst.forms.application import ApplicationForm, EditEnvironmentForm from atst.domain.authz.decorator import user_can_access_decorator as user_can +from atst.models.environment_role import CSPRole from atst.domain.exceptions import NotFoundError - from atst.models.permissions import Permissions from atst.utils.flash import formatted_flash as flash def get_environments_obj_for_app(application): - environments_obj = {} - + environments_obj = [] for env in application.environments: - environments_obj[env.name] = { - "edit_form": EditEnvironmentForm(obj=env), + env_data = { "id": env.id, - "members": [], + "name": env.name, + "edit_form": EditEnvironmentForm(obj=env), + "members_form": EnvironmentRolesForm(data=data_for_env_members_form(env)), + "members": sort_env_users_by_role(env), } - for user in env.users: - env_role = EnvironmentRoles.get(user.id, env.id) - environments_obj[env.name]["members"].append( - {"name": user.full_name, "role": env_role.displayname} - ) + environments_obj.append(env_data) return environments_obj -def serialize_env_member_form_data(application): - environments_list = [] - for env in application.environments: - env_info = {"env_id": env.id, "team_roles": []} - for user in env.users: - env_role = EnvironmentRoles.get(user.id, env.id) - env_info["team_roles"].append( - { - "name": user.full_name, - "user_id": user.id, - "role": env_role.displayname, - } +def sort_env_users_by_role(env): + users_dict = {"no_access": []} + for role in CSPRole: + users_dict[role.value] = [] + + for user in env.application.users: + if user in env.users: + role = EnvironmentRoles.get(user.id, env.id) + users_dict[role.displayname].append( + {"name": user.full_name, "user_id": user.id} ) - environments_list.append(env_info) - return environments_list + else: + users_dict["no_access"].append({"name": user.full_name, "user_id": user.id}) + + return users_dict + + +def data_for_env_members_form(environment): + data = {"env_id": environment.id, "team_roles": []} + for user in environment.users: + env_role = EnvironmentRoles.get(user.id, environment.id) + data["team_roles"].append( + {"name": user.full_name, "user_id": user.id, "role": env_role.displayname} + ) + + return data def check_users_are_in_application(user_ids, application): @@ -62,18 +70,12 @@ def settings(application_id): # refactor like portfolio admin render function application = Applications.get(application_id) form = ApplicationForm(name=application.name, description=application.description) - app_envs_data = serialize_env_member_form_data(application) - - env_forms = {} - for env_data in app_envs_data: - env_forms[env_data["env_id"]] = EnvironmentRolesForm(data=env_data) return render_template( "portfolios/applications/settings.html", application=application, form=form, environments_obj=get_environments_obj_for_app(application=application), - env_forms=env_forms, ) @@ -116,17 +118,11 @@ def update(application_id): ) ) else: - env_data = serialize_env_member_form_data(application) - env_forms = {} - for data in env_data: - env_forms[data["env_id"]] = EnvironmentRolesForm(data=data) - return render_template( "portfolios/applications/settings.html", application=application, form=form, environments_obj=get_environments_obj_for_app(application=application), - env_forms=env_forms, ) @@ -167,7 +163,6 @@ def update_env_roles(environment_id): name=application.name, description=application.description ), environments_obj=get_environments_obj_for_app(application=application), - env_forms=env_roles_form, ) diff --git a/styles/sections/_application_edit.scss b/styles/sections/_application_edit.scss index ce05522f..c11c2f87 100644 --- a/styles/sections/_application_edit.scss +++ b/styles/sections/_application_edit.scss @@ -17,3 +17,45 @@ margin-right: -$gap; } } + +.app-team-settings-link { + font-size: $small-font-size; + font-weight: $font-normal; + padding-left: $gap * 2; +} + +.environment-role { + padding: $gap * 3; + + h4 { + margin-bottom: $gap / 4; + } + + .environment-role__users { + background-color: $color-gray-lightest; + padding: ($gap * 1.2) ($gap * 0.6); + font-size: $small-font-size; + display: flex; + flex-wrap: wrap; + + .environment-role__user { + background-color: $color-white; + border-radius: 0.5rem; + padding: ($gap / 2) $gap; + border: solid 2px $color-blue; + margin: $gap; + white-space: nowrap; + width: 20rem; + + &.unassigned { + border: solid 1px $color-gray-light; + } + } + + .environment-role__no-user { + margin: $gap; + padding: ($gap / 2) $gap; + font-weight: $font-normal; + } + } +} diff --git a/templates/fragments/applications/edit_environments.html b/templates/fragments/applications/edit_environments.html index 607d854e..3532ff1e 100644 --- a/templates/fragments/applications/edit_environments.html +++ b/templates/fragments/applications/edit_environments.html @@ -3,6 +3,28 @@ {% from "components/text_input.html" import TextInput %} {% from "components/save_button.html" import SaveButton %} +{% macro RolePanel(users=[], role='no_access') %} + {% if role == 'no_access' %} + {% set role = 'Unassigned (No Access)' %} + {% set unassigned = True %} + {% endif %} + +
+

{{ role }}

+ +
+{% endmacro %} +
@@ -22,12 +44,16 @@