From bdb1cc9ce5b8e4749cdf80fe65cc165390f2b64d Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Thu, 25 Apr 2019 15:37:06 -0400 Subject: [PATCH 1/7] Add in users without access to env team info --- atst/routes/applications/settings.py | 48 ++++++++++---------- tests/routes/applications/test_settings.py | 51 +++++++++++----------- 2 files changed, 50 insertions(+), 49 deletions(-) diff --git a/atst/routes/applications/settings.py b/atst/routes/applications/settings.py index a7628ade..66ea8075 100644 --- a/atst/routes/applications/settings.py +++ b/atst/routes/applications/settings.py @@ -29,19 +29,31 @@ def get_environments_obj_for_app(application): return environments_obj -def serialize_env_member_form_data(application): +def serialize_env_member_forms(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, - } - ) + env_info = {"env_name": env.name, "no_access": []} + env_team_list = [] + + for user in application.users: + if user in env.users: + env_role = EnvironmentRoles.get(user.id, env.id) + env_team_list.append( + { + "name": user.full_name, + "user_id": user.id, + "role": env_role.displayname, + } + ) + else: + env_info["no_access"].append( + {"name": user.full_name, "user_id": user.id} + ) + + env_info["form"] = EnvironmentRolesForm( + data={"env_id": env.id, "team_roles": env_team_list} + ) environments_list.append(env_info) return environments_list @@ -52,18 +64,13 @@ 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, + env_forms=serialize_env_member_forms(application=application), ) @@ -106,17 +113,12 @@ 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, + env_forms=serialize_env_member_forms(application=application), ) diff --git a/tests/routes/applications/test_settings.py b/tests/routes/applications/test_settings.py index 6423e68e..18ffd06d 100644 --- a/tests/routes/applications/test_settings.py +++ b/tests/routes/applications/test_settings.py @@ -98,44 +98,43 @@ def test_edit_application_environments_obj(app, client, user_session): def test_edit_app_serialize_env_member_form_data(app, client, user_session): - portfolio = PortfolioFactory.create() - application = Applications.create( - portfolio, - "Snazzy Application", - "A new application for me and my friends", - {"env1", "env2"}, - ) - user1 = UserFactory.create() - user2 = UserFactory.create() - env1 = application.environments[0] - env2 = application.environments[1] - env_role1 = EnvironmentRoleFactory.create(environment=env1, user=user1) - env_role2 = EnvironmentRoleFactory.create(environment=env1, user=user2) - env_role3 = EnvironmentRoleFactory.create(environment=env2, user=user1) + env = EnvironmentFactory.create() + application = env.application - user_session(portfolio.owner) + _app_role = ApplicationRoleFactory.create(application=application) + env_role = EnvironmentRoleFactory.create(environment=env, user=_app_role.user) + + app_role = ApplicationRoleFactory.create(application=application) + + user_session(application.portfolio.owner) with captured_templates(app) as templates: response = app.test_client().get( url_for("applications.settings", application_id=application.id) ) - assert response.status_code == 200 _, context = templates[0] - for env_id in context["env_forms"]: - env = Environments.get(environment_id=env_id) - form_data = {"env_id": env_id, "team_roles": []} - for user in env.users: - env_role = EnvironmentRoles.get(user.id, env.id) - form_data["team_roles"].append( + + serialized_data = { + "env_name": env.name, + "no_access": [ + {"name": app_role.user.full_name, "user_id": app_role.user_id} + ], + "form": { + "env_id": env.id, + "team_roles": [ { - "name": user.full_name, - "user_id": user.id, + "name": env_role.user.full_name, + "user_id": env_role.user_id, "role": env_role.displayname, } - ) + ], + }, + } - assert context["env_forms"][env_id].data == form_data + assert context["env_forms"][0]["env_name"] == serialized_data["env_name"] + assert context["env_forms"][0]["form"].data == serialized_data["form"] + assert context["env_forms"][0]["no_access"] == serialized_data["no_access"] def test_user_with_permission_can_update_application(client, user_session): From 4c7a8c399c99dc7d1947a5beee824a7427993783 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Fri, 26 Apr 2019 10:48:58 -0400 Subject: [PATCH 2/7] Sort env members by role --- atst/routes/applications/settings.py | 27 ++++++++++++----- tests/routes/applications/test_settings.py | 34 +++++++++++++--------- 2 files changed, 41 insertions(+), 20 deletions(-) diff --git a/atst/routes/applications/settings.py b/atst/routes/applications/settings.py index 66ea8075..4eb66323 100644 --- a/atst/routes/applications/settings.py +++ b/atst/routes/applications/settings.py @@ -7,26 +7,37 @@ 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.models.permissions import Permissions from atst.utils.flash import formatted_flash as flash def get_environments_obj_for_app(application): environments_obj = {} - for env in application.environments: environments_obj[env.name] = { "edit_form": EditEnvironmentForm(obj=env), "id": env.id, - "members": [], } - 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[env.name]["members"] = sort_env_users_by_role(env) return environments_obj + # {env_name: {edit_form, env_id, members: {csp_role: [], csp_role: []}}} + + +def sort_env_users_by_role(env): + users_dict = {} + for role in CSPRole: + users_dict[role.value] = [] + + for r in env.roles: + users_dict[r.displayname].append( + {"name": r.user.full_name, "user_id": r.user_id} + ) + + return users_dict + # {csp_role: [{user info}, {user info}], csp_role: [...]} def serialize_env_member_forms(application): @@ -64,6 +75,7 @@ def settings(application_id): # refactor like portfolio admin render function application = Applications.get(application_id) form = ApplicationForm(name=application.name, description=application.description) + csp_roles = [role.value for role in CSPRole] return render_template( "portfolios/applications/settings.html", @@ -71,6 +83,7 @@ def settings(application_id): form=form, environments_obj=get_environments_obj_for_app(application=application), env_forms=serialize_env_member_forms(application=application), + csp_roles=csp_roles, ) diff --git a/tests/routes/applications/test_settings.py b/tests/routes/applications/test_settings.py index 18ffd06d..7a4608e7 100644 --- a/tests/routes/applications/test_settings.py +++ b/tests/routes/applications/test_settings.py @@ -68,15 +68,17 @@ def test_edit_application_environments_obj(app, client, user_session): portfolio, "Snazzy Application", "A new application for me and my friends", - {"env1", "env2"}, + {"env"}, ) user1 = UserFactory.create() user2 = UserFactory.create() - env1 = application.environments[0] - env2 = application.environments[1] - env_role1 = EnvironmentRoleFactory.create(environment=env1, user=user1) - env_role2 = EnvironmentRoleFactory.create(environment=env1, user=user2) - env_role3 = EnvironmentRoleFactory.create(environment=env2, user=user1) + env = application.environments[0] + env_role1 = EnvironmentRoleFactory.create( + environment=env, user=user1, role=CSPRole.BASIC_ACCESS.value + ) + env_role2 = EnvironmentRoleFactory.create( + environment=env, user=user2, role=CSPRole.NETWORK_ADMIN.value + ) user_session(portfolio.owner) @@ -88,13 +90,19 @@ def test_edit_application_environments_obj(app, client, user_session): assert response.status_code == 200 _, context = templates[0] - env_obj_1 = context["environments_obj"][env1.name] - assert env_obj_1["id"] == env1.id - assert isinstance(env_obj_1["edit_form"], EditEnvironmentForm) - assert env_obj_1["members"] == [ - {"name": user1.full_name, "role": env_role1.role}, - {"name": user2.full_name, "role": env_role2.role}, - ] + env_obj = context["environments_obj"][env.name] + assert env_obj["id"] == env.id + assert isinstance(env_obj["edit_form"], EditEnvironmentForm) + assert env_obj["members"] == { + CSPRole.BASIC_ACCESS.value: [ + {"name": env_role1.user.full_name, "user_id": env_role1.user_id} + ], + CSPRole.NETWORK_ADMIN.value: [ + {"name": env_role2.user.full_name, "user_id": env_role2.user_id} + ], + CSPRole.BUSINESS_READ.value: [], + CSPRole.TECHNICAL_READ.value: [], + } def test_edit_app_serialize_env_member_form_data(app, client, user_session): From 1470a45216d64b4eac4b14371c981bca304aef60 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Fri, 26 Apr 2019 15:13:38 -0400 Subject: [PATCH 3/7] Update template and styling --- styles/sections/_application_edit.scss | 35 ++++++++++++++ .../applications/edit_environments.html | 47 ++++++++++++++----- 2 files changed, 69 insertions(+), 13 deletions(-) diff --git a/styles/sections/_application_edit.scss b/styles/sections/_application_edit.scss index ce05522f..20bb3485 100644 --- a/styles/sections/_application_edit.scss +++ b/styles/sections/_application_edit.scss @@ -17,3 +17,38 @@ margin-right: -$gap; } } + +.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; + } + } +} diff --git a/templates/fragments/applications/edit_environments.html b/templates/fragments/applications/edit_environments.html index 607d854e..d842a46d 100644 --- a/templates/fragments/applications/edit_environments.html +++ b/templates/fragments/applications/edit_environments.html @@ -3,6 +3,24 @@ {% from "components/text_input.html" import TextInput %} {% from "components/save_button.html" import SaveButton %} +{% macro RolePanel(users=[], role='Unassigned(No Access)') %} + {% set unassigned = role == 'Unassigned(No Access)' %} +
+

{{ role }}

+
+ {% for user in users %} +
+ {{ user.name }}{{ Icon('edit', classes="icon--medium right") }} +
+ {% endfor %} + + {% if users == [] %} +
Currently no members are in this role
+ {% endif %} +
+
+{% endmacro %} +
@@ -22,12 +40,16 @@
    - {% for name, environment_info in environments_obj.items() %} + {% for env in env_forms %} + {% set member_count = env['form'].data['team_roles'] | length %} + {% set unassigned = env['no_access'] %} + {% set members_by_role = environments_obj[env['env_name']]['members'] %} +
  • - {{ name }} + {{ env['env_name'] }} {% set edit_environment_button %} @@ -44,11 +66,11 @@ {% set open_members_button %} - {{ "common.members" | translate }} ({{ members_list | length }}) {{ Icon('caret_down') }} + {{ "common.members" | translate }} ({{ member_count }}) {{ Icon('caret_down') }} {% endset %} {% set close_members_button %} - {{ "common.members" | translate }} ({{ members_list | length }}) {{ Icon('caret_up') }} + {{ "common.members" | translate }} ({{ member_count }}) {{ Icon('caret_up') }} {% endset %} {{ @@ -62,21 +84,20 @@
    {% call ToggleSection(section_name="members") %} -
      - {% for member in environment_info['members'] %} -
    • -
      {{ member.name }}
      -
      {{ member.role }}
      -
    • +
      + {{ RolePanel(users=unassigned) }} + + {% for role in csp_roles %} + {{ RolePanel(users=members_by_role[role], role=role) }} {% endfor %} -
    +
{% endcall %} {% call ToggleSection(section_name="edit") %}
  • - {% set edit_form = environment_info['edit_form'] %} -
    + {% set edit_form = environments_obj[env['env_name']]['edit_form'] %} + {{ edit_form.csrf_token }} {{ TextInput(edit_form.name) }} {{ From 6e64287e3a62d026f2dca35a6e27184f938ac6ba Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Mon, 29 Apr 2019 11:37:13 -0400 Subject: [PATCH 4/7] Use ul and li to display list of env users --- templates/fragments/applications/edit_environments.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/templates/fragments/applications/edit_environments.html b/templates/fragments/applications/edit_environments.html index d842a46d..d2e5faff 100644 --- a/templates/fragments/applications/edit_environments.html +++ b/templates/fragments/applications/edit_environments.html @@ -7,17 +7,17 @@ {% set unassigned = role == 'Unassigned(No Access)' %}

    {{ role }}

    -
    +
      {% for user in users %} -
      +
    • {{ user.name }}{{ Icon('edit', classes="icon--medium right") }} -
    • + {% endfor %} {% if users == [] %}
      Currently no members are in this role
      {% endif %} -
    +
{% endmacro %} From 4f954117c8ab90a2dcf078ad9c504a5f88db308b Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Mon, 29 Apr 2019 11:41:12 -0400 Subject: [PATCH 5/7] Use keys in members_by_role dict to get the CSP roles --- atst/routes/applications/settings.py | 2 -- templates/fragments/applications/edit_environments.html | 8 ++++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/atst/routes/applications/settings.py b/atst/routes/applications/settings.py index 4eb66323..56ef25ba 100644 --- a/atst/routes/applications/settings.py +++ b/atst/routes/applications/settings.py @@ -75,7 +75,6 @@ def settings(application_id): # refactor like portfolio admin render function application = Applications.get(application_id) form = ApplicationForm(name=application.name, description=application.description) - csp_roles = [role.value for role in CSPRole] return render_template( "portfolios/applications/settings.html", @@ -83,7 +82,6 @@ def settings(application_id): form=form, environments_obj=get_environments_obj_for_app(application=application), env_forms=serialize_env_member_forms(application=application), - csp_roles=csp_roles, ) diff --git a/templates/fragments/applications/edit_environments.html b/templates/fragments/applications/edit_environments.html index d2e5faff..c629c440 100644 --- a/templates/fragments/applications/edit_environments.html +++ b/templates/fragments/applications/edit_environments.html @@ -87,10 +87,10 @@
{{ RolePanel(users=unassigned) }} - {% for role in csp_roles %} - {{ RolePanel(users=members_by_role[role], role=role) }} - {% endfor %} -
+ {% for role, members in members_by_role.items() %} + {{ RolePanel(users=members, role=role) }} + {% endfor %} + {% endcall %} {% call ToggleSection(section_name="edit") %} From 67516b3b5503a91d6b59c793be76b3073054306f Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Mon, 29 Apr 2019 14:42:38 -0400 Subject: [PATCH 6/7] Combine env_forms and environment_obj --- atst/routes/applications/settings.py | 65 +++++++------------ .../applications/edit_environments.html | 32 ++++----- .../applications/read_only_environments.html | 10 +-- tests/routes/applications/test_settings.py | 57 ++++------------ tests/test_access.py | 6 ++ 5 files changed, 63 insertions(+), 107 deletions(-) diff --git a/atst/routes/applications/settings.py b/atst/routes/applications/settings.py index 56ef25ba..0e07f917 100644 --- a/atst/routes/applications/settings.py +++ b/atst/routes/applications/settings.py @@ -13,60 +13,46 @@ 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, + "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), } - - environments_obj[env.name]["members"] = sort_env_users_by_role(env) + environments_obj.append(env_data) return environments_obj - # {env_name: {edit_form, env_id, members: {csp_role: [], csp_role: []}}} def sort_env_users_by_role(env): - users_dict = {} + users_dict = {"no_access": []} for role in CSPRole: users_dict[role.value] = [] - for r in env.roles: - users_dict[r.displayname].append( - {"name": r.user.full_name, "user_id": r.user_id} - ) + 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} + ) + else: + users_dict["no_access"].append({"name": user.full_name, "user_id": user.id}) return users_dict - # {csp_role: [{user info}, {user info}], csp_role: [...]} -def serialize_env_member_forms(application): - environments_list = [] - - for env in application.environments: - env_info = {"env_name": env.name, "no_access": []} - env_team_list = [] - - for user in application.users: - if user in env.users: - env_role = EnvironmentRoles.get(user.id, env.id) - env_team_list.append( - { - "name": user.full_name, - "user_id": user.id, - "role": env_role.displayname, - } - ) - else: - env_info["no_access"].append( - {"name": user.full_name, "user_id": user.id} - ) - - env_info["form"] = EnvironmentRolesForm( - data={"env_id": env.id, "team_roles": env_team_list} +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} ) - environments_list.append(env_info) - return environments_list + + return data @applications_bp.route("/applications//settings") @@ -81,7 +67,6 @@ def settings(application_id): application=application, form=form, environments_obj=get_environments_obj_for_app(application=application), - env_forms=serialize_env_member_forms(application=application), ) @@ -129,7 +114,6 @@ def update(application_id): application=application, form=form, environments_obj=get_environments_obj_for_app(application=application), - env_forms=serialize_env_member_forms(application=application), ) @@ -157,7 +141,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/templates/fragments/applications/edit_environments.html b/templates/fragments/applications/edit_environments.html index c629c440..46c8afdf 100644 --- a/templates/fragments/applications/edit_environments.html +++ b/templates/fragments/applications/edit_environments.html @@ -3,8 +3,12 @@ {% from "components/text_input.html" import TextInput %} {% from "components/save_button.html" import SaveButton %} -{% macro RolePanel(users=[], role='Unassigned(No Access)') %} - {% set unassigned = role == 'Unassigned(No Access)' %} +{% macro RolePanel(users=[], role='no_access') %} + {% if role == 'no_access' %} + {% set role = 'Unassigned (No Access)' %} + {% set unassigned = True %} + {% endif %} +

{{ role }}

    @@ -40,16 +44,16 @@
    - {% for env in env_forms %} - {% set member_count = env['form'].data['team_roles'] | length %} - {% set unassigned = env['no_access'] %} - {% set members_by_role = environments_obj[env['env_name']]['members'] %} + {% for env in environments_obj %} + {% set member_count = env['members_form'].data['team_roles'] | length %} + {% set members_by_role = env['members'] %} + {% set unassigned = members_by_role['no_access'] %}
  • - {{ env['env_name'] }} + {{ env['name'] }} {% set edit_environment_button %} @@ -84,20 +88,16 @@
    {% call ToggleSection(section_name="members") %} -
    - {{ RolePanel(users=unassigned) }} - - {% for role, members in members_by_role.items() %} - {{ RolePanel(users=members, role=role) }} - {% endfor %} -
    + {% for role, members in members_by_role.items() %} + {{ RolePanel(users=members, role=role) }} + {% endfor %} {% endcall %} {% call ToggleSection(section_name="edit") %}
    • - {% set edit_form = environments_obj[env['env_name']]['edit_form'] %} - + {% set edit_form = env['edit_form'] %} + {{ edit_form.csrf_token }} {{ TextInput(edit_form.name) }} {{ diff --git a/templates/fragments/applications/read_only_environments.html b/templates/fragments/applications/read_only_environments.html index 6cd9ed8d..4a91fb3f 100644 --- a/templates/fragments/applications/read_only_environments.html +++ b/templates/fragments/applications/read_only_environments.html @@ -16,21 +16,21 @@
        - {% for name, members_list in environments_obj.items() %} + {% for env in environments_obj %}
      • - {{ name }} + {{ env['name'] }} {% set open_members_button %} - {{ "common.members" | translate }} ({{ members_list | length }}) {{ Icon('caret_down') }} + {{ "common.members" | translate }} ({{ env['members'] | length }}) {{ Icon('caret_down') }} {% endset %} {% set close_members_button %} - {{ "common.members" | translate }} ({{ members_list | length }}) {{ Icon('caret_up') }} + {{ "common.members" | translate }} ({{ env['members'] | length }}) {{ Icon('caret_up') }} {% endset %} {{ @@ -45,7 +45,7 @@ {% call ToggleSection(section_name="members") %}
          - {% for member in members_list %} + {% for member in env['members'] %}
        • {{ member.name }}
        • diff --git a/tests/routes/applications/test_settings.py b/tests/routes/applications/test_settings.py index 7a4608e7..6b7efa81 100644 --- a/tests/routes/applications/test_settings.py +++ b/tests/routes/applications/test_settings.py @@ -18,6 +18,7 @@ from atst.domain.portfolios import Portfolios from atst.models.environment_role import CSPRole from atst.models.portfolio_role import Status as PortfolioRoleStatus from atst.forms.application import EditEnvironmentForm +from atst.forms.app_settings import EnvironmentRolesForm from tests.utils import captured_templates @@ -70,15 +71,16 @@ def test_edit_application_environments_obj(app, client, user_session): "A new application for me and my friends", {"env"}, ) - user1 = UserFactory.create() - user2 = UserFactory.create() env = application.environments[0] + app_role = ApplicationRoleFactory.create(application=application) env_role1 = EnvironmentRoleFactory.create( - environment=env, user=user1, role=CSPRole.BASIC_ACCESS.value + environment=env, role=CSPRole.BASIC_ACCESS.value ) + ApplicationRoleFactory.create(application=application, user=env_role1.user) env_role2 = EnvironmentRoleFactory.create( - environment=env, user=user2, role=CSPRole.NETWORK_ADMIN.value + environment=env, role=CSPRole.NETWORK_ADMIN.value ) + ApplicationRoleFactory.create(application=application, user=env_role2.user) user_session(portfolio.owner) @@ -90,10 +92,15 @@ def test_edit_application_environments_obj(app, client, user_session): assert response.status_code == 200 _, context = templates[0] - env_obj = context["environments_obj"][env.name] + env_obj = context["environments_obj"][0] + assert env_obj["name"] == env.name assert env_obj["id"] == env.id assert isinstance(env_obj["edit_form"], EditEnvironmentForm) + assert isinstance(env_obj["members_form"], EnvironmentRolesForm) assert env_obj["members"] == { + "no_access": [ + {"name": app_role.user.full_name, "user_id": app_role.user_id} + ], CSPRole.BASIC_ACCESS.value: [ {"name": env_role1.user.full_name, "user_id": env_role1.user_id} ], @@ -105,46 +112,6 @@ def test_edit_application_environments_obj(app, client, user_session): } -def test_edit_app_serialize_env_member_form_data(app, client, user_session): - env = EnvironmentFactory.create() - application = env.application - - _app_role = ApplicationRoleFactory.create(application=application) - env_role = EnvironmentRoleFactory.create(environment=env, user=_app_role.user) - - app_role = ApplicationRoleFactory.create(application=application) - - user_session(application.portfolio.owner) - - with captured_templates(app) as templates: - response = app.test_client().get( - url_for("applications.settings", application_id=application.id) - ) - assert response.status_code == 200 - _, context = templates[0] - - serialized_data = { - "env_name": env.name, - "no_access": [ - {"name": app_role.user.full_name, "user_id": app_role.user_id} - ], - "form": { - "env_id": env.id, - "team_roles": [ - { - "name": env_role.user.full_name, - "user_id": env_role.user_id, - "role": env_role.displayname, - } - ], - }, - } - - assert context["env_forms"][0]["env_name"] == serialized_data["env_name"] - assert context["env_forms"][0]["form"].data == serialized_data["form"] - assert context["env_forms"][0]["no_access"] == serialized_data["no_access"] - - def test_user_with_permission_can_update_application(client, user_session): owner = UserFactory.create() portfolio = PortfolioFactory.create( diff --git a/tests/test_access.py b/tests/test_access.py index a2270940..ced9d0c6 100644 --- a/tests/test_access.py +++ b/tests/test_access.py @@ -16,6 +16,7 @@ from tests.factories import ( ApplicationFactory, ApplicationRoleFactory, EnvironmentFactory, + EnvironmentRoleFactory, InvitationFactory, PortfolioFactory, PortfolioRoleFactory, @@ -262,6 +263,11 @@ def test_application_settings_access(get_url_assert_status): applications=[{"name": "Mos Eisley", "description": "Where Han shot first"}], ) app = portfolio.applications[0] + env = EnvironmentFactory.create(application=app) + env_role = EnvironmentRoleFactory.create( + environment=env, role=CSPRole.NETWORK_ADMIN.value + ) + ApplicationRoleFactory.create(application=app, user=env_role.user) url = url_for("applications.settings", application_id=app.id) get_url_assert_status(ccpo, url, 200) From 53bdfc1151acf518256b98d63faf0b096b2b7907 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Tue, 30 Apr 2019 13:46:43 -0400 Subject: [PATCH 7/7] Add link to team settings --- styles/sections/_application_edit.scss | 7 +++++++ templates/fragments/applications/edit_environments.html | 1 + 2 files changed, 8 insertions(+) diff --git a/styles/sections/_application_edit.scss b/styles/sections/_application_edit.scss index 20bb3485..c11c2f87 100644 --- a/styles/sections/_application_edit.scss +++ b/styles/sections/_application_edit.scss @@ -18,6 +18,12 @@ } } +.app-team-settings-link { + font-size: $small-font-size; + font-weight: $font-normal; + padding-left: $gap * 2; +} + .environment-role { padding: $gap * 3; @@ -49,6 +55,7 @@ .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 46c8afdf..3532ff1e 100644 --- a/templates/fragments/applications/edit_environments.html +++ b/templates/fragments/applications/edit_environments.html @@ -88,6 +88,7 @@
        {% call ToggleSection(section_name="members") %} + {% for role, members in members_by_role.items() %} {{ RolePanel(users=members, role=role) }} {% endfor %}