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"