From 1fd2d9f49604b67e1cc2ccd77f4259cfabbe683f Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Wed, 11 Sep 2019 13:36:44 -0400 Subject: [PATCH 01/17] Make form class for updating application member --- atst/forms/application_member.py | 40 ++++++++++++++++++++++++++ tests/forms/test_application_member.py | 19 ++++++++++++ 2 files changed, 59 insertions(+) diff --git a/atst/forms/application_member.py b/atst/forms/application_member.py index 1eaa4e06..d9f3906f 100644 --- a/atst/forms/application_member.py +++ b/atst/forms/application_member.py @@ -71,3 +71,43 @@ class NewForm(BaseForm): user_data = FormField(BaseNewMemberForm) permission_sets = FormField(PermissionsForm) environment_roles = FieldList(FormField(EnvironmentForm)) + + +class UpdatePermissionsForm(FlaskForm): + perms_team_mgmt = SelectField( + translate("portfolios.applications.members.new.manage_team"), + choices=[ + (PermissionSets.VIEW_APPLICATION, "View"), + (PermissionSets.EDIT_APPLICATION_TEAM, "Edit"), + ], + ) + perms_env_mgmt = SelectField( + translate("portfolios.applications.members.new.manage_envs"), + choices=[ + (PermissionSets.VIEW_APPLICATION, "View"), + (PermissionSets.EDIT_APPLICATION_ENVIRONMENTS, "Edit"), + ], + ) + perms_del_env = SelectField( + choices=[ + (PermissionSets.VIEW_APPLICATION, "No"), + (PermissionSets.DELETE_APPLICATION_ENVIRONMENTS, "Yes"), + ] + ) + + @property + def data(self): + _data = super().data + _data.pop("csrf_token", None) + permission_sets = [] + for field in _data: + if _data[field] is not None: + permission_sets.append(_data[field]) + + return permission_sets + + +class UpdateMemberForm(BaseForm): + member_role_id = HiddenField() + permission_sets = FormField(UpdatePermissionsForm) + environment_roles = FieldList(FormField(EnvironmentForm)) diff --git a/tests/forms/test_application_member.py b/tests/forms/test_application_member.py index 8494db48..70d90cef 100644 --- a/tests/forms/test_application_member.py +++ b/tests/forms/test_application_member.py @@ -1,5 +1,6 @@ from wtforms.validators import ValidationError +from atst.domain.permission_sets import PermissionSets from atst.forms.data import ENV_ROLES, ENV_ROLE_NO_ACCESS as NO_ACCESS from atst.forms.application_member import * @@ -34,3 +35,21 @@ def test_environment_form_invalid(): } form = EnvironmentForm(data=form_data) assert not form.validate() + + +def test_update_member_form(): + form_data = { + "member_role_id": 123, + "permission_sets": { + "perms_team_mgmt": PermissionSets.EDIT_APPLICATION_TEAM, + "perms_env_mgmt": PermissionSets.VIEW_APPLICATION, + "perms_del_env": PermissionSets.VIEW_APPLICATION, + }, + "environment_roles": { + "environment_id": 123, + "environment_name": "testing", + "role": ENV_ROLES[0][0], + }, + } + form = UpdateMemberForm(data=form_data) + assert form.validate() From ab102470bf797b210ce874494d49412552ec11e5 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Thu, 12 Sep 2019 15:10:47 -0400 Subject: [PATCH 02/17] Make checkboxes work --- atst/forms/application_member.py | 3 +- atst/models/application_role.py | 14 ++++ atst/routes/applications/settings.py | 38 ++++++--- templates/components/checkbox_input.html | 10 ++- .../new_member_modal_content.html | 84 +++++++++---------- .../portfolios/applications/settings.html | 62 +++++++++++++- 6 files changed, 147 insertions(+), 64 deletions(-) diff --git a/atst/forms/application_member.py b/atst/forms/application_member.py index d9f3906f..05110dcb 100644 --- a/atst/forms/application_member.py +++ b/atst/forms/application_member.py @@ -108,6 +108,5 @@ class UpdatePermissionsForm(FlaskForm): class UpdateMemberForm(BaseForm): - member_role_id = HiddenField() - permission_sets = FormField(UpdatePermissionsForm) + permission_sets = FormField(PermissionsForm) environment_roles = FieldList(FormField(EnvironmentForm)) diff --git a/atst/models/application_role.py b/atst/models/application_role.py index 7e709f5f..4e00c5b0 100644 --- a/atst/models/application_role.py +++ b/atst/models/application_role.py @@ -71,6 +71,20 @@ class ApplicationRole( elif self.latest_invitation: return self.latest_invitation.user_name + @property + def user_first_name(self): + if self.user: + return self.user.first_name + elif self.latest_invitation: + return self.latest_invitation.first_name + + @property + def user_last_name(self): + if self.user: + return self.user.last_name + elif self.latest_invitation: + return self.latest_invitation.last_name + def __repr__(self): return "".format( self.application.name, self.user_id, self.id, self.permissions diff --git a/atst/routes/applications/settings.py b/atst/routes/applications/settings.py index c80c9d10..d44661ee 100644 --- a/atst/routes/applications/settings.py +++ b/atst/routes/applications/settings.py @@ -9,7 +9,7 @@ from atst.domain.audit_log import AuditLog from atst.domain.common import Paginator from atst.domain.environment_roles import EnvironmentRoles from atst.forms.application import ApplicationForm, EditEnvironmentForm -from atst.forms.application_member import NewForm as NewMemberForm +from atst.forms.application_member import NewForm as MemberForm, UpdateMemberForm from atst.forms.data import ENV_ROLE_NO_ACCESS as NO_ACCESS from atst.domain.authz.decorator import user_can_access_decorator as user_can from atst.models.environment_role import CSPRole @@ -36,6 +36,7 @@ def get_environments_obj_for_app(application): def data_for_app_env_roles_form(application): + # this whole thing can be deleted when #1067 is rebased/merged! (and check other fns here) csp_roles = [role.value for role in CSPRole] csp_roles.insert(0, NO_ACCESS) # dictionary for sorting application members by environments @@ -95,16 +96,19 @@ def get_form_permission_value(member, edit_perm_set): def get_members_data(application): members_data = [] for member in application.members: + 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 + ) 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 - ), + "perms_team_mgmt": perms_team_mgmt, + "perms_env_mgmt": perms_env_mgmt, + "perms_del_env": perms_del_env, } roles = EnvironmentRoles.get_for_application_member(member.id) environment_roles = [ @@ -115,6 +119,15 @@ def get_members_data(application): } for role in roles ] + form_data = { + "environment_roles": environment_roles, + "permission_sets": { "perms_env_mgmt": 'selected' }, + } + # ['edit_application_environments', 'edit_application_team', 'delete_application_environments'] + # ['edit_application_team'] + + # {'perms_team_mgmt': 'edit_application_team', 'perms_env_mgmt': 'view_application', 'perms_del_env': 'view_application'} + form = UpdateMemberForm(data=form_data) members_data.append( { "role_id": member.id, @@ -122,6 +135,7 @@ def get_members_data(application): "permission_sets": permission_sets, "environment_roles": environment_roles, "role_status": member.status.value, + "form": form, } ) @@ -134,7 +148,7 @@ def get_new_member_form(application): for e in application.environments ] - return NewMemberForm(data={"environment_roles": env_roles}) + return MemberForm(data={"environment_roles": env_roles}) def render_settings_page(application, **kwargs): @@ -304,7 +318,7 @@ def delete_environment(environment_id): ) def create_member(application_id): application = Applications.get(application_id) - form = NewMemberForm(http_request.form) + form = MemberForm(http_request.form) if form.validate(): try: diff --git a/templates/components/checkbox_input.html b/templates/components/checkbox_input.html index 4e527114..be4c96bb 100644 --- a/templates/components/checkbox_input.html +++ b/templates/components/checkbox_input.html @@ -2,11 +2,13 @@ field, label=field.label, inline=False, - classes="") -%} + classes="", + key=field.name, + id=field.name) -%}
@@ -14,8 +16,8 @@
- {{ field(**{"v-model": "isChecked"}) }} - {{ label | safe }} + {{ field(id=id, checked=True, **{"v-model": "isChecked"}) }} + {{ field.label(for=id) | safe }} {% if field.description %}

diff --git a/templates/fragments/applications/new_member_modal_content.html b/templates/fragments/applications/new_member_modal_content.html index 97c84b85..7851e22f 100644 --- a/templates/fragments/applications/new_member_modal_content.html +++ b/templates/fragments/applications/new_member_modal_content.html @@ -24,7 +24,7 @@

{% endmacro %} -{% macro MemberStepOne(new_member_form) %} +{% macro MemberStepOne(member_form) %} {% set next_button %} - {{ TextInput(new_member_form.user_data.first_name, validation='requiredField', optional=False) }} + {{ TextInput(member_form.user_data.first_name, validation='requiredField', optional=False) }}
- {{ TextInput(new_member_form.user_data.last_name, validation='requiredField', optional=False) }} + {{ TextInput(member_form.user_data.last_name, validation='requiredField', optional=False) }}
- {{ TextInput(new_member_form.user_data.email, validation='email', optional=False) }} + {{ TextInput(member_form.user_data.email, validation='email', optional=False) }}
- {{ PhoneInput(new_member_form.user_data.phone_number, new_member_form.user_data.phone_ext)}} + {{ PhoneInput(member_form.user_data.phone_number, member_form.user_data.phone_ext)}}
- {{ TextInput(new_member_form.user_data.dod_id, validation='dodId', optional=False) }} + {{ TextInput(member_form.user_data.dod_id, validation='dodId', optional=False) }}
How do I find the DoD ID? {% endcall %} {% endmacro %} -{% macro MemberStepTwo(new_member_form, application) %} +{% macro MemberStepTwo(member_form, application) %} {% set next_button %} {{ "portfolios.applications.members.form.project_perms" | translate }} -
- {{ CheckboxInput(new_member_form.permission_sets.perms_team_mgmt, classes="input__inline-fields") }} - {{ CheckboxInput(new_member_form.permission_sets.perms_env_mgmt, classes="input__inline-fields") }} - {{ CheckboxInput(new_member_form.permission_sets.perms_del_env, classes="input__inline-fields") }} -
-
-

{{ "portfolios.applications.members.form.env_access" | translate }}

-
- {% for environment_data in new_member_form.environment_roles %} - -
-
-
-
- -
- {{ environment_data.environment_name.data }} -
-
-
-
- {{ environment_data.role(**{"v-model": "value"}) }} -
+

{{ "portfolios.applications.members.form.project_perms" | translate }}

+
+ {{ CheckboxInput(member_form.permission_sets.perms_team_mgmt, classes="input__inline-fields") }} + {{ CheckboxInput(member_form.permission_sets.perms_env_mgmt, classes="input__inline-fields") }} + {{ CheckboxInput(member_form.permission_sets.perms_del_env, classes="input__inline-fields") }} +
+
+

{{ "portfolios.applications.members.form.env_access" | translate }}

+
+ {% for environment_data in member_form.environment_roles %} + +
+
+
+
+ +
+ {{ environment_data.environment_name.data }} +
+
-
-
-
- {{ environment_data.environment_id() }} -
- {% endfor %} -
+
+ {{ environment_data.role(**{"v-model": "value"}) }} +
+
+
+
+
+ {{ environment_data.environment_id() }} +
+ {% endfor %} +
{% endcall %} {% endmacro %} diff --git a/templates/portfolios/applications/settings.html b/templates/portfolios/applications/settings.html index 7b54a709..3d24ef1e 100644 --- a/templates/portfolios/applications/settings.html +++ b/templates/portfolios/applications/settings.html @@ -10,6 +10,10 @@ {% from "components/save_button.html" import SaveButton %} {% from "components/text_input.html" import TextInput %} {% from "components/toggle_list.html" import ToggleButton, ToggleSection %} +{% from "components/icon.html" import Icon %} +{% from "components/text_input.html" import TextInput %} +{% from "components/checkbox_input.html" import CheckboxInput %} +{% from "components/phone_input.html" import PhoneInput %} {% set secondary_breadcrumb = 'portfolios.applications.existing_application_title' | translate({ "application_name": application.name }) %} @@ -87,11 +91,11 @@ {{ MultiStepModalForm( name=new_member_modal_name, - form=new_member_form, + form=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) + member_steps.MemberStepOne(member.form), + member_steps.MemberStepTwo(member.form, application) ], ) }} {% endif %} @@ -126,12 +130,62 @@ {% for member in members %} + {% import "fragments/applications/new_member_modal_content.html" as member_steps %} + {% set modal_name = "edit_member-{}".format(loop.index) %} + {% call Modal(modal_name, dismissable=True) %} + + {% endcall %} - {{ member.user_name }}
+ {{ member.user_name }} + + {{ Icon('edit') }} + +
{% if member.role_status == 'pending' %} INVITE PENDING {% endif %} + From 89cb5a160c408998642a6ce998e7b794fdcf971e Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Thu, 12 Sep 2019 16:23:56 -0400 Subject: [PATCH 03/17] Populate form w/ data --- atst/forms/application_member.py | 36 ++-------------------------- atst/routes/applications/settings.py | 36 ++++++++-------------------- translations.yaml | 12 +++++----- 3 files changed, 18 insertions(+), 66 deletions(-) diff --git a/atst/forms/application_member.py b/atst/forms/application_member.py index 05110dcb..6a6b3c4d 100644 --- a/atst/forms/application_member.py +++ b/atst/forms/application_member.py @@ -34,6 +34,7 @@ class PermissionsForm(FlaskForm): description=translate( "portfolios.applications.members.form.env_mgmt.description" ), + false_values=(False, "False", 'false', ''), ) perms_team_mgmt = BooleanField( translate("portfolios.applications.members.form.team_mgmt.label"), @@ -41,6 +42,7 @@ class PermissionsForm(FlaskForm): description=translate( "portfolios.applications.members.form.team_mgmt.description" ), + false_values=(False, "False", 'false', ''), ) perms_del_env = BooleanField( translate("portfolios.applications.members.form.del_env.label"), @@ -73,40 +75,6 @@ class NewForm(BaseForm): environment_roles = FieldList(FormField(EnvironmentForm)) -class UpdatePermissionsForm(FlaskForm): - perms_team_mgmt = SelectField( - translate("portfolios.applications.members.new.manage_team"), - choices=[ - (PermissionSets.VIEW_APPLICATION, "View"), - (PermissionSets.EDIT_APPLICATION_TEAM, "Edit"), - ], - ) - perms_env_mgmt = SelectField( - translate("portfolios.applications.members.new.manage_envs"), - choices=[ - (PermissionSets.VIEW_APPLICATION, "View"), - (PermissionSets.EDIT_APPLICATION_ENVIRONMENTS, "Edit"), - ], - ) - perms_del_env = SelectField( - choices=[ - (PermissionSets.VIEW_APPLICATION, "No"), - (PermissionSets.DELETE_APPLICATION_ENVIRONMENTS, "Yes"), - ] - ) - - @property - def data(self): - _data = super().data - _data.pop("csrf_token", None) - permission_sets = [] - for field in _data: - if _data[field] is not None: - permission_sets.append(_data[field]) - - return permission_sets - - class UpdateMemberForm(BaseForm): permission_sets = FormField(PermissionsForm) environment_roles = FieldList(FormField(EnvironmentForm)) diff --git a/atst/routes/applications/settings.py b/atst/routes/applications/settings.py index d44661ee..060ed962 100644 --- a/atst/routes/applications/settings.py +++ b/atst/routes/applications/settings.py @@ -9,7 +9,7 @@ from atst.domain.audit_log import AuditLog from atst.domain.common import Paginator from atst.domain.environment_roles import EnvironmentRoles from atst.forms.application import ApplicationForm, EditEnvironmentForm -from atst.forms.application_member import NewForm as MemberForm, UpdateMemberForm +from atst.forms.application_member import NewForm as MemberForm, UpdateMemberForm, PermissionsForm from atst.forms.data import ENV_ROLE_NO_ACCESS as NO_ACCESS from atst.domain.authz.decorator import user_can_access_decorator as user_can from atst.models.environment_role import CSPRole @@ -86,29 +86,14 @@ 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_members_data(application): members_data = [] for member in application.members: - 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 - ) permission_sets = { - "perms_team_mgmt": perms_team_mgmt, - "perms_env_mgmt": perms_env_mgmt, - "perms_del_env": perms_del_env, + "perms_team_mgmt": "True", + # "perms_team_mgmt": bool(member.has_permission_set(PermissionSets.EDIT_APPLICATION_TEAM)), + "perms_env_mgmt": bool(member.has_permission_set(PermissionSets.EDIT_APPLICATION_ENVIRONMENTS)), + "perms_del_env": bool(member.has_permission_set(PermissionSets.DELETE_APPLICATION_ENVIRONMENTS)), } roles = EnvironmentRoles.get_for_application_member(member.id) environment_roles = [ @@ -121,17 +106,16 @@ def get_members_data(application): ] form_data = { "environment_roles": environment_roles, - "permission_sets": { "perms_env_mgmt": 'selected' }, + "permission_sets": permission_sets, } - # ['edit_application_environments', 'edit_application_team', 'delete_application_environments'] - # ['edit_application_team'] - - # {'perms_team_mgmt': 'edit_application_team', 'perms_env_mgmt': 'view_application', 'perms_del_env': 'view_application'} - form = UpdateMemberForm(data=form_data) + perms_form = PermissionsForm(data=permission_sets) + form = UpdateMemberForm(environment_roles=environment_roles) + form.permission_sets = perms_form members_data.append( { "role_id": member.id, "user_name": member.user_name, + # remove these keys and use form "permission_sets": permission_sets, "environment_roles": environment_roles, "role_status": member.status.value, diff --git a/translations.yaml b/translations.yaml index ea304406..45696d1c 100644 --- a/translations.yaml +++ b/translations.yaml @@ -366,14 +366,14 @@ portfolios: delete_envs: 'Allow member to delete environments within the application.' manage_team: 'Allow member to add, update, and remove members from the application team.' perms_team_mgmt: - view_application: View Team - edit_application_team: Edit Team + 'False': View Team + 'True': Edit Team perms_env_mgmt: - view_application: View Environments - edit_application_environments: Edit Environments + 'False': View Environments + 'True': Edit Environments perms_del_env: - view_application: "" - delete_application_environments: Delete Application + 'False': "" + 'True': Delete Application index: empty: start_button: Start a new JEDI portfolio From d296d3c237fa2d22f28e0f99197411bfddd26297 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Thu, 12 Sep 2019 16:56:32 -0400 Subject: [PATCH 04/17] Move modal outside of table and add csrf token --- atst/forms/application_member.py | 5 +- atst/routes/applications/settings.py | 10 ++ templates/components/checkbox_input.html | 1 + .../portfolios/applications/settings.html | 94 ++++++++++--------- 4 files changed, 64 insertions(+), 46 deletions(-) diff --git a/atst/forms/application_member.py b/atst/forms/application_member.py index 6a6b3c4d..d9ec9074 100644 --- a/atst/forms/application_member.py +++ b/atst/forms/application_member.py @@ -1,5 +1,6 @@ from flask_wtf import FlaskForm from wtforms.fields import FormField, FieldList, HiddenField, BooleanField +from wtforms import Form from .forms import BaseForm from .member import NewForm as BaseNewMemberForm @@ -9,7 +10,7 @@ from atst.forms.fields import SelectField from atst.utils.localization import translate -class EnvironmentForm(FlaskForm): +class EnvironmentForm(Form): environment_id = HiddenField() environment_name = HiddenField() role = SelectField( @@ -27,7 +28,7 @@ class EnvironmentForm(FlaskForm): return _data -class PermissionsForm(FlaskForm): +class PermissionsForm(Form): perms_env_mgmt = BooleanField( translate("portfolios.applications.members.form.env_mgmt.label"), default=False, diff --git a/atst/routes/applications/settings.py b/atst/routes/applications/settings.py index 060ed962..451aa30c 100644 --- a/atst/routes/applications/settings.py +++ b/atst/routes/applications/settings.py @@ -363,3 +363,13 @@ def remove_member(application_id, application_role_id): fragment="application-members", ) ) + + +@applications_bp.route( + "/applications//members//update", + methods=["POST"], +) +@user_can(Permissions.EDIT_APPLICATION_MEMBER, message="update application member") +def update_member(application_id, application_role_id): + import ipdb; ipdb.set_trace() + pass diff --git a/templates/components/checkbox_input.html b/templates/components/checkbox_input.html index be4c96bb..64f2a021 100644 --- a/templates/components/checkbox_input.html +++ b/templates/components/checkbox_input.html @@ -18,6 +18,7 @@ {{ field(id=id, checked=True, **{"v-model": "isChecked"}) }} {{ field.label(for=id) | safe }} + {{ field.data }} {% if field.description %}

diff --git a/templates/portfolios/applications/settings.html b/templates/portfolios/applications/settings.html index 3d24ef1e..ecb02205 100644 --- a/templates/portfolios/applications/settings.html +++ b/templates/portfolios/applications/settings.html @@ -119,6 +119,56 @@ {% if g.matchesPath("application-members") %} {% include "fragments/flash.html" %} {% endif %} + {% for member in members %} + {% set modal_name = "edit_member-{}".format(loop.index) %} + {% call Modal(modal_name, dismissable=True) %} +

+ {% endcall %} + {% endfor %} @@ -130,51 +180,7 @@ {% for member in members %} - {% import "fragments/applications/new_member_modal_content.html" as member_steps %} {% set modal_name = "edit_member-{}".format(loop.index) %} - {% call Modal(modal_name, dismissable=True) %} - -

{{ "portfolios.applications.members.form.project_perms" | translate }}

-
- {% set team_mgmt = "perms_team_mgmt-{}".format(member.role_id) %} - {% set env_mgmt = "perms_env_mgmt-{}".format(member.role_id) %} - {% set del_env = "perms_del_env-{}".format(member.role_id) %} - {{ CheckboxInput(member.form.permission_sets.perms_team_mgmt, classes="input__inline-fields", key=team_mgmt, id=team_mgmt) }} - {{ CheckboxInput(member.form.permission_sets.perms_env_mgmt, classes="input__inline-fields", key=env_mgmt, id=env_mgmt) }} - {{ CheckboxInput(member.form.permission_sets.perms_del_env, classes="input__inline-fields", key=del_env, id=del_env) }} -
-
-

{{ "portfolios.applications.members.form.env_access" | translate }}

-
- {% for environment_data in member.form.environment_roles %} - -
-
-
-
- -
- {{ environment_data.environment_name.data }} -
-
-
-
- {{ environment_data.role(**{"v-model": "value"}) }} -
-
-
-
-
- {{ environment_data.environment_id() }} -
- {% endfor %} -
- - {% endcall %}
{{ member.user_name }} From 4dab326eef2a34cc5e4e356e7020984a04850ae8 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Fri, 13 Sep 2019 10:59:07 -0400 Subject: [PATCH 05/17] Clean up code and formatting --- atst/forms/application_member.py | 2 - atst/routes/applications/settings.py | 79 +++++-------------- templates/components/checkbox_input.html | 1 - .../portfolios/applications/settings.html | 12 +-- tests/forms/test_application_member.py | 6 +- 5 files changed, 28 insertions(+), 72 deletions(-) diff --git a/atst/forms/application_member.py b/atst/forms/application_member.py index d9ec9074..26b8da6c 100644 --- a/atst/forms/application_member.py +++ b/atst/forms/application_member.py @@ -35,7 +35,6 @@ class PermissionsForm(Form): description=translate( "portfolios.applications.members.form.env_mgmt.description" ), - false_values=(False, "False", 'false', ''), ) perms_team_mgmt = BooleanField( translate("portfolios.applications.members.form.team_mgmt.label"), @@ -43,7 +42,6 @@ class PermissionsForm(Form): description=translate( "portfolios.applications.members.form.team_mgmt.description" ), - false_values=(False, "False", 'false', ''), ) perms_del_env = BooleanField( translate("portfolios.applications.members.form.del_env.label"), diff --git a/atst/routes/applications/settings.py b/atst/routes/applications/settings.py index 451aa30c..3664d336 100644 --- a/atst/routes/applications/settings.py +++ b/atst/routes/applications/settings.py @@ -9,7 +9,11 @@ from atst.domain.audit_log import AuditLog from atst.domain.common import Paginator from atst.domain.environment_roles import EnvironmentRoles from atst.forms.application import ApplicationForm, EditEnvironmentForm -from atst.forms.application_member import NewForm as MemberForm, UpdateMemberForm, PermissionsForm +from atst.forms.application_member import ( + NewForm as NewMemberForm, + UpdateMemberForm, + PermissionsForm, +) from atst.forms.data import ENV_ROLE_NO_ACCESS as NO_ACCESS from atst.domain.authz.decorator import user_can_access_decorator as user_can from atst.models.environment_role import CSPRole @@ -35,65 +39,21 @@ def get_environments_obj_for_app(application): return environments_obj -def data_for_app_env_roles_form(application): - # this whole thing can be deleted when #1067 is rebased/merged! (and check other fns here) - csp_roles = [role.value for role in CSPRole] - csp_roles.insert(0, NO_ACCESS) - # dictionary for sorting application members by environments - # and roles within those environments - environments_dict = { - e.id: {role_name: [] for role_name in csp_roles} - for e in application.environments - } - for member in application.members: - env_ids = set(environments_dict.keys()) - for env_role in member.environment_roles: - role_members_list = environments_dict[env_role.environment_id][ - env_role.role - ] - role_members_list.append( - { - "application_role_id": str(member.id), - "user_name": member.user_name, - "role_name": env_role.role, - } - ) - env_ids.remove(env_role.environment_id) - - # any leftover environment IDs are ones the app member - # does not have access to - for env_id in env_ids: - role_members_list = environments_dict[env_id][NO_ACCESS] - role_members_list.append( - { - "application_role_id": str(member.id), - "user_name": member.user_name, - "role_name": NO_ACCESS, - } - ) - - # transform the data into the shape the form needs - nested_data = [ - { - "env_id": env_id, - "team_roles": [ - {"role": role, "members": members} for role, members in roles.items() - ], - } - for env_id, roles in environments_dict.items() - ] - - return {"envs": nested_data} - - def get_members_data(application): members_data = [] for member in application.members: permission_sets = { - "perms_team_mgmt": "True", - # "perms_team_mgmt": bool(member.has_permission_set(PermissionSets.EDIT_APPLICATION_TEAM)), - "perms_env_mgmt": bool(member.has_permission_set(PermissionSets.EDIT_APPLICATION_ENVIRONMENTS)), - "perms_del_env": bool(member.has_permission_set(PermissionSets.DELETE_APPLICATION_ENVIRONMENTS)), + "perms_team_mgmt": bool( + member.has_permission_set(PermissionSets.EDIT_APPLICATION_TEAM) + ), + "perms_env_mgmt": bool( + member.has_permission_set(PermissionSets.EDIT_APPLICATION_ENVIRONMENTS) + ), + "perms_del_env": bool( + member.has_permission_set( + PermissionSets.DELETE_APPLICATION_ENVIRONMENTS + ) + ), } roles = EnvironmentRoles.get_for_application_member(member.id) environment_roles = [ @@ -132,7 +92,7 @@ def get_new_member_form(application): for e in application.environments ] - return MemberForm(data={"environment_roles": env_roles}) + return NewMemberForm(data={"environment_roles": env_roles}) def render_settings_page(application, **kwargs): @@ -302,7 +262,7 @@ def delete_environment(environment_id): ) def create_member(application_id): application = Applications.get(application_id) - form = MemberForm(http_request.form) + form = NewMemberForm(http_request.form) if form.validate(): try: @@ -371,5 +331,4 @@ def remove_member(application_id, application_role_id): ) @user_can(Permissions.EDIT_APPLICATION_MEMBER, message="update application member") def update_member(application_id, application_role_id): - import ipdb; ipdb.set_trace() - pass + return redirect(url_for("applications.settings", application_id=g.application.id)) diff --git a/templates/components/checkbox_input.html b/templates/components/checkbox_input.html index 64f2a021..be4c96bb 100644 --- a/templates/components/checkbox_input.html +++ b/templates/components/checkbox_input.html @@ -18,7 +18,6 @@ {{ field(id=id, checked=True, **{"v-model": "isChecked"}) }} {{ field.label(for=id) | safe }} - {{ field.data }} {% if field.description %}

diff --git a/templates/portfolios/applications/settings.html b/templates/portfolios/applications/settings.html index ecb02205..eb0cdb0e 100644 --- a/templates/portfolios/applications/settings.html +++ b/templates/portfolios/applications/settings.html @@ -91,11 +91,11 @@ {{ MultiStepModalForm( name=new_member_modal_name, - form=member.form, + form=new_member_form, form_action=url_for("applications.create_member", application_id=application.id), steps=[ - member_steps.MemberStepOne(member.form), - member_steps.MemberStepTwo(member.form, application) + member_steps.MemberStepOne(new_member_form), + member_steps.MemberStepTwo(new_member_form, application) ], ) }} {% endif %} @@ -122,9 +122,9 @@ {% for member in members %} {% set modal_name = "edit_member-{}".format(loop.index) %} {% call Modal(modal_name, dismissable=True) %} -