From ab102470bf797b210ce874494d49412552ec11e5 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Thu, 12 Sep 2019 15:10:47 -0400 Subject: [PATCH] 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 %} +