From e64b2dd0346fade681a76e3ed6f4c371d3cd3cbe Mon Sep 17 00:00:00 2001 From: richard-dds Date: Mon, 24 Sep 2018 14:10:55 -0400 Subject: [PATCH 1/4] Add Role.display_name --- .../c19ae79d2521_add_role_display_name.py | 45 +++++++++++++++++++ atst/models/role.py | 1 + atst/models/workspace_user.py | 4 ++ script/seed_roles.py | 13 +++++- tests/factories.py | 1 + tests/models/test_workspace_user.py | 17 +++++++ 6 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 alembic/versions/c19ae79d2521_add_role_display_name.py diff --git a/alembic/versions/c19ae79d2521_add_role_display_name.py b/alembic/versions/c19ae79d2521_add_role_display_name.py new file mode 100644 index 00000000..415e115c --- /dev/null +++ b/alembic/versions/c19ae79d2521_add_role_display_name.py @@ -0,0 +1,45 @@ +"""add role.display_name + +Revision ID: c19ae79d2521 +Revises: 359caaf8c5f1 +Create Date: 2018-09-24 14:02:59.533928 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision = "c19ae79d2521" +down_revision = "359caaf8c5f1" +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.alter_column( + "request_status_events", + "time_created", + existing_type=postgresql.TIMESTAMP(timezone=True), + nullable=True, + existing_server_default=sa.text("now()"), + ) + op.add_column( + "roles", + sa.Column("display_name", sa.String(), nullable=False, server_default=""), + ) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column("roles", "display_name") + op.alter_column( + "request_status_events", + "time_created", + existing_type=postgresql.TIMESTAMP(timezone=True), + nullable=True, + existing_server_default=sa.text("now()"), + ) + # ### end Alembic commands ### diff --git a/atst/models/role.py b/atst/models/role.py index ac88ca27..7f229a48 100644 --- a/atst/models/role.py +++ b/atst/models/role.py @@ -10,6 +10,7 @@ class Role(Base, mixins.TimestampsMixin): id = types.Id() name = Column(String, index=True, unique=True, nullable=False) + display_name = Column(String, nullable=False) description = Column(String, nullable=False) permissions = Column(ARRAY(String), index=True, server_default="{}", nullable=False) diff --git a/atst/models/workspace_user.py b/atst/models/workspace_user.py index 934c6f89..9ffa1e34 100644 --- a/atst/models/workspace_user.py +++ b/atst/models/workspace_user.py @@ -36,6 +36,10 @@ class WorkspaceUser(object): def role(self): return self.workspace_role.role.name + @property + def role_displayname(self): + return self.workspace_role.role.display_name + @property def status(self): return "active" diff --git a/script/seed_roles.py b/script/seed_roles.py index 6794e9ad..f84ff356 100644 --- a/script/seed_roles.py +++ b/script/seed_roles.py @@ -13,6 +13,7 @@ from atst.models import Role, Permissions roles = [ Role( name="ccpo", + display_name="CCPO", description="", permissions=[ Permissions.VIEW_ORIGINAL_JEDI_REQEUST, @@ -51,6 +52,7 @@ roles = [ ), Role( name="owner", + display_name="Owner", description="", permissions=[ Permissions.REQUEST_JEDI_WORKSPACE, @@ -82,6 +84,7 @@ roles = [ ), Role( name="admin", + display_name="Admin", description="", permissions=[ Permissions.VIEW_USAGE_REPORT, @@ -108,16 +111,18 @@ roles = [ ), Role( name="developer", + display_name="Developer", description="", permissions=[ Permissions.VIEW_USAGE_REPORT, Permissions.VIEW_USAGE_DOLLARS, Permissions.VIEW_WORKSPACE, - Permissions.VIEW_APPLICATION_IN_WORKSPACE + Permissions.VIEW_APPLICATION_IN_WORKSPACE, ], ), Role( name="billing_auditor", + display_name="Billing Auditor", description="", permissions=[ Permissions.VIEW_USAGE_REPORT, @@ -129,6 +134,7 @@ roles = [ Role( name="security_auditor", description="", + display_name="Security Auditor", permissions=[ Permissions.VIEW_ASSIGNED_ATAT_ROLE_CONFIGURATIONS, Permissions.VIEW_ASSIGNED_CSP_ROLE_CONFIGURATIONS, @@ -138,7 +144,10 @@ roles = [ ], ), Role( - name="default", description="", permissions=[Permissions.REQUEST_JEDI_WORKSPACE] + name="default", + display_name="Default", + description="", + permissions=[Permissions.REQUEST_JEDI_WORKSPACE], ), ] diff --git a/tests/factories.py b/tests/factories.py index 2f8677f0..334fc37a 100644 --- a/tests/factories.py +++ b/tests/factories.py @@ -28,6 +28,7 @@ class RoleFactory(Base): model = Role name = factory.Faker("name") + display_name = "Role display name" description = "This is a test role." permissions = [] diff --git a/tests/models/test_workspace_user.py b/tests/models/test_workspace_user.py index ef2c7749..fac20d68 100644 --- a/tests/models/test_workspace_user.py +++ b/tests/models/test_workspace_user.py @@ -1,6 +1,7 @@ from atst.domain.environments import Environments from atst.domain.workspaces import Workspaces from atst.domain.projects import Projects +from atst.models.workspace_user import WorkspaceUser from tests.factories import RequestFactory, UserFactory @@ -37,3 +38,19 @@ def test_has_environment_roles(): ) Environments.add_member(owner, project.environments[0], workspace_user.user) assert workspace_user.has_environment_roles + + +def test_role_displayname(): + owner = UserFactory.create() + developer_data = { + "dod_id": "1234567890", + "first_name": "Test", + "last_name": "User", + "email": "test.user@mail.com", + "workspace_role": "developer", + } + + workspace = Workspaces.create(RequestFactory.create(creator=owner)) + workspace_user = Workspaces.create_member(owner, workspace, developer_data) + + assert workspace_user.role_displayname == "Developer" From b889235bb4e2573663773fb61e5b6fa3032377aa Mon Sep 17 00:00:00 2001 From: richard-dds Date: Mon, 24 Sep 2018 14:19:21 -0400 Subject: [PATCH 2/4] Use role displayname for showing members' workspace role --- templates/workspaces/members/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/workspaces/members/index.html b/templates/workspaces/members/index.html index 02b721a1..9517b137 100644 --- a/templates/workspaces/members/index.html +++ b/templates/workspaces/members/index.html @@ -93,7 +93,7 @@ {{ m.user_name }} {% if not m.has_environment_roles %} No Environment Access {% endif %} {{ m.status }} - {{ m.role }} + {{ m.role_displayname }} {% endfor %} From 86ee4c12a04e46d278fc5039cd1c6e8e3c004222 Mon Sep 17 00:00:00 2001 From: richard-dds Date: Mon, 24 Sep 2018 14:35:32 -0400 Subject: [PATCH 3/4] Use Role.displayname in "workspace role updated" modal --- atst/routes/workspaces.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/atst/routes/workspaces.py b/atst/routes/workspaces.py index 9879d90c..e46427c0 100644 --- a/atst/routes/workspaces.py +++ b/atst/routes/workspaces.py @@ -230,17 +230,17 @@ def update_member(workspace_id, member_id): form = EditMemberForm(http_request.form) if form.validate(): - role = None + new_role_name = None if form.data["workspace_role"] != member.role: - role = form.data["workspace_role"] - Workspaces.update_member(g.current_user, workspace, member, role) + member = Workspaces.update_member(g.current_user, workspace, member, form.data["workspace_role"]) + new_role_name = member.role_displayname return redirect( url_for( "workspaces.workspace_members", workspace_id=workspace.id, memberName=member.user_name, - updatedRole=role, + updatedRole=new_role_name, ) ) else: From 479b5a7f36853814da8e637e1f78f748769b85fc Mon Sep 17 00:00:00 2001 From: richard-dds Date: Mon, 24 Sep 2018 14:51:00 -0400 Subject: [PATCH 4/4] Formatting --- atst/routes/workspaces.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/atst/routes/workspaces.py b/atst/routes/workspaces.py index e46427c0..41947259 100644 --- a/atst/routes/workspaces.py +++ b/atst/routes/workspaces.py @@ -232,7 +232,9 @@ def update_member(workspace_id, member_id): if form.validate(): new_role_name = None if form.data["workspace_role"] != member.role: - member = Workspaces.update_member(g.current_user, workspace, member, form.data["workspace_role"]) + member = Workspaces.update_member( + g.current_user, workspace, member, form.data["workspace_role"] + ) new_role_name = member.role_displayname return redirect(