From ec5c3e8ce8b47b23ae227ec5f82e7d6fafa83bcd Mon Sep 17 00:00:00 2001 From: dandds Date: Wed, 19 Sep 2018 09:06:30 -0400 Subject: [PATCH 1/6] add request name --- ...96111da617_add_name_to_request_revision.py | 28 +++++++++++++++++++ atst/forms/new_request.py | 6 ++++ atst/models/request.py | 1 + atst/models/request_revision.py | 1 + js/lib/input_validations.js | 2 +- templates/requests/screen-1.html | 1 + tests/factories.py | 1 + tests/forms/test_new_request.py | 1 + 8 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 alembic/versions/a496111da617_add_name_to_request_revision.py diff --git a/alembic/versions/a496111da617_add_name_to_request_revision.py b/alembic/versions/a496111da617_add_name_to_request_revision.py new file mode 100644 index 00000000..cdfdaf34 --- /dev/null +++ b/alembic/versions/a496111da617_add_name_to_request_revision.py @@ -0,0 +1,28 @@ +"""add name to request revision + +Revision ID: a496111da617 +Revises: 4f4defb7b440 +Create Date: 2018-09-18 16:45:59.297289 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'a496111da617' +down_revision = '4f4defb7b440' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('request_revisions', sa.Column('name', sa.String(), nullable=True)) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('request_revisions', 'name') + # ### end Alembic commands ### diff --git a/atst/forms/new_request.py b/atst/forms/new_request.py index 368fa63a..c6315b0f 100644 --- a/atst/forms/new_request.py +++ b/atst/forms/new_request.py @@ -147,6 +147,12 @@ class DetailsOfUseForm(ValidatedForm): format="%m/%d/%Y", ) + name = StringField( + "Name your Request", + description="This name serves as a reference for your initial request and the associated workspace that will be created once this request is approved. You may edit this name later.", + validators=[Required(), Length(min=4, max=100, message="Request names must be at least 4 and not more than 100 characters")] + ) + class InformationAboutYouForm(ValidatedForm): fname_request = StringField("First Name", validators=[Required(), Alphabet()]) diff --git a/atst/models/request.py b/atst/models/request.py index d7072d35..f910f40b 100644 --- a/atst/models/request.py +++ b/atst/models/request.py @@ -75,6 +75,7 @@ class Request(Base): "average_daily_traffic_gb", "rationalization_software_systems", "organization_providing_assistance", + "name", ] INFORMATION_ABOUT_YOU_FIELDS = [ "citizenship", diff --git a/atst/models/request_revision.py b/atst/models/request_revision.py index 53b3d31f..2cfee3c4 100644 --- a/atst/models/request_revision.py +++ b/atst/models/request_revision.py @@ -51,6 +51,7 @@ class RequestRevision(Base, TimestampsMixin): average_daily_traffic_gb = Column(Integer) rationalization_software_systems = Column(String) organization_providing_assistance = Column(String) + name = Column(String) # information_about_you citizenship = Column(String) diff --git a/js/lib/input_validations.js b/js/lib/input_validations.js index 1696facc..a2a7f40c 100644 --- a/js/lib/input_validations.js +++ b/js/lib/input_validations.js @@ -83,6 +83,6 @@ export default { mask: false, match: /^.{4,50}$/, unmask: [], - validationError: 'Workspace names must be at least 4 and not more than 50 characters' + validationError: 'Workspace and request names must be at least 4 and not more than 50 characters' }, } diff --git a/templates/requests/screen-1.html b/templates/requests/screen-1.html index a3b3c871..e95bce00 100644 --- a/templates/requests/screen-1.html +++ b/templates/requests/screen-1.html @@ -78,6 +78,7 @@ {{ TextInput(f.dollar_value, validation='dollars', placeholder='$0', tooltip='You may specify a different Total Spend amount to cover other JEDI Cloud services that the JEDI Cloud cost calculator was not able to estimate. Examples may include support packages from the cloud service provider.') }} {{ DateInput(f.start_date, placeholder='MM / DD / YYYY', validation='date') }} + {{ TextInput(f.name, placeholder='Request Name', validation='workspaceName') }} diff --git a/tests/factories.py b/tests/factories.py index 5cd1b7fa..dd342b09 100644 --- a/tests/factories.py +++ b/tests/factories.py @@ -108,6 +108,7 @@ class RequestFactory(Base): def create_initial_revision(cls, request, dollar_value=1000000): user = request.creator default_data = dict( + name=factory.Faker("domain_word"), am_poc=False, dodid_poc=user.dod_id, email_poc=user.email, diff --git a/tests/forms/test_new_request.py b/tests/forms/test_new_request.py index e97cc236..16fa3623 100644 --- a/tests/forms/test_new_request.py +++ b/tests/forms/test_new_request.py @@ -14,6 +14,7 @@ class TestDetailsOfUseForm: "number_user_sessions": "6", "average_daily_traffic": "0", "start_date": "12/12/2050", + "name": "blue-beluga", } migration_data = { "jedi_migration": "yes", From 8fc5a4a0921e4d7f0cdbff61d3fccc24d569d14c Mon Sep 17 00:00:00 2001 From: dandds Date: Wed, 19 Sep 2018 09:54:06 -0400 Subject: [PATCH 2/6] show request name where appropriate and set as default workspace name --- atst/domain/workspaces/workspaces.py | 2 +- atst/models/request.py | 4 ++++ atst/routes/requests/index.py | 2 +- templates/requests/_review.html | 2 ++ templates/requests/approval.html | 2 +- templates/requests/details.html | 2 +- templates/requests/financial_verification.html | 2 +- templates/requests/index.html | 4 ++-- tests/domain/test_workspaces.py | 4 ++-- 9 files changed, 15 insertions(+), 9 deletions(-) diff --git a/atst/domain/workspaces/workspaces.py b/atst/domain/workspaces/workspaces.py index 61996955..df2275a5 100644 --- a/atst/domain/workspaces/workspaces.py +++ b/atst/domain/workspaces/workspaces.py @@ -11,7 +11,7 @@ from .scopes import ScopedWorkspace class Workspaces(object): @classmethod def create(cls, request, name=None): - name = name or request.id + name = name or request.displayname workspace = WorkspacesQuery.create(request=request, name=name) Workspaces._create_workspace_role(request.creator, workspace, "owner") WorkspacesQuery.add_and_commit(workspace) diff --git a/atst/models/request.py b/atst/models/request.py index f910f40b..d43e2c5f 100644 --- a/atst/models/request.py +++ b/atst/models/request.py @@ -213,3 +213,7 @@ class Request(Base): or self.is_pending_financial_verification_changes or self.is_approved ) and self.task_order + + @property + def displayname(self): + return self.latest_revision.name or self.id diff --git a/atst/routes/requests/index.py b/atst/routes/requests/index.py index a59b1f45..b348dec7 100644 --- a/atst/routes/requests/index.py +++ b/atst/routes/requests/index.py @@ -81,7 +81,7 @@ class RequestsIndex(object): return { "workspace_id": request.workspace.id if request.workspace else None, - "order_id": request.id, + "name": request.displayname, "is_new": is_new, "status": request.status_displayname, "app_count": app_count, diff --git a/templates/requests/_review.html b/templates/requests/_review.html index e48f27d0..2bf0d665 100644 --- a/templates/requests/_review.html +++ b/templates/requests/_review.html @@ -80,6 +80,8 @@ {{ DefinitionReviewField("Total Spend", "details_of_use", "dollar_value", filter="dollars") }} {{ DefinitionReviewField("Start Date", "details_of_use", "start_date") }} + + {{ DefinitionReviewField("Request Name", "details_of_use", "name") }}
diff --git a/templates/requests/approval.html b/templates/requests/approval.html index 316ea8d7..9b590ef5 100644 --- a/templates/requests/approval.html +++ b/templates/requests/approval.html @@ -17,7 +17,7 @@
-

Request #{{ request.id }} +

Request: {{ request.displayname }}

{{ current_status }}
diff --git a/templates/requests/details.html b/templates/requests/details.html index 06b860d3..59411fe1 100644 --- a/templates/requests/details.html +++ b/templates/requests/details.html @@ -24,7 +24,7 @@

Request Details

-

#{{ request.id }} {{ request.status_displayname }}

+

{{ request.displayname }} {{ request.status_displayname }}

diff --git a/templates/requests/financial_verification.html b/templates/requests/financial_verification.html index 6f29ee2d..66a5afa2 100644 --- a/templates/requests/financial_verification.html +++ b/templates/requests/financial_verification.html @@ -58,7 +58,7 @@

Financial Verification

-

Order #{{ request.id }}

+

Request: {{ request.displayname }}

diff --git a/templates/requests/index.html b/templates/requests/index.html index 9411776d..67df4760 100644 --- a/templates/requests/index.html +++ b/templates/requests/index.html @@ -90,7 +90,7 @@ - + {% if extended_view %} @@ -107,7 +107,7 @@ {% for r in requests %} diff --git a/tests/domain/test_workspaces.py b/tests/domain/test_workspaces.py index 5ff8aa69..06d3f836 100644 --- a/tests/domain/test_workspaces.py +++ b/tests/domain/test_workspaces.py @@ -35,8 +35,8 @@ def test_request_is_associated_with_workspace(workspace, request_): assert workspace.request == request_ -def test_default_workspace_name_is_request_id(workspace, request_): - assert workspace.name == str(request_.id) +def test_default_workspace_name_is_request_name(workspace, request_): + assert workspace.name == str(request_.displayname) def test_get_nonexistent_workspace_raises(): From abfde388b78f82aebeab5a1d835f4edd434386db Mon Sep 17 00:00:00 2001 From: dandds Date: Wed, 19 Sep 2018 10:38:00 -0400 Subject: [PATCH 3/6] fix bug in a migration --- .../versions/4c425f17bfe8_add_edit_workspace_information_.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alembic/versions/4c425f17bfe8_add_edit_workspace_information_.py b/alembic/versions/4c425f17bfe8_add_edit_workspace_information_.py index e27074f2..bd5e3136 100644 --- a/alembic/versions/4c425f17bfe8_add_edit_workspace_information_.py +++ b/alembic/versions/4c425f17bfe8_add_edit_workspace_information_.py @@ -35,7 +35,7 @@ def downgrade(): session = Session(bind=op.get_bind()) owner_and_admin = session.query(Role).filter(Role.name.in_(["owner", "admin"])).all() - for role in owner_and_ccpo: + for role in owner_and_admin: role.remove_permission(Permissions.EDIT_WORKSPACE_INFORMATION) session.add(role) From f8152f61e7999d2f61f4f524ed6c8a5e96c0bc14 Mon Sep 17 00:00:00 2001 From: dandds Date: Wed, 19 Sep 2018 10:38:36 -0400 Subject: [PATCH 4/6] format request details form --- atst/forms/new_request.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/atst/forms/new_request.py b/atst/forms/new_request.py index c6315b0f..71211a29 100644 --- a/atst/forms/new_request.py +++ b/atst/forms/new_request.py @@ -150,7 +150,14 @@ class DetailsOfUseForm(ValidatedForm): name = StringField( "Name your Request", description="This name serves as a reference for your initial request and the associated workspace that will be created once this request is approved. You may edit this name later.", - validators=[Required(), Length(min=4, max=100, message="Request names must be at least 4 and not more than 100 characters")] + validators=[ + Required(), + Length( + min=4, + max=100, + message="Request names must be at least 4 and not more than 100 characters", + ), + ], ) From 8ce667cea2c023ecb01bf020dbc41579860102dc Mon Sep 17 00:00:00 2001 From: dandds Date: Wed, 19 Sep 2018 11:38:10 -0400 Subject: [PATCH 5/6] workspace and request names can be 100 chars long --- atst/forms/workspace.py | 2 +- js/lib/input_validations.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/atst/forms/workspace.py b/atst/forms/workspace.py index 76dd6aae..9fde98bb 100644 --- a/atst/forms/workspace.py +++ b/atst/forms/workspace.py @@ -10,7 +10,7 @@ class WorkspaceForm(ValidatedForm): validators=[ Length( min=4, - max=50, + max=100, message="Workspace names must be at least 4 and not more than 50 characters", ) ], diff --git a/js/lib/input_validations.js b/js/lib/input_validations.js index a2a7f40c..880f13dd 100644 --- a/js/lib/input_validations.js +++ b/js/lib/input_validations.js @@ -81,7 +81,7 @@ export default { }, workspaceName: { mask: false, - match: /^.{4,50}$/, + match: /^.{4,100}$/, unmask: [], validationError: 'Workspace and request names must be at least 4 and not more than 50 characters' }, From 19296e64c9ddd9397c05a76404fb66595c66e1f9 Mon Sep 17 00:00:00 2001 From: dandds Date: Wed, 19 Sep 2018 12:00:40 -0400 Subject: [PATCH 6/6] fix typos in request name field name and validation --- atst/forms/new_request.py | 2 +- js/lib/input_validations.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/atst/forms/new_request.py b/atst/forms/new_request.py index 71211a29..74f35f51 100644 --- a/atst/forms/new_request.py +++ b/atst/forms/new_request.py @@ -148,7 +148,7 @@ class DetailsOfUseForm(ValidatedForm): ) name = StringField( - "Name your Request", + "Name Your Request", description="This name serves as a reference for your initial request and the associated workspace that will be created once this request is approved. You may edit this name later.", validators=[ Required(), diff --git a/js/lib/input_validations.js b/js/lib/input_validations.js index 880f13dd..4df1f7dd 100644 --- a/js/lib/input_validations.js +++ b/js/lib/input_validations.js @@ -83,6 +83,6 @@ export default { mask: false, match: /^.{4,100}$/, unmask: [], - validationError: 'Workspace and request names must be at least 4 and not more than 50 characters' + validationError: 'Workspace and request names must be at least 4 and not more than 100 characters' }, }
JEDI Cloud Request IDJEDI Cloud Request Name Date Request SubmittedDate Request Last Edited
- {{ r.order_id }} + {{ r.name }} {% if r.action_required %}Action Required{% endif %} {{ r.last_submission_timestamp | formattedDate }}