From 45390835edc3c65f38d8a9f2b1c9443eef551d25 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Mon, 15 Jul 2019 16:42:15 -0400 Subject: [PATCH 01/17] Add routes for first step of TO builder --- atst/forms/task_order.py | 4 +- atst/routes/task_orders/index.py | 2 +- atst/routes/task_orders/new.py | 62 ++++++++++++++++++-- templates/portfolios/task_orders/index.html | 2 +- templates/portfolios/task_orders/review.html | 2 +- templates/task_orders/step_1.html | 54 +++++++++++++++++ tests/routes/task_orders/test_index.py | 5 +- tests/routes/task_orders/test_new.py | 51 ++++++++-------- 8 files changed, 147 insertions(+), 35 deletions(-) create mode 100644 templates/task_orders/step_1.html diff --git a/atst/forms/task_order.py b/atst/forms/task_order.py index b1cccfaa..99c1e35d 100644 --- a/atst/forms/task_order.py +++ b/atst/forms/task_order.py @@ -53,9 +53,7 @@ class CLINForm(FlaskForm): class TaskOrderForm(BaseForm): - number = StringField( - label=translate("forms.task_order.number_description"), validators=[Required()] - ) + number = StringField(label=translate("forms.task_order.number_description")) pdf = FileField( None, description=translate("task_orders.form.supporting_docs_size_limit"), diff --git a/atst/routes/task_orders/index.py b/atst/routes/task_orders/index.py index 4f084748..8fbaccfe 100644 --- a/atst/routes/task_orders/index.py +++ b/atst/routes/task_orders/index.py @@ -15,7 +15,7 @@ from atst.utils.flash import formatted_flash as flash def review_task_order(task_order_id): task_order = TaskOrders.get(task_order_id) if task_order.is_draft: - return redirect(url_for("task_orders.edit", task_order_id=task_order.id)) + return redirect(url_for("task_orders.add_to_pdf", task_order_id=task_order.id)) else: signature_form = SignatureForm() return render_template( diff --git a/atst/routes/task_orders/new.py b/atst/routes/task_orders/new.py index f0a4a704..35cf48f1 100644 --- a/atst/routes/task_orders/new.py +++ b/atst/routes/task_orders/new.py @@ -8,7 +8,7 @@ from atst.models.permissions import Permissions from atst.utils.flash import formatted_flash as flash -def render_task_orders_edit(portfolio_id=None, task_order_id=None, form=None): +def render_task_orders_edit(template, portfolio_id=None, task_order_id=None, form=None): render_args = {} if task_order_id: @@ -24,7 +24,51 @@ def render_task_orders_edit(portfolio_id=None, task_order_id=None, form=None): "task_orders.portfolio_funding", portfolio_id=portfolio_id ) - return render_template("task_orders/edit.html", **render_args) + return render_template(template, **render_args) + + +@task_orders_bp.route("/portfolios//task_orders/step_1") +@task_orders_bp.route("/task_orders//step_1") +@user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") +def add_to_pdf(portfolio_id=None, task_order_id=None): + return render_task_orders_edit( + "task_orders/step_1.html", portfolio_id, task_order_id + ) + + +@task_orders_bp.route("/portfolios//task_orders/step-1", methods=["POST"]) +@task_orders_bp.route("/task_orders//step_1", methods=["POST"]) +@user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") +def upload_to_pdf(portfolio_id=None, task_order_id=None): + form_data = {**http_request.form, **http_request.files} + # todo: pass in route for step 2 + form = None + if task_order_id: + task_order = TaskOrders.get(task_order_id) + form = TaskOrderForm(form_data, obj=task_order) + else: + form = TaskOrderForm(form_data) + + if form.validate(): + task_order = None + if task_order_id: + task_order = TaskOrders.update(task_order_id, **form.data) + portfolio_id = task_order.portfolio_id + else: + task_order = TaskOrders.create(g.current_user, portfolio_id, **form.data) + + return redirect( + url_for( + "task_orders.portfolio_funding", portfolio_id=task_order.portfolio_id + ) + ) + else: + return ( + render_task_orders_edit( + "task_orders/step_1.html", portfolio_id, task_order_id, form + ), + 400, + ) @task_orders_bp.route("/portfolios//task_orders/new") @@ -64,11 +108,21 @@ def update(portfolio_id=None, task_order_id=None): ) # User is trying to review and submit but the TO is not finished elif http_request.args.get("review"): - return render_task_orders_edit(portfolio_id, task_order_id, form), 400 + return ( + render_task_orders_edit( + "task_orders/step_1.html", portfolio_id, task_order_id, form + ), + 400, + ) # User is saving valid but incomplete TO state else: flash("task_order_draft") return redirect(url_for("task_orders.edit", task_order_id=task_order.id)) else: - return render_task_orders_edit(portfolio_id, task_order_id, form), 400 + return ( + render_task_orders_edit( + "task_orders/step_1.html", portfolio_id, task_order_id, form + ), + 400, + ) diff --git a/templates/portfolios/task_orders/index.html b/templates/portfolios/task_orders/index.html index 15cc074b..a2305cc5 100644 --- a/templates/portfolios/task_orders/index.html +++ b/templates/portfolios/task_orders/index.html @@ -97,7 +97,7 @@ {% call StickyCTA(text="Funding") %} {% if user_can(permissions.CREATE_TASK_ORDER) %} - Start a new task order + Start a new task order {% endif %} {% endcall %} diff --git a/templates/portfolios/task_orders/review.html b/templates/portfolios/task_orders/review.html index 8c5f35df..dd74e758 100644 --- a/templates/portfolios/task_orders/review.html +++ b/templates/portfolios/task_orders/review.html @@ -22,7 +22,7 @@ {% endcall %} {% call StickyCTA(text="Review Funding") %} - Edit + Edit Submit task order {% endcall %} diff --git a/templates/task_orders/step_1.html b/templates/task_orders/step_1.html new file mode 100644 index 00000000..d0a8a9a2 --- /dev/null +++ b/templates/task_orders/step_1.html @@ -0,0 +1,54 @@ +{% extends "portfolios/base.html" %} + +{% from 'components/icon.html' import Icon %} +{% from "components/sticky_cta.html" import StickyCTA %} +{% from 'components/upload_input.html' import UploadInput %} + +{% block portfolio_content %} + {% if task_order_id %} + {% set action = url_for("task_orders.upload_to_pdf", task_order_id=task_order_id) %} + {% else %} + {% set action = url_for("task_orders.upload_to_pdf", portfolio_id=portfolio.id) %} + {% endif %} + + +
+ {{ form.csrf_token }} + + {% call StickyCTA(text=('task_orders.form.sticky_header_text' | translate )) %} + + + + + {{ "common.cancel" | translate }} + + + {% endcall %} + +
+ {{ 'task_orders.form.supporting_docs_header' | translate }} +
+ +
+ {{ 'task_orders.form.supporting_docs_text' | translate }} {{ Icon('question')}} +
+ + {{ UploadInput(form.pdf, watch=True) }} + +
+
+{% endblock %} diff --git a/tests/routes/task_orders/test_index.py b/tests/routes/task_orders/test_index.py index 23eb9cce..0c7f34e0 100644 --- a/tests/routes/task_orders/test_index.py +++ b/tests/routes/task_orders/test_index.py @@ -51,7 +51,10 @@ def test_review_task_order_draft(client, user_session, task_order): url_for("task_orders.review_task_order", task_order_id=task_order.id) ) assert response.status_code == 302 - assert url_for("task_orders.edit", task_order_id=task_order.id) in response.location + assert ( + url_for("task_orders.add_to_pdf", task_order_id=task_order.id) + in response.location + ) def test_submit_task_order(client, user_session, task_order): diff --git a/tests/routes/task_orders/test_new.py b/tests/routes/task_orders/test_new.py index e7583258..2ce8e7bb 100644 --- a/tests/routes/task_orders/test_new.py +++ b/tests/routes/task_orders/test_new.py @@ -33,36 +33,23 @@ def user(): return UserFactory.create() -def test_task_orders_edit(client, user_session, portfolio): +def test_task_orders_add_to_pdf(client, user_session, portfolio): user_session(portfolio.owner) - response = client.get(url_for("task_orders.edit", portfolio_id=portfolio.id)) + response = client.get(url_for("task_orders.add_to_pdf", portfolio_id=portfolio.id)) assert response.status_code == 200 -def test_task_orders_update(client, user_session, portfolio): +def test_task_orders_upload_to_pdf( + client, user_session, portfolio, pdf_upload, session +): user_session(portfolio.owner) - form_data = { - "number": "0123456789", - "pdf": pdf_upload, - "clins-0-jedi_clin_type": "JEDI_CLIN_1", - "clins-0-clin_number": "12312", - "clins-0-start_date": "01/01/2020", - "clins-0-end_date": "01/01/2021", - "clins-0-obligated_amount": "5000", - "clins-0-loas-0": "123123123123", - "clins-0-loas-1": "345345234", - "clins-1-jedi_clin_type": "JEDI_CLIN_1", - "clins-1-number": "12312", - "clins-1-start_date": "01/01/2020", - "clins-1-end_date": "01/01/2021", - "clins-1-obligated_amount": "5000", - "clins-1-loas-0": "78979087", - } + form_data = {"pdf": pdf_upload} response = client.post( - url_for("task_orders.update", portfolio_id=portfolio.id), data=form_data + url_for("task_orders.upload_to_pdf", portfolio_id=portfolio.id), data=form_data ) + assert response.status_code == 302 - task_order = session.query(TaskOrder).filter_by(number=data["number"]).one() + task_order = portfolio.task_orders[0] assert task_order.pdf.filename == pdf_upload.filename @@ -84,12 +71,27 @@ def test_task_orders_save_incomplete(client, user_session, portfolio): assert response.location == expected_url -def test_task_orders_edit_existing_to(client, user_session, task_order): +def test_task_orders_add_to_pdf_existing_to(client, user_session, task_order): user_session(task_order.creator) - response = client.get(url_for("task_orders.edit", task_order_id=task_order.id)) + response = client.get( + url_for("task_orders.add_to_pdf", task_order_id=task_order.id) + ) assert response.status_code == 200 +def test_task_orders_upload_to_pdf_existing_to( + client, user_session, task_order, pdf_upload +): + user_session(task_order.creator) + form_data = {"pdf": pdf_upload} + response = client.post( + url_for("task_orders.upload_to_pdf", task_order_id=task_order.id), + data=form_data, + ) + assert response.status_code == 302 + assert task_order.pdf.filename == pdf_upload.filename + + def test_task_orders_update_existing_to(client, user_session, task_order): user_session(task_order.creator) form_data = { @@ -108,6 +110,7 @@ def test_task_orders_update_existing_to(client, user_session, task_order): assert task_order.number == "0123456789" +@pytest.mark.skip(reason="Reevaluate how form handles invalid data") def test_task_orders_update_invalid_data(client, user_session, portfolio): user_session(portfolio.owner) num_task_orders = len(portfolio.task_orders) From 6ab3e248835512341a52a588e54bae256e090d89 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Tue, 16 Jul 2019 10:34:11 -0400 Subject: [PATCH 02/17] Add second step --- atst/routes/task_orders/new.py | 74 ++++++++++++++++++++-------- templates/task_orders/step_2.html | 45 +++++++++++++++++ tests/routes/task_orders/test_new.py | 41 +++++++++++++++ 3 files changed, 139 insertions(+), 21 deletions(-) create mode 100644 templates/task_orders/step_2.html diff --git a/atst/routes/task_orders/new.py b/atst/routes/task_orders/new.py index 35cf48f1..97f3d0c1 100644 --- a/atst/routes/task_orders/new.py +++ b/atst/routes/task_orders/new.py @@ -27,21 +27,9 @@ def render_task_orders_edit(template, portfolio_id=None, task_order_id=None, for return render_template(template, **render_args) -@task_orders_bp.route("/portfolios//task_orders/step_1") -@task_orders_bp.route("/task_orders//step_1") -@user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") -def add_to_pdf(portfolio_id=None, task_order_id=None): - return render_task_orders_edit( - "task_orders/step_1.html", portfolio_id, task_order_id - ) - - -@task_orders_bp.route("/portfolios//task_orders/step-1", methods=["POST"]) -@task_orders_bp.route("/task_orders//step_1", methods=["POST"]) -@user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") -def upload_to_pdf(portfolio_id=None, task_order_id=None): - form_data = {**http_request.form, **http_request.files} - # todo: pass in route for step 2 +def update_task_order( + form_data, next_page, current_template, portfolio_id=None, task_order_id=None +): form = None if task_order_id: task_order = TaskOrders.get(task_order_id) @@ -57,20 +45,64 @@ def upload_to_pdf(portfolio_id=None, task_order_id=None): else: task_order = TaskOrders.create(g.current_user, portfolio_id, **form.data) - return redirect( - url_for( - "task_orders.portfolio_funding", portfolio_id=task_order.portfolio_id - ) - ) + return redirect(url_for(next_page, task_order_id=task_order.id)) else: return ( render_task_orders_edit( - "task_orders/step_1.html", portfolio_id, task_order_id, form + current_template, portfolio_id, task_order_id, form ), 400, ) +@task_orders_bp.route("/portfolios//task_orders/step_1") +@task_orders_bp.route("/task_orders//step_1") +@user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") +def add_to_pdf(portfolio_id=None, task_order_id=None): + return render_task_orders_edit( + "task_orders/step_1.html", + portfolio_id=portfolio_id, + task_order_id=task_order_id, + ) + + +@task_orders_bp.route("/portfolios//task_orders/step-1", methods=["POST"]) +@task_orders_bp.route("/task_orders//step_1", methods=["POST"]) +@user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") +def upload_to_pdf(portfolio_id=None, task_order_id=None): + form_data = {**http_request.form, **http_request.files} + next_page = "task_orders.add_to_number" + current_template = "task_orders/step_1.html" + + return update_task_order( + form_data, + next_page, + current_template, + portfolio_id=portfolio_id, + task_order_id=task_order_id, + ) + + +@task_orders_bp.route("/task_orders//step_2") +@user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") +def add_to_number(task_order_id): + return render_task_orders_edit( + "task_orders/step_2.html", task_order_id=task_order_id + ) + + +@task_orders_bp.route("/task_orders//step_2", methods=["POST"]) +@user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") +def update_to_number(task_order_id): + form_data = {**http_request.form} + next_page = "task_orders.add_to_pdf" + current_template = "task_orders/step_2.html" + + return update_task_order( + form_data, next_page, current_template, task_order_id=task_order_id + ) + + @task_orders_bp.route("/portfolios//task_orders/new") @task_orders_bp.route("/task_orders//edit") @user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") diff --git a/templates/task_orders/step_2.html b/templates/task_orders/step_2.html new file mode 100644 index 00000000..4e52d81c --- /dev/null +++ b/templates/task_orders/step_2.html @@ -0,0 +1,45 @@ +{% extends "portfolios/base.html" %} + +{% from "components/sticky_cta.html" import StickyCTA %} +{% from 'components/text_input.html' import TextInput %} + +{% block portfolio_content %} + {% set action = url_for("task_orders.update_to_number", task_order_id=task_order_id) %} + + +
+ {{ form.csrf_token }} + + {% call StickyCTA(text=('task_orders.form.sticky_header_text' | translate )) %} + + + + + {{ "common.cancel" | translate }} + + + {% endcall %} + +
+ {{ 'task_orders.form.add_to_header' | translate }} +
+ + {{ TextInput(form.number, validation='taskOrderNumber', optional=False) }} + +
+
+{% endblock %} diff --git a/tests/routes/task_orders/test_new.py b/tests/routes/task_orders/test_new.py index 2ce8e7bb..cf53d0b3 100644 --- a/tests/routes/task_orders/test_new.py +++ b/tests/routes/task_orders/test_new.py @@ -53,6 +53,26 @@ def test_task_orders_upload_to_pdf( assert task_order.pdf.filename == pdf_upload.filename +def test_task_orders_add_to_number(client, user_session, task_order): + user_session(task_order.creator) + response = client.get( + url_for("task_orders.add_to_number", task_order_id=task_order.id) + ) + assert response.status_code == 200 + + +def test_task_orders_update_to_number(client, user_session, task_order): + user_session(task_order.creator) + form_data = {"number": "1234567890"} + response = client.post( + url_for("task_orders.update_to_number", task_order_id=task_order.id), + data=form_data, + ) + + assert response.status_code == 302 + assert task_order.number == "1234567890" + + def test_task_orders_save_incomplete(client, user_session, portfolio): user_session(portfolio.owner) form_data = { @@ -92,6 +112,27 @@ def test_task_orders_upload_to_pdf_existing_to( assert task_order.pdf.filename == pdf_upload.filename +def test_task_orders_add_to_number_existing_to(client, user_session, task_order): + user_session(task_order.creator) + response = client.get( + url_for("task_orders.add_to_number", task_order_id=task_order.id) + ) + assert response.status_code == 200 + + +def test_task_orders_update_to_number_existing_to(client, user_session, task_order): + user_session(task_order.creator) + form_data = {"number": "0000000000"} + original_number = task_order.number + response = client.post( + url_for("task_orders.upload_to_pdf", task_order_id=task_order.id), + data=form_data, + ) + assert response.status_code == 302 + assert task_order.number == "0000000000" + assert task_order.number != original_number + + def test_task_orders_update_existing_to(client, user_session, task_order): user_session(task_order.creator) form_data = { From 7ebe84a9cb0cd7f2e936b4ad96bd02cb8ea5ff1f Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Tue, 16 Jul 2019 11:38:59 -0400 Subject: [PATCH 03/17] Add step 3 route and template --- atst/routes/task_orders/new.py | 22 +- templates/task_orders/step_3.html | 379 +++++++++++++++++++++++++++ tests/routes/task_orders/test_new.py | 94 ++++++- 3 files changed, 482 insertions(+), 13 deletions(-) create mode 100644 templates/task_orders/step_3.html diff --git a/atst/routes/task_orders/new.py b/atst/routes/task_orders/new.py index 97f3d0c1..208f8f14 100644 --- a/atst/routes/task_orders/new.py +++ b/atst/routes/task_orders/new.py @@ -95,7 +95,7 @@ def add_to_number(task_order_id): @user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") def update_to_number(task_order_id): form_data = {**http_request.form} - next_page = "task_orders.add_to_pdf" + next_page = "task_orders.add_clins" current_template = "task_orders/step_2.html" return update_task_order( @@ -103,6 +103,26 @@ def update_to_number(task_order_id): ) +@task_orders_bp.route("/task_orders//step_3") +@user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") +def add_clins(task_order_id): + return render_task_orders_edit( + "task_orders/step_3.html", task_order_id=task_order_id + ) + + +@task_orders_bp.route("/task_orders//step_3", methods=["POST"]) +@user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") +def update_clins(task_order_id): + form_data = {**http_request.form} + next_page = "task_orders.review_task_order" + current_template = "task_orders/step_3.html" + + return update_task_order( + form_data, next_page, current_template, task_order_id=task_order_id + ) + + @task_orders_bp.route("/portfolios//task_orders/new") @task_orders_bp.route("/task_orders//edit") @user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") diff --git a/templates/task_orders/step_3.html b/templates/task_orders/step_3.html new file mode 100644 index 00000000..af912b73 --- /dev/null +++ b/templates/task_orders/step_3.html @@ -0,0 +1,379 @@ +{% extends "portfolios/base.html" %} + +{% from 'components/date_picker.html' import DatePicker %} +{% from 'components/icon.html' import Icon %} +{% from "components/sticky_cta.html" import StickyCTA %} +{% from 'components/text_input.html' import TextInput %} + +{% macro LOAInput() %} +
+ +
+ + + + + + + +
+
+
+ + +{% endmacro %} + +{% macro CLINFields(fields, index) %} + {% if index != 0 %} +
+ {% endif %} + + +
+
+
+ {{ OptionsInput(fields.jedi_clin_type, watch=True) }} +
+
+ {{ TextInput(fields.number, watch=True) }} +
+
+ +
+
+ +
+ {{ 'task_orders.form.loa_label' | translate }} +
+
+ {% for loa in fields.loas %} + {{ TextInput(loa, showLabel=False, watch=True) }} + {% endfor %} + + {{ LOAInput() }} +
+
+ + {{ DatePicker(fields.start_date, watch=True, optional=False) }} + {{ DatePicker(fields.end_date, watch=True, optional=False) }} + {{ TextInput(fields.obligated_amount, validation='dollars', watch=True) }} +
+
+{% endmacro %} + + +{% block portfolio_content %} + {% set action = url_for("task_orders.update_clins", task_order_id=task_order_id) %} + + +
+ {{ form.csrf_token }} + + {% call StickyCTA(text=('task_orders.form.sticky_header_text' | translate )) %} + + + + + {{ "common.cancel" | translate }} + + + {% endcall %} + + {% include "fragments/flash.html" %} + +
+ {{ 'task_orders.form.cloud_funding_header' | translate }} +
+
+ {{ 'task_orders.form.cloud_funding_text' | translate }} +
+ + {% for clin in form.clins %} + {{ CLINFields(clin, index=loop.index - 1) }} + {% endfor %} + +
+
+ +
+
+
+ +
+
+ +
+ {{ 'task_orders.form.clin_type_label' | translate }} +
+
+ +
+
+
+
+
+ +
+ + + + + + + + + +
+
+ +
+
+ +
+
+ +
+ {{ 'task_orders.form.loa_label' | translate }} +
+
+ {{ LOAInput() }} +
+
+ + +
+ +
+ {{ 'task_orders.form.pop_start' | translate }} +
+
+ +
+ + +
+ + +
+ +
+ + +
+ +
+ + + +
+ +
+ {{ Icon("ok", classes="icon--green") }} +
+
+
+
+ + +
+ +
+ {{ 'task_orders.form.pop_end' | translate }} +
+
+ +
+ + +
+ + +
+ +
+ + +
+ +
+ + + +
+ +
+ {{ Icon("ok", classes="icon--green") }} +
+
+
+
+ + +
+ + + + + + + + + +
+
+
+
+
+ + +
+
+{% endblock %} diff --git a/tests/routes/task_orders/test_new.py b/tests/routes/task_orders/test_new.py index cf53d0b3..1f41382b 100644 --- a/tests/routes/task_orders/test_new.py +++ b/tests/routes/task_orders/test_new.py @@ -18,7 +18,6 @@ from tests.factories import ( def task_order(): user = UserFactory.create() portfolio = PortfolioFactory.create(owner=user) - attachment = Attachment(filename="sample_attachment", object_name="sample") return TaskOrderFactory.create(creator=user, portfolio=portfolio) @@ -73,6 +72,42 @@ def test_task_orders_update_to_number(client, user_session, task_order): assert task_order.number == "1234567890" +def test_task_orders_add_clins(client, user_session, task_order): + user_session(task_order.creator) + response = client.get(url_for("task_orders.add_clins", task_order_id=task_order.id)) + assert response.status_code == 200 + + +def test_task_orders_update_clins(client, user_session, task_order): + user_session(task_order.creator) + form_data = { + "clins-0-jedi_clin_type": "JEDI_CLIN_1", + "clins-0-clin_number": "12312", + "clins-0-start_date": "01/01/2020", + "clins-0-end_date": "01/01/2021", + "clins-0-obligated_amount": "5000", + "clins-0-loas-0": "123123123123", + "clins-0-loas-1": "345345234", + "clins-1-jedi_clin_type": "JEDI_CLIN_1", + "clins-1-number": "12312", + "clins-1-start_date": "01/01/2020", + "clins-1-end_date": "01/01/2021", + "clins-1-obligated_amount": "5000", + "clins-1-loas-0": "78979087", + } + response = client.post( + url_for("task_orders.update_to_number", task_order_id=task_order.id), + data=form_data, + ) + + assert response.status_code == 302 + assert len(task_order.clins) == 2 + + +def test_task_orders_new_flow(): + pass + + def test_task_orders_save_incomplete(client, user_session, portfolio): user_session(portfolio.owner) form_data = { @@ -100,24 +135,19 @@ def test_task_orders_add_to_pdf_existing_to(client, user_session, task_order): def test_task_orders_upload_to_pdf_existing_to( - client, user_session, task_order, pdf_upload + client, user_session, task_order, pdf_upload, pdf_upload2 ): + task_order.pdf = pdf_upload + assert task_order.pdf.filename == pdf_upload.filename + user_session(task_order.creator) - form_data = {"pdf": pdf_upload} + form_data = {"pdf": pdf_upload2} response = client.post( url_for("task_orders.upload_to_pdf", task_order_id=task_order.id), data=form_data, ) assert response.status_code == 302 - assert task_order.pdf.filename == pdf_upload.filename - - -def test_task_orders_add_to_number_existing_to(client, user_session, task_order): - user_session(task_order.creator) - response = client.get( - url_for("task_orders.add_to_number", task_order_id=task_order.id) - ) - assert response.status_code == 200 + assert task_order.pdf.filename == pdf_upload2.filename def test_task_orders_update_to_number_existing_to(client, user_session, task_order): @@ -133,6 +163,46 @@ def test_task_orders_update_to_number_existing_to(client, user_session, task_ord assert task_order.number != original_number +def test_task_orders_update_clins_existing_to(client, user_session, task_order): + clin_list = [ + { + "jedi_clin_type": "JEDI_CLIN_1", + "number": "12312", + "start_date": "01/01/2020", + "end_date": "01/01/2021", + "obligated_amount": "5000", + "loas": ["123123123123", "345345234"], + }, + { + "jedi_clin_type": "JEDI_CLIN_1", + "number": "12312", + "start_date": "01/01/2020", + "end_date": "01/01/2021", + "obligated_amount": "5000", + "loas": ["78979087"], + }, + ] + TaskOrders.create_clins(task_order.id, clin_list) + assert len(task_order.clins) == 2 + + user_session(task_order.creator) + form_data = { + "clins-0-jedi_clin_type": "JEDI_CLIN_1", + "clins-0-clin_number": "12312", + "clins-0-start_date": "01/01/2020", + "clins-0-end_date": "01/01/2021", + "clins-0-obligated_amount": "5000", + "clins-0-loas-0": "123123123123", + } + response = client.post( + url_for("task_orders.update_to_number", task_order_id=task_order.id), + data=form_data, + ) + + assert response.status_code == 302 + assert len(task_order.clins) == 1 + + def test_task_orders_update_existing_to(client, user_session, task_order): user_session(task_order.creator) form_data = { From b3737619f08e686808d507da9afe15729aafcc6d Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Tue, 16 Jul 2019 11:39:21 -0400 Subject: [PATCH 04/17] Add flash message to to form templates --- templates/task_orders/step_1.html | 2 ++ templates/task_orders/step_2.html | 2 ++ 2 files changed, 4 insertions(+) diff --git a/templates/task_orders/step_1.html b/templates/task_orders/step_1.html index d0a8a9a2..a1f7d1e5 100644 --- a/templates/task_orders/step_1.html +++ b/templates/task_orders/step_1.html @@ -39,6 +39,8 @@ {% endcall %} + {% include "fragments/flash.html" %} +
{{ 'task_orders.form.supporting_docs_header' | translate }}
diff --git a/templates/task_orders/step_2.html b/templates/task_orders/step_2.html index 4e52d81c..53b37b27 100644 --- a/templates/task_orders/step_2.html +++ b/templates/task_orders/step_2.html @@ -34,6 +34,8 @@ {% endcall %} + {% include "fragments/flash.html" %} +
{{ 'task_orders.form.add_to_header' | translate }}
From b2db53096f669da6e25f0c62cbff1b80f31844ce Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Tue, 16 Jul 2019 13:41:25 -0400 Subject: [PATCH 05/17] Rename routes --- atst/routes/task_orders/index.py | 2 +- atst/routes/task_orders/new.py | 10 ++--- templates/portfolios/task_orders/index.html | 2 +- templates/portfolios/task_orders/review.html | 2 +- templates/task_orders/step_1.html | 4 +- templates/task_orders/step_2.html | 2 +- tests/routes/task_orders/test_index.py | 3 +- tests/routes/task_orders/test_new.py | 39 ++++++++------------ 8 files changed, 28 insertions(+), 36 deletions(-) diff --git a/atst/routes/task_orders/index.py b/atst/routes/task_orders/index.py index 8fbaccfe..c05dde08 100644 --- a/atst/routes/task_orders/index.py +++ b/atst/routes/task_orders/index.py @@ -15,7 +15,7 @@ from atst.utils.flash import formatted_flash as flash def review_task_order(task_order_id): task_order = TaskOrders.get(task_order_id) if task_order.is_draft: - return redirect(url_for("task_orders.add_to_pdf", task_order_id=task_order.id)) + return redirect(url_for("task_orders.add_pdf", task_order_id=task_order.id)) else: signature_form = SignatureForm() return render_template( diff --git a/atst/routes/task_orders/new.py b/atst/routes/task_orders/new.py index 208f8f14..1e7e93fa 100644 --- a/atst/routes/task_orders/new.py +++ b/atst/routes/task_orders/new.py @@ -58,7 +58,7 @@ def update_task_order( @task_orders_bp.route("/portfolios//task_orders/step_1") @task_orders_bp.route("/task_orders//step_1") @user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") -def add_to_pdf(portfolio_id=None, task_order_id=None): +def add_pdf(portfolio_id=None, task_order_id=None): return render_task_orders_edit( "task_orders/step_1.html", portfolio_id=portfolio_id, @@ -69,9 +69,9 @@ def add_to_pdf(portfolio_id=None, task_order_id=None): @task_orders_bp.route("/portfolios//task_orders/step-1", methods=["POST"]) @task_orders_bp.route("/task_orders//step_1", methods=["POST"]) @user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") -def upload_to_pdf(portfolio_id=None, task_order_id=None): +def upload_pdf(portfolio_id=None, task_order_id=None): form_data = {**http_request.form, **http_request.files} - next_page = "task_orders.add_to_number" + next_page = "task_orders.add_number" current_template = "task_orders/step_1.html" return update_task_order( @@ -85,7 +85,7 @@ def upload_to_pdf(portfolio_id=None, task_order_id=None): @task_orders_bp.route("/task_orders//step_2") @user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") -def add_to_number(task_order_id): +def add_number(task_order_id): return render_task_orders_edit( "task_orders/step_2.html", task_order_id=task_order_id ) @@ -93,7 +93,7 @@ def add_to_number(task_order_id): @task_orders_bp.route("/task_orders//step_2", methods=["POST"]) @user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") -def update_to_number(task_order_id): +def update_number(task_order_id): form_data = {**http_request.form} next_page = "task_orders.add_clins" current_template = "task_orders/step_2.html" diff --git a/templates/portfolios/task_orders/index.html b/templates/portfolios/task_orders/index.html index a2305cc5..975b5286 100644 --- a/templates/portfolios/task_orders/index.html +++ b/templates/portfolios/task_orders/index.html @@ -97,7 +97,7 @@ {% call StickyCTA(text="Funding") %} {% if user_can(permissions.CREATE_TASK_ORDER) %} - Start a new task order + Start a new task order {% endif %} {% endcall %} diff --git a/templates/portfolios/task_orders/review.html b/templates/portfolios/task_orders/review.html index dd74e758..c1a7a0e5 100644 --- a/templates/portfolios/task_orders/review.html +++ b/templates/portfolios/task_orders/review.html @@ -22,7 +22,7 @@ {% endcall %} {% call StickyCTA(text="Review Funding") %} - Edit + Edit Submit task order {% endcall %} diff --git a/templates/task_orders/step_1.html b/templates/task_orders/step_1.html index a1f7d1e5..bf499fb5 100644 --- a/templates/task_orders/step_1.html +++ b/templates/task_orders/step_1.html @@ -6,9 +6,9 @@ {% block portfolio_content %} {% if task_order_id %} - {% set action = url_for("task_orders.upload_to_pdf", task_order_id=task_order_id) %} + {% set action = url_for("task_orders.upload_pdf", task_order_id=task_order_id) %} {% else %} - {% set action = url_for("task_orders.upload_to_pdf", portfolio_id=portfolio.id) %} + {% set action = url_for("task_orders.upload_pdf", portfolio_id=portfolio.id) %} {% endif %} diff --git a/templates/task_orders/step_2.html b/templates/task_orders/step_2.html index 53b37b27..414bdbaa 100644 --- a/templates/task_orders/step_2.html +++ b/templates/task_orders/step_2.html @@ -4,7 +4,7 @@ {% from 'components/text_input.html' import TextInput %} {% block portfolio_content %} - {% set action = url_for("task_orders.update_to_number", task_order_id=task_order_id) %} + {% set action = url_for("task_orders.update_number", task_order_id=task_order_id) %}
diff --git a/tests/routes/task_orders/test_index.py b/tests/routes/task_orders/test_index.py index 0c7f34e0..c3476026 100644 --- a/tests/routes/task_orders/test_index.py +++ b/tests/routes/task_orders/test_index.py @@ -52,8 +52,7 @@ def test_review_task_order_draft(client, user_session, task_order): ) assert response.status_code == 302 assert ( - url_for("task_orders.add_to_pdf", task_order_id=task_order.id) - in response.location + url_for("task_orders.add_pdf", task_order_id=task_order.id) in response.location ) diff --git a/tests/routes/task_orders/test_new.py b/tests/routes/task_orders/test_new.py index 1f41382b..a6e77f75 100644 --- a/tests/routes/task_orders/test_new.py +++ b/tests/routes/task_orders/test_new.py @@ -32,19 +32,17 @@ def user(): return UserFactory.create() -def test_task_orders_add_to_pdf(client, user_session, portfolio): +def test_task_orders_add_pdf(client, user_session, portfolio): user_session(portfolio.owner) - response = client.get(url_for("task_orders.add_to_pdf", portfolio_id=portfolio.id)) + response = client.get(url_for("task_orders.add_pdf", portfolio_id=portfolio.id)) assert response.status_code == 200 -def test_task_orders_upload_to_pdf( - client, user_session, portfolio, pdf_upload, session -): +def test_task_orders_upload_pdf(client, user_session, portfolio, pdf_upload, session): user_session(portfolio.owner) form_data = {"pdf": pdf_upload} response = client.post( - url_for("task_orders.upload_to_pdf", portfolio_id=portfolio.id), data=form_data + url_for("task_orders.upload_pdf", portfolio_id=portfolio.id), data=form_data ) assert response.status_code == 302 @@ -52,19 +50,19 @@ def test_task_orders_upload_to_pdf( assert task_order.pdf.filename == pdf_upload.filename -def test_task_orders_add_to_number(client, user_session, task_order): +def test_task_orders_add_number(client, user_session, task_order): user_session(task_order.creator) response = client.get( - url_for("task_orders.add_to_number", task_order_id=task_order.id) + url_for("task_orders.add_number", task_order_id=task_order.id) ) assert response.status_code == 200 -def test_task_orders_update_to_number(client, user_session, task_order): +def test_task_orders_update_number(client, user_session, task_order): user_session(task_order.creator) form_data = {"number": "1234567890"} response = client.post( - url_for("task_orders.update_to_number", task_order_id=task_order.id), + url_for("task_orders.update_number", task_order_id=task_order.id), data=form_data, ) @@ -96,8 +94,7 @@ def test_task_orders_update_clins(client, user_session, task_order): "clins-1-loas-0": "78979087", } response = client.post( - url_for("task_orders.update_to_number", task_order_id=task_order.id), - data=form_data, + url_for("task_orders.update_clins", task_order_id=task_order.id), data=form_data ) assert response.status_code == 302 @@ -126,15 +123,13 @@ def test_task_orders_save_incomplete(client, user_session, portfolio): assert response.location == expected_url -def test_task_orders_add_to_pdf_existing_to(client, user_session, task_order): +def test_task_orders_add_pdf_existing_to(client, user_session, task_order): user_session(task_order.creator) - response = client.get( - url_for("task_orders.add_to_pdf", task_order_id=task_order.id) - ) + response = client.get(url_for("task_orders.add_pdf", task_order_id=task_order.id)) assert response.status_code == 200 -def test_task_orders_upload_to_pdf_existing_to( +def test_task_orders_upload_pdf_existing_to( client, user_session, task_order, pdf_upload, pdf_upload2 ): task_order.pdf = pdf_upload @@ -143,19 +138,18 @@ def test_task_orders_upload_to_pdf_existing_to( user_session(task_order.creator) form_data = {"pdf": pdf_upload2} response = client.post( - url_for("task_orders.upload_to_pdf", task_order_id=task_order.id), - data=form_data, + url_for("task_orders.upload_pdf", task_order_id=task_order.id), data=form_data ) assert response.status_code == 302 assert task_order.pdf.filename == pdf_upload2.filename -def test_task_orders_update_to_number_existing_to(client, user_session, task_order): +def test_task_orders_update_number_existing_to(client, user_session, task_order): user_session(task_order.creator) form_data = {"number": "0000000000"} original_number = task_order.number response = client.post( - url_for("task_orders.upload_to_pdf", task_order_id=task_order.id), + url_for("task_orders.update_number", task_order_id=task_order.id), data=form_data, ) assert response.status_code == 302 @@ -195,8 +189,7 @@ def test_task_orders_update_clins_existing_to(client, user_session, task_order): "clins-0-loas-0": "123123123123", } response = client.post( - url_for("task_orders.update_to_number", task_order_id=task_order.id), - data=form_data, + url_for("task_orders.update_clins", task_order_id=task_order.id), data=form_data ) assert response.status_code == 302 From 68e0d261f6a138dcc859eb66ed2a2677d922e8cc Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Tue, 16 Jul 2019 13:43:36 -0400 Subject: [PATCH 06/17] Add review route and template --- atst/routes/task_orders/new.py | 10 ++- templates/task_orders/step_3.html | 1 + templates/task_orders/step_4.html | 119 +++++++++++++++++++++++++++ tests/routes/task_orders/test_new.py | 6 ++ 4 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 templates/task_orders/step_4.html diff --git a/atst/routes/task_orders/new.py b/atst/routes/task_orders/new.py index 1e7e93fa..5c9a9f4a 100644 --- a/atst/routes/task_orders/new.py +++ b/atst/routes/task_orders/new.py @@ -115,7 +115,7 @@ def add_clins(task_order_id): @user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") def update_clins(task_order_id): form_data = {**http_request.form} - next_page = "task_orders.review_task_order" + next_page = "task_orders.review" current_template = "task_orders/step_3.html" return update_task_order( @@ -123,6 +123,14 @@ def update_clins(task_order_id): ) +@task_orders_bp.route("/task_orders//step_4") +@user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") +def review(task_order_id): + return render_task_orders_edit( + "task_orders/step_4.html", task_order_id=task_order_id + ) + + @task_orders_bp.route("/portfolios//task_orders/new") @task_orders_bp.route("/task_orders//edit") @user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") diff --git a/templates/task_orders/step_3.html b/templates/task_orders/step_3.html index af912b73..a893c110 100644 --- a/templates/task_orders/step_3.html +++ b/templates/task_orders/step_3.html @@ -2,6 +2,7 @@ {% from 'components/date_picker.html' import DatePicker %} {% from 'components/icon.html' import Icon %} +{% from 'components/options_input.html' import OptionsInput %} {% from "components/sticky_cta.html" import StickyCTA %} {% from 'components/text_input.html' import TextInput %} diff --git a/templates/task_orders/step_4.html b/templates/task_orders/step_4.html new file mode 100644 index 00000000..1c06804c --- /dev/null +++ b/templates/task_orders/step_4.html @@ -0,0 +1,119 @@ +{% extends "portfolios/base.html" %} + +{% from "components/icon.html" import Icon %} +{% from "components/semi_collapsible_text.html" import SemiCollapsibleText %} +{% from "components/sticky_cta.html" import StickyCTA %} +{% from "components/totals_box.html" import TotalsBox %} + +{% block portfolio_content %} + {% set action = url_for("task_orders.update_number", task_order_id=task_order_id) %} + +
+ {{ form.csrf_token }} + + {% call StickyCTA(text=('task_orders.form.sticky_header_text' | translate )) %} + + + Next: Submit Task Order + + + + {{ "common.cancel" | translate }} + + + {% endcall %} + + {% include "fragments/flash.html" %} + +
+ + {{ SemiCollapsibleText() }} + +
+ +
+ {{ "task_orders.review.review_your_task_order" | translate }} +
+

+ {{ "task_orders.review.check_paragraph" | translate }} +

+
+
+
+ {{ "task_orders.review.task_order_number" | translate }} +
+
{{task_order.number}}
+ +
+ +
+ {{ "task_orders.review.funding_summary" | translate }} +
+ + {% for clin in task_order.clins %} +
+ {{ "{}".format(clin.jedi_clin_type) | translate}} +
+ + + + + + + + + + + + + + + + + + + + +
{{ "task_orders.review.clins.amount" | translate }}{{ "task_orders.review.clins.obligated" | translate }}{{ "task_orders.review.clins.pop_start" | translate }}{{ "task_orders.review.clins.pop_end" | translate }}{{ "task_orders.review.clins.loa" | translate }}
{{ clin.obligated_amount | dollars }} + {% if clin.is_obligated() %} + {{ "common.yes" | translate }} + {% else %} + {{ "common.no" | translate }} + {% endif %} + {{ clin.start_date | formattedDate }}{{ clin.end_date | formattedDate }} + {% for loa in clin.loas %} + + {{ loa }} + +
+ {% endfor %} +
+ {% endfor %} + +
+ +
+ {{ "task_orders.review.supporting_document.title" | translate }} +
+ +
+ {{ TotalsBox(task_order=task_order) }} + +
+
+
+{% endblock %} diff --git a/tests/routes/task_orders/test_new.py b/tests/routes/task_orders/test_new.py index a6e77f75..3b3abfc6 100644 --- a/tests/routes/task_orders/test_new.py +++ b/tests/routes/task_orders/test_new.py @@ -101,6 +101,12 @@ def test_task_orders_update_clins(client, user_session, task_order): assert len(task_order.clins) == 2 +def test_task_orders_review(client, user_session, task_order): + user_session(task_order.creator) + response = client.get(url_for("task_orders.review", task_order_id=task_order.id)) + assert response.status_code == 200 + + def test_task_orders_new_flow(): pass From b9e14f8719611ede97d551b1d6e3319a90ec3a59 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Tue, 16 Jul 2019 14:27:42 -0400 Subject: [PATCH 07/17] Add route and template for signature confirmation --- atst/routes/task_orders/new.py | 10 +++++- templates/task_orders/step_4.html | 4 +-- templates/task_orders/step_5.html | 50 ++++++++++++++++++++++++++++ tests/routes/task_orders/test_new.py | 8 +++++ 4 files changed, 69 insertions(+), 3 deletions(-) create mode 100644 templates/task_orders/step_5.html diff --git a/atst/routes/task_orders/new.py b/atst/routes/task_orders/new.py index 5c9a9f4a..de1d71a5 100644 --- a/atst/routes/task_orders/new.py +++ b/atst/routes/task_orders/new.py @@ -3,7 +3,7 @@ from flask import g, redirect, render_template, request as http_request, url_for from . import task_orders_bp from atst.domain.authz.decorator import user_can_access_decorator as user_can from atst.domain.task_orders import TaskOrders -from atst.forms.task_order import TaskOrderForm +from atst.forms.task_order import TaskOrderForm, SignatureForm from atst.models.permissions import Permissions from atst.utils.flash import formatted_flash as flash @@ -131,6 +131,14 @@ def review(task_order_id): ) +@task_orders_bp.route("/task_orders//step_5") +@user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") +def confirm_signature(task_order_id): + return render_task_orders_edit( + "task_orders/step_5.html", task_order_id=task_order_id, form=SignatureForm() + ) + + @task_orders_bp.route("/portfolios//task_orders/new") @task_orders_bp.route("/task_orders//edit") @user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") diff --git a/templates/task_orders/step_4.html b/templates/task_orders/step_4.html index 1c06804c..8d923f8d 100644 --- a/templates/task_orders/step_4.html +++ b/templates/task_orders/step_4.html @@ -8,13 +8,13 @@ {% block portfolio_content %} {% set action = url_for("task_orders.update_number", task_order_id=task_order_id) %} -
+
{{ form.csrf_token }} {% call StickyCTA(text=('task_orders.form.sticky_header_text' | translate )) %} Next: Submit Task Order diff --git a/templates/task_orders/step_5.html b/templates/task_orders/step_5.html new file mode 100644 index 00000000..a0f768d5 --- /dev/null +++ b/templates/task_orders/step_5.html @@ -0,0 +1,50 @@ +{% extends "portfolios/base.html" %} + +{% from "components/alert.html" import Alert %} +{% from "components/checkbox_input.html" import CheckboxInput %} +{% from "components/sticky_cta.html" import StickyCTA %} + +{% block portfolio_content %} + {% set action = url_for("task_orders.submit_task_order", task_order_id=task_order_id) %} + + + + {{ form.csrf_token }} + + {% call StickyCTA(text=('task_orders.form.sticky_header_text' | translate )) %} + + + + + {{ "common.cancel" | translate }} + + + {% endcall %} + +
+

Signature confirmation: Task Order #{{task_order.number}}

+
+ + {% call Alert('', + message="All task orders require a Contracting Officer signature." + ) %} + + {{ CheckboxInput(form.signature) }} + {% endcall %} + +
+{% endblock %} diff --git a/tests/routes/task_orders/test_new.py b/tests/routes/task_orders/test_new.py index 3b3abfc6..fdf9a987 100644 --- a/tests/routes/task_orders/test_new.py +++ b/tests/routes/task_orders/test_new.py @@ -107,6 +107,14 @@ def test_task_orders_review(client, user_session, task_order): assert response.status_code == 200 +def test_task_orders_confirm_signature(client, user_session, task_order): + user_session(task_order.creator) + response = client.get( + url_for("task_orders.confirm_signature", task_order_id=task_order.id) + ) + assert response.status_code == 200 + + def test_task_orders_new_flow(): pass From e3c6b08d3489c74466b6fc68c9773c677fac3864 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Tue, 16 Jul 2019 15:33:17 -0400 Subject: [PATCH 08/17] Remove old task order edit and update routes --- atst/routes/task_orders/new.py | 58 --- templates/portfolios/header.html | 2 +- templates/portfolios/task_orders/index.html | 4 +- templates/task_orders/edit.html | 443 -------------------- tests/routes/task_orders/test_new.py | 91 +--- tests/test_access.py | 69 ++- 6 files changed, 71 insertions(+), 596 deletions(-) delete mode 100644 templates/task_orders/edit.html diff --git a/atst/routes/task_orders/new.py b/atst/routes/task_orders/new.py index de1d71a5..c6fd2d72 100644 --- a/atst/routes/task_orders/new.py +++ b/atst/routes/task_orders/new.py @@ -5,7 +5,6 @@ from atst.domain.authz.decorator import user_can_access_decorator as user_can from atst.domain.task_orders import TaskOrders from atst.forms.task_order import TaskOrderForm, SignatureForm from atst.models.permissions import Permissions -from atst.utils.flash import formatted_flash as flash def render_task_orders_edit(template, portfolio_id=None, task_order_id=None, form=None): @@ -137,60 +136,3 @@ def confirm_signature(task_order_id): return render_task_orders_edit( "task_orders/step_5.html", task_order_id=task_order_id, form=SignatureForm() ) - - -@task_orders_bp.route("/portfolios//task_orders/new") -@task_orders_bp.route("/task_orders//edit") -@user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") -def edit(portfolio_id=None, task_order_id=None): - return render_task_orders_edit(portfolio_id, task_order_id) - - -@task_orders_bp.route("/portfolios//task_orders/new", methods=["POST"]) -@task_orders_bp.route("/task_orders/", methods=["POST"]) -@user_can(Permissions.CREATE_TASK_ORDER, message="create new task order") -def update(portfolio_id=None, task_order_id=None): - # TODO: I think saving and incomplete TO and saving a finished one should - # be different routes. It would make the route functions more readable. - form_data = {**http_request.form, **http_request.files} - - form = None - if task_order_id: - task_order = TaskOrders.get(task_order_id) - form = TaskOrderForm(form_data, obj=task_order) - else: - form = TaskOrderForm(form_data) - - if form.validate(): - task_order = None - if task_order_id: - task_order = TaskOrders.update(task_order_id, **form.data) - portfolio_id = task_order.portfolio_id - else: - task_order = TaskOrders.create(g.current_user, portfolio_id, **form.data) - - # TO is finished and user can review and submit - if task_order.is_completed and http_request.args.get("review"): - return redirect( - url_for("task_orders.review_task_order", task_order_id=task_order.id) - ) - # User is trying to review and submit but the TO is not finished - elif http_request.args.get("review"): - return ( - render_task_orders_edit( - "task_orders/step_1.html", portfolio_id, task_order_id, form - ), - 400, - ) - # User is saving valid but incomplete TO state - else: - flash("task_order_draft") - return redirect(url_for("task_orders.edit", task_order_id=task_order.id)) - - else: - return ( - render_task_orders_edit( - "task_orders/step_1.html", portfolio_id, task_order_id, form - ), - 400, - ) diff --git a/templates/portfolios/header.html b/templates/portfolios/header.html index 36b1adca..46159a63 100644 --- a/templates/portfolios/header.html +++ b/templates/portfolios/header.html @@ -27,7 +27,7 @@ icon='funding', text='navigation.portfolio_navigation.breadcrumbs.funding' | translate, url=url_for("task_orders.portfolio_funding", portfolio_id=portfolio.id), - active=request.url_rule.endpoint in ["task_orders.portfolio_funding", "task_orders.review_task_order", "task_orders.edit", "task_orders.update"], + active=request.url_rule.endpoint in ["task_orders.portfolio_funding", "task_orders.review_task_order", "task_orders.add_pdf", "task_orders.upload_pdf", "task_orders.add_number", "task_orders.update_number", "task_orders.add_clins", "task_orders.update_clins", "task_orders.review", "task_orders.confirm_signature"], ) }} {{ Link( icon='applications', diff --git a/templates/portfolios/task_orders/index.html b/templates/portfolios/task_orders/index.html index 975b5286..ed8a776b 100644 --- a/templates/portfolios/task_orders/index.html +++ b/templates/portfolios/task_orders/index.html @@ -13,7 +13,7 @@ {% endmacro %} {% macro TaskOrderEditButton(task_order, text="Edit", secondary=False) %} - + {{ text }} {% endmacro %} @@ -111,7 +111,7 @@ {{ EmptyState( 'This portfolio doesn’t have any active or pending task orders.', action_label='Add a New Task Order', - action_href=url_for('task_orders.edit', portfolio_id=portfolio.id), + action_href=url_for('task_orders.add_pdf', portfolio_id=portfolio.id), icon='cloud', add_perms=user_can(permissions.CREATE_TASK_ORDER) ) }} diff --git a/templates/task_orders/edit.html b/templates/task_orders/edit.html deleted file mode 100644 index 4966993d..00000000 --- a/templates/task_orders/edit.html +++ /dev/null @@ -1,443 +0,0 @@ -{% extends "portfolios/base.html" %} - -{% from 'components/date_picker.html' import DatePicker %} -{% from 'components/icon.html' import Icon %} -{% from 'components/options_input.html' import OptionsInput %} -{% from 'components/save_button.html' import SaveButton %} -{% from "components/semi_collapsible_text.html" import SemiCollapsibleText %} -{% from "components/sticky_cta.html" import StickyCTA %} -{% from 'components/text_input.html' import TextInput %} -{% from "components/totals_box.html" import TotalsBox %} -{% from 'components/upload_input.html' import UploadInput %} - -{% macro LOAInput() %} -
- -
- - - - - - - -
-
-
- - - -{% endmacro %} - -{% macro CLINFields(fields, index) %} - {% if index != 0 %} -
- {% endif %} - - -
-
-
- {{ OptionsInput(fields.jedi_clin_type, watch=True) }} -
-
- {{ TextInput(fields.number, watch=True) }} -
-
- -
-
- -
- {{ 'task_orders.form.loa_label' | translate }} -
-
- {% for loa in fields.loas %} - {{ TextInput(loa, showLabel=False, watch=True) }} - {% endfor %} - - {{ LOAInput() }} -
-
- - {{ DatePicker(fields.start_date, watch=True, optional=False) }} - {{ DatePicker(fields.end_date, watch=True, optional=False) }} - {{ TextInput(fields.obligated_amount, validation='dollars', watch=True) }} -
-
-{% endmacro %} - -{% block portfolio_content %} - {% if task_order_id %} - {% set action = url_for("task_orders.update", task_order_id=task_order_id) %} - {% set review_action = url_for("task_orders.update", task_order_id=task_order_id, review=True) %} - {% else %} - {% set action = url_for("task_orders.update", portfolio_id=portfolio.id) %} - {% set review_action = url_for("task_orders.update", portfolio_id=portfolio.id, review=True) %} - {% endif %} -
- {{ form.csrf_token }} - - {% set obligated = task_order.total_obligated_funds if task_order else 0 %} - {% set total = task_order.total_contract_amount if task_order else 0 %} - - -
- {% call StickyCTA(text=('task_orders.form.sticky_header_text' | translate )) %} - - - - - {{ "common.cancel" | translate }} - - - {% endcall %} - -
-

- {{ "task_orders.new.form_help_text" | translate }} -

- -
- - {% include "fragments/flash.html" %} - -
-
-
{{ 'task_orders.form.add_to_header' | translate }}
- {{ TextInput(form.number, validation='taskOrderNumber', optional=False) }} - -
- -
{{ 'task_orders.form.cloud_funding_header' | translate }}
-
- {{ 'task_orders.form.cloud_funding_text' | translate }} -
- - {% for clin in form.clins %} - {{ CLINFields(clin, index=loop.index - 1) }} - {% endfor %} - -
-
- -
-
-
- -
-
- -
- {{ 'task_orders.form.clin_type_label' | translate }} -
-
- -
-
-
-
-
- -
- - - - - - - - - -
-
- -
-
- -
-
- -
- {{ 'task_orders.form.loa_label' | translate }} -
-
- {{ LOAInput() }} -
-
- - -
- -
- {{ 'task_orders.form.pop_start' | translate }} -
-
- -
- - -
- - -
- -
- - -
- -
- - - -
- -
- {{ Icon("ok", classes="icon--green") }} -
-
-
-
- - -
- -
- {{ 'task_orders.form.pop_end' | translate }} -
-
- -
- - -
- - -
- -
- - -
- -
- - - -
- -
- {{ Icon("ok", classes="icon--green") }} -
-
-
-
- - -
- - - - - - - - - -
-
-
-
-
- - - -
-
{{ 'task_orders.form.supporting_docs_header' | translate }}
-
- {{ 'task_orders.form.supporting_docs_text' | translate }} {{ Icon('question')}} -
- {{ UploadInput(form.pdf, watch=True) }} -
- - -
-
{{ 'components.totals_box.obligated_funds' | translate }}
-
-
{{ 'components.totals_box.obligated_text' | translate }}
- -
- -
{{ 'components.totals_box.total_amount' | translate }}
-
-
{{ 'components.totals_box.total_text' | translate }}
-
-
- -
- -
-
-
-
- -{% endblock %} diff --git a/tests/routes/task_orders/test_new.py b/tests/routes/task_orders/test_new.py index fdf9a987..1107c16c 100644 --- a/tests/routes/task_orders/test_new.py +++ b/tests/routes/task_orders/test_new.py @@ -115,29 +115,9 @@ def test_task_orders_confirm_signature(client, user_session, task_order): assert response.status_code == 200 -def test_task_orders_new_flow(): - pass - - -def test_task_orders_save_incomplete(client, user_session, portfolio): - user_session(portfolio.owner) - form_data = { - "number": "0123456789", - "clins-0-jedi_clin_type": "JEDI_CLIN_1", - "clins-0-clin_number": "12312", - } - response = client.post( - url_for("task_orders.update", portfolio_id=portfolio.id), data=form_data - ) - assert response.status_code == 302 - task_order = portfolio.task_orders[0] - expected_url = url_for( - "task_orders.edit", task_order_id=task_order.id, _external=True - ) - assert response.location == expected_url - - -def test_task_orders_add_pdf_existing_to(client, user_session, task_order): +def test_task_orders_form_step_one_add_pdf_existing_to( + client, user_session, task_order +): user_session(task_order.creator) response = client.get(url_for("task_orders.add_pdf", task_order_id=task_order.id)) assert response.status_code == 200 @@ -158,6 +138,17 @@ def test_task_orders_upload_pdf_existing_to( assert task_order.pdf.filename == pdf_upload2.filename +def test_task_orders_upload_pdf_delete_pdf(client, user_session, portfolio, pdf_upload): + user_session(portfolio.owner) + task_order = TaskOrderFactory.create(pdf=pdf_upload, portfolio=portfolio) + data = {"pdf": ""} + response = client.post( + url_for("task_orders.upload_pdf", task_order_id=task_order.id), data=data + ) + assert task_order.pdf is None + assert response.status_code == 302 + + def test_task_orders_update_number_existing_to(client, user_session, task_order): user_session(task_order.creator) form_data = {"number": "0000000000"} @@ -210,24 +201,6 @@ def test_task_orders_update_clins_existing_to(client, user_session, task_order): assert len(task_order.clins) == 1 -def test_task_orders_update_existing_to(client, user_session, task_order): - user_session(task_order.creator) - form_data = { - "number": "0123456789", - "clins-0-jedi_clin_type": "JEDI_CLIN_1", - "clins-0-number": "12312", - "clins-0-start_date": "01/01/2020", - "clins-0-end_date": "01/01/2021", - "clins-0-obligated_amount": "5000", - "clins-0-loas-0": "123123123123", - } - response = client.post( - url_for("task_orders.update", task_order_id=task_order.id), data=form_data - ) - assert response.status_code == 302 - assert task_order.number == "0123456789" - - @pytest.mark.skip(reason="Reevaluate how form handles invalid data") def test_task_orders_update_invalid_data(client, user_session, portfolio): user_session(portfolio.owner) @@ -240,41 +213,7 @@ def test_task_orders_update_invalid_data(client, user_session, portfolio): assert "There were some errors" in response.data.decode() -def test_task_orders_update(client, user_session, portfolio, pdf_upload): - user_session(portfolio.owner) - data = {"number": "0123456789", "pdf": pdf_upload} - task_order = TaskOrderFactory.create(number="0987654321", portfolio=portfolio) - response = client.post( - url_for("task_orders.update", task_order_id=task_order.id), data=data - ) - assert task_order.number == data["number"] - assert response.status_code == 302 - - -def test_task_orders_update_pdf( - client, user_session, portfolio, pdf_upload, pdf_upload2 -): - user_session(portfolio.owner) - task_order = TaskOrderFactory.create(pdf=pdf_upload, portfolio=portfolio) - data = {"number": "0123456789", "pdf": pdf_upload2} - response = client.post( - url_for("task_orders.update", task_order_id=task_order.id), data=data - ) - assert task_order.pdf.filename == pdf_upload2.filename - assert response.status_code == 302 - - -def test_task_orders_update_delete_pdf(client, user_session, portfolio, pdf_upload): - user_session(portfolio.owner) - task_order = TaskOrderFactory.create(pdf=pdf_upload, portfolio=portfolio) - data = {"number": "0123456789", "pdf": ""} - response = client.post( - url_for("task_orders.update", task_order_id=task_order.id), data=data - ) - assert task_order.pdf is None - assert response.status_code == 302 - - +@pytest.mark.skip(reason="Reevaluate if user can see review page w/ incomplete TO") def test_cannot_get_to_review_screen_with_incomplete_data( client, user_session, portfolio ): diff --git a/tests/test_access.py b/tests/test_access.py index c0e523d6..25dd7562 100644 --- a/tests/test_access.py +++ b/tests/test_access.py @@ -448,30 +448,67 @@ def test_task_orders_download_task_order_pdf_access(get_url_assert_status, monke get_url_assert_status(rando, url, 404) -# task_orders.update -def test_task_orders_update_access(post_url_assert_status): +# task_orders.add_pdf +# task_orders.add_number +# task_orders.add_clins +# task_orders.review +# task_orders.confirm_signature +def test_task_orders_new_get_routes(get_url_assert_status): + get_routes = [ + "task_orders.add_pdf", + "task_orders.add_number", + "task_orders.add_clins", + "task_orders.review", + "task_orders.confirm_signature", + ] + ccpo = user_with(PermissionSets.EDIT_PORTFOLIO_FUNDING) owner = user_with() rando = user_with() + portfolio = PortfolioFactory.create(owner=owner) - data = {"number": 1234567890} + task_order = TaskOrderFactory.create(portfolio=portfolio, creator=owner) - url = url_for("task_orders.update", portfolio_id=portfolio.id) - post_url_assert_status(owner, url, 302, data=data) - post_url_assert_status(ccpo, url, 302, data=data) - post_url_assert_status(rando, url, 404, data=data) + for route in get_routes: + url = url_for(route, task_order_id=task_order.id) - task_order = TaskOrderFactory.create(portfolio=portfolio) + get_url_assert_status(ccpo, url, 200) + get_url_assert_status(owner, url, 200) + get_url_assert_status(rando, url, 404) - url = url_for("task_orders.update", task_order_id=task_order.id) - post_url_assert_status(owner, url, 302, data=data) - post_url_assert_status(ccpo, url, 302, data=data) - post_url_assert_status(rando, url, 404, data=data) - url = url_for("task_orders.update", portfolio_id=portfolio.id) - post_url_assert_status(owner, url, 302, data=data) - post_url_assert_status(ccpo, url, 302, data=data) - post_url_assert_status(rando, url, 404, data=data) +# task_orders.upload_pdf +# task_orders.update_number +# task_orders.update_clins +def test_task_orders_new_post_routes(post_url_assert_status): + post_routes = [ + ("task_orders.upload_pdf", {"pdf": ""}), + ("task_orders.update_number", {"number": "1234567890"}), + ( + "task_orders.update_clins", + { + "clins-0-jedi_clin_type": "JEDI_CLIN_1", + "clins-0-clin_number": "12312", + "clins-0-start_date": "01/01/2020", + "clins-0-end_date": "01/01/2021", + "clins-0-obligated_amount": "5000", + "clins-0-loas-0": "123123123123", + }, + ), + ] + + ccpo = user_with(PermissionSets.EDIT_PORTFOLIO_FUNDING) + owner = user_with() + rando = user_with() + + portfolio = PortfolioFactory.create(owner=owner) + task_order = TaskOrderFactory.create(portfolio=portfolio, creator=owner) + + for route, data in post_routes: + url = url_for(route, task_order_id=task_order.id) + post_url_assert_status(owner, url, 302, data=data) + post_url_assert_status(ccpo, url, 302, data=data) + post_url_assert_status(rando, url, 404, data=data) def test_applications_application_team_access(get_url_assert_status): From 5b208d9e8dd5110d8803aa429100ac168fc364cb Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Tue, 16 Jul 2019 16:34:58 -0400 Subject: [PATCH 09/17] Create TO builder base file and use it to simplify step templates --- js/components/forms/base_form.js | 14 +- js/components/forms/to_form.js | 10 -- templates/task_orders/builder_base.html | 40 +++++ templates/task_orders/step_1.html | 61 ++------ templates/task_orders/step_2.html | 50 ++----- templates/task_orders/step_3.html | 42 +----- templates/task_orders/step_4.html | 187 +++++++++++------------- templates/task_orders/step_5.html | 55 ++----- 8 files changed, 183 insertions(+), 276 deletions(-) create mode 100644 templates/task_orders/builder_base.html diff --git a/js/components/forms/base_form.js b/js/components/forms/base_form.js index ecb47bc4..938eb3cc 100644 --- a/js/components/forms/base_form.js +++ b/js/components/forms/base_form.js @@ -1,4 +1,5 @@ import ally from 'ally.js' +import stickybits from 'stickybits' import DateSelector from '../date_selector' import FormMixin from '../../mixins/form' @@ -8,9 +9,11 @@ import checkboxinput from '../checkbox_input' import levelofwarrant from '../levelofwarrant' import multicheckboxinput from '../multi_checkbox_input' import optionsinput from '../options_input' +import SemiCollapsibleText from '../semi_collapsible_text' import textinput from '../text_input' -import uploadinput from '../upload_input' +import ToForm from './to_form.js' import toggler from '../toggler' +import uploadinput from '../upload_input' export default { name: 'base-form', @@ -22,9 +25,18 @@ export default { levelofwarrant, multicheckboxinput, optionsinput, + SemiCollapsibleText, textinput, + ToForm, toggler, uploadinput, }, mixins: [FormMixin], + directives: { + sticky: { + inserted: el => { + stickybits(el) + }, + }, + }, } diff --git a/js/components/forms/to_form.js b/js/components/forms/to_form.js index adf063ca..2493d123 100644 --- a/js/components/forms/to_form.js +++ b/js/components/forms/to_form.js @@ -1,5 +1,3 @@ -import stickybits from 'stickybits' - import ClinFields from '../clin_fields' import DateSelector from '../date_selector' import FormMixin from '../../mixins/form' @@ -71,12 +69,4 @@ export default { this.obligated = newObligated }, }, - - directives: { - sticky: { - inserted: el => { - stickybits(el) - }, - }, - }, } diff --git a/templates/task_orders/builder_base.html b/templates/task_orders/builder_base.html new file mode 100644 index 00000000..2ad587fe --- /dev/null +++ b/templates/task_orders/builder_base.html @@ -0,0 +1,40 @@ +{% extends "portfolios/base.html" %} + +{% from "components/sticky_cta.html" import StickyCTA %} + +{% block portfolio_content %} + +
+ {{ form.csrf_token }} + + {% call StickyCTA(text=('task_orders.form.sticky_header_text' | translate )) %} + + {% block next_button %} + + {% endblock %} + + + Previous + + + + {{ "common.cancel" | translate }} + + + {% endcall %} + + {% include "fragments/flash.html" %} + + {% block to_builder_form_field %}{% endblock %} + +
+
+{% endblock %} diff --git a/templates/task_orders/step_1.html b/templates/task_orders/step_1.html index bf499fb5..a9199961 100644 --- a/templates/task_orders/step_1.html +++ b/templates/task_orders/step_1.html @@ -1,56 +1,27 @@ -{% extends "portfolios/base.html" %} +{% extends "task_orders/builder_base.html" %} {% from 'components/icon.html' import Icon %} {% from "components/sticky_cta.html" import StickyCTA %} {% from 'components/upload_input.html' import UploadInput %} -{% block portfolio_content %} - {% if task_order_id %} - {% set action = url_for("task_orders.upload_pdf", task_order_id=task_order_id) %} - {% else %} - {% set action = url_for("task_orders.upload_pdf", portfolio_id=portfolio.id) %} - {% endif %} +{% if task_order_id %} + {% set action = url_for("task_orders.upload_pdf", task_order_id=task_order_id) %} +{% else %} + {% set action = url_for("task_orders.upload_pdf", portfolio_id=portfolio.id) %} +{% endif %} - -
- {{ form.csrf_token }} +{% set next_button_text = "Next: Add TO Number" %} +{% set previous_button_link = cancel_url %} - {% call StickyCTA(text=('task_orders.form.sticky_header_text' | translate )) %} - - - - - {{ "common.cancel" | translate }} - - - {% endcall %} - {% include "fragments/flash.html" %} +{% block to_builder_form_field %} +
+ {{ 'task_orders.form.supporting_docs_header' | translate }} +
-
- {{ 'task_orders.form.supporting_docs_header' | translate }} -
+
+ {{ 'task_orders.form.supporting_docs_text' | translate }} {{ Icon('question')}} +
-
- {{ 'task_orders.form.supporting_docs_text' | translate }} {{ Icon('question')}} -
- - {{ UploadInput(form.pdf, watch=True) }} - -
-
+ {{ UploadInput(form.pdf, watch=True) }} {% endblock %} diff --git a/templates/task_orders/step_2.html b/templates/task_orders/step_2.html index 414bdbaa..c388e9c2 100644 --- a/templates/task_orders/step_2.html +++ b/templates/task_orders/step_2.html @@ -1,47 +1,15 @@ -{% extends "portfolios/base.html" %} +{% extends "task_orders/builder_base.html" %} -{% from "components/sticky_cta.html" import StickyCTA %} {% from 'components/text_input.html' import TextInput %} -{% block portfolio_content %} - {% set action = url_for("task_orders.update_number", task_order_id=task_order_id) %} +{% set action = url_for("task_orders.update_number", task_order_id=task_order_id) %} +{% set next_button_text = "Next: Add Base CLIN" %} +{% set previous_button_link = url_for("task_orders.add_pdf", task_order_id=task_order_id) %} - -
- {{ form.csrf_token }} +{% block to_builder_form_field %} +
+ {{ 'task_orders.form.add_to_header' | translate }} +
- {% call StickyCTA(text=('task_orders.form.sticky_header_text' | translate )) %} - - - - - {{ "common.cancel" | translate }} - - - {% endcall %} - - {% include "fragments/flash.html" %} - -
- {{ 'task_orders.form.add_to_header' | translate }} -
- - {{ TextInput(form.number, validation='taskOrderNumber', optional=False) }} - -
-
+ {{ TextInput(form.number, validation='taskOrderNumber', optional=False) }} {% endblock %} diff --git a/templates/task_orders/step_3.html b/templates/task_orders/step_3.html index a893c110..91f9d73b 100644 --- a/templates/task_orders/step_3.html +++ b/templates/task_orders/step_3.html @@ -1,11 +1,14 @@ -{% extends "portfolios/base.html" %} +{% extends "task_orders/builder_base.html" %} {% from 'components/date_picker.html' import DatePicker %} {% from 'components/icon.html' import Icon %} {% from 'components/options_input.html' import OptionsInput %} -{% from "components/sticky_cta.html" import StickyCTA %} {% from 'components/text_input.html' import TextInput %} +{% set action = url_for("task_orders.update_clins", task_order_id=task_order_id) %} +{% set next_button_text = "Next: Review Funding" %} +{% set previous_button_link = url_for("task_orders.add_number", task_order_id=task_order_id) %} + {% macro LOAInput() %}
@@ -89,41 +92,12 @@ {% endmacro %} -{% block portfolio_content %} - {% set action = url_for("task_orders.update_clins", task_order_id=task_order_id) %} +{% block to_builder_form_field %} -
- {{ form.csrf_token }} - - {% call StickyCTA(text=('task_orders.form.sticky_header_text' | translate )) %} - - - - - {{ "common.cancel" | translate }} - - - {% endcall %} - - {% include "fragments/flash.html" %} - +
{{ 'task_orders.form.cloud_funding_header' | translate }}
@@ -375,6 +349,6 @@ {{ Icon('plus') }} {{ 'task_orders.form.add_clin' | translate }} - +
{% endblock %} diff --git a/templates/task_orders/step_4.html b/templates/task_orders/step_4.html index 8d923f8d..9acc87c6 100644 --- a/templates/task_orders/step_4.html +++ b/templates/task_orders/step_4.html @@ -1,119 +1,100 @@ -{% extends "portfolios/base.html" %} +{% extends "task_orders/builder_base.html" %} {% from "components/icon.html" import Icon %} {% from "components/semi_collapsible_text.html" import SemiCollapsibleText %} -{% from "components/sticky_cta.html" import StickyCTA %} {% from "components/totals_box.html" import TotalsBox %} -{% block portfolio_content %} - {% set action = url_for("task_orders.update_number", task_order_id=task_order_id) %} +{% set action = url_for('task_orders.confirm_signature', task_order_id=task_order_id) %} +{% set previous_button_link = url_for("task_orders.add_clins", task_order_id=task_order_id) %} -
- {{ form.csrf_token }} +{% block next_button %} + + Next: Submit Task Order + +{% endblock %} - {% call StickyCTA(text=('task_orders.form.sticky_header_text' | translate )) %} - - - Next: Submit Task Order - - - - {{ "common.cancel" | translate }} - - - {% endcall %} +{% block to_builder_form_field %} +
- {% include "fragments/flash.html" %} + {{ SemiCollapsibleText() }} -
+
- {{ SemiCollapsibleText() }} - -
- -
- {{ "task_orders.review.review_your_task_order" | translate }} -
-

- {{ "task_orders.review.check_paragraph" | translate }} -

-
-
-
- {{ "task_orders.review.task_order_number" | translate }} -
-
{{task_order.number}}
- -
- -
- {{ "task_orders.review.funding_summary" | translate }} -
- - {% for clin in task_order.clins %} -
- {{ "{}".format(clin.jedi_clin_type) | translate}} -
- - - - - - - - - - - - - - - - - - - - -
{{ "task_orders.review.clins.amount" | translate }}{{ "task_orders.review.clins.obligated" | translate }}{{ "task_orders.review.clins.pop_start" | translate }}{{ "task_orders.review.clins.pop_end" | translate }}{{ "task_orders.review.clins.loa" | translate }}
{{ clin.obligated_amount | dollars }} - {% if clin.is_obligated() %} - {{ "common.yes" | translate }} - {% else %} - {{ "common.no" | translate }} - {% endif %} - {{ clin.start_date | formattedDate }}{{ clin.end_date | formattedDate }} - {% for loa in clin.loas %} - - {{ loa }} - -
- {% endfor %} -
- {% endfor %} - -
- -
- {{ "task_orders.review.supporting_document.title" | translate }} -
- +
+ {{ "task_orders.review.review_your_task_order" | translate }} +
+

+ {{ "task_orders.review.check_paragraph" | translate }} +

+
+
+
+ {{ "task_orders.review.task_order_number" | translate }}
- {{ TotalsBox(task_order=task_order) }} +
{{task_order.number}}
+
+ +
+ {{ "task_orders.review.funding_summary" | translate }} +
+ + {% for clin in task_order.clins %} +
+ {{ "{}".format(clin.jedi_clin_type) | translate}} +
+ + + + + + + + + + + + + + + + + + + + +
{{ "task_orders.review.clins.amount" | translate }}{{ "task_orders.review.clins.obligated" | translate }}{{ "task_orders.review.clins.pop_start" | translate }}{{ "task_orders.review.clins.pop_end" | translate }}{{ "task_orders.review.clins.loa" | translate }}
{{ clin.obligated_amount | dollars }} + {% if clin.is_obligated() %} + {{ "common.yes" | translate }} + {% else %} + {{ "common.no" | translate }} + {% endif %} + {{ clin.start_date | formattedDate }}{{ clin.end_date | formattedDate }} + {% for loa in clin.loas %} + + {{ loa }} + +
+ {% endfor %} +
+ {% endfor %} + +
+ +
+ {{ "task_orders.review.supporting_document.title" | translate }} +
+
+ {{ TotalsBox(task_order=task_order) }} +
{% endblock %} diff --git a/templates/task_orders/step_5.html b/templates/task_orders/step_5.html index a0f768d5..e2b1820a 100644 --- a/templates/task_orders/step_5.html +++ b/templates/task_orders/step_5.html @@ -1,50 +1,21 @@ -{% extends "portfolios/base.html" %} +{% extends "task_orders/builder_base.html" %} {% from "components/alert.html" import Alert %} {% from "components/checkbox_input.html" import CheckboxInput %} -{% from "components/sticky_cta.html" import StickyCTA %} -{% block portfolio_content %} - {% set action = url_for("task_orders.submit_task_order", task_order_id=task_order_id) %} +{% set action = url_for("task_orders.submit_task_order", task_order_id=task_order_id) %} +{% set next_button_text = "Next: Confirm & Submit" %} +{% set previous_button_link = url_for("task_orders.review", task_order_id=task_order_id) %} - -
- {{ form.csrf_token }} +{% block to_builder_form_field %} +
+

Signature confirmation: Task Order #{{task_order.number}}

+
- {% call StickyCTA(text=('task_orders.form.sticky_header_text' | translate )) %} - - - - - {{ "common.cancel" | translate }} - - - {% endcall %} + {% call Alert('', + message="All task orders require a Contracting Officer signature." + ) %} -
-

Signature confirmation: Task Order #{{task_order.number}}

-
- - {% call Alert('', - message="All task orders require a Contracting Officer signature." - ) %} - - {{ CheckboxInput(form.signature) }} - {% endcall %} -
-
+ {{ CheckboxInput(form.signature) }} + {% endcall %} {% endblock %} From 72da5f36c361ee60a06ed969ad99ced7f6feb697 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Tue, 16 Jul 2019 16:50:28 -0400 Subject: [PATCH 10/17] Move common to review html into a fragment and delete unused submit confirmation macro and vue component --- js/components/submit_confirmation.js | 28 ----- js/index.js | 2 - templates/components/submit_confirmation.html | 38 ------- templates/fragments/task_order_review.html | 85 ++++++++++++++ templates/portfolios/task_orders/review.html | 107 +----------------- templates/task_orders/step_4.html | 86 +------------- 6 files changed, 90 insertions(+), 256 deletions(-) delete mode 100644 js/components/submit_confirmation.js delete mode 100644 templates/components/submit_confirmation.html create mode 100644 templates/fragments/task_order_review.html diff --git a/js/components/submit_confirmation.js b/js/components/submit_confirmation.js deleted file mode 100644 index c6836bb8..00000000 --- a/js/components/submit_confirmation.js +++ /dev/null @@ -1,28 +0,0 @@ -import checkboxinput from './checkbox_input' - -export default { - name: 'submit-confirmation', - - components: { - checkboxinput, - }, - - data: function() { - return { - valid: false, - checked: false, - } - }, - - methods: { - toggleValid: function() { - this.valid = !this.valid - }, - - handleClose: function() { - this.$root.closeModal(this.name) - this.checked = false - this.valid = false - }, - }, -} diff --git a/js/index.js b/js/index.js index 6472d5b5..5ea9ed13 100644 --- a/js/index.js +++ b/js/index.js @@ -35,7 +35,6 @@ import { isNotInVerticalViewport } from './lib/viewport' import DateSelector from './components/date_selector' import SidenavToggler from './components/sidenav_toggler' import BaseForm from './components/forms/base_form' -import SubmitConfirmation from './components/submit_confirmation' import DeleteConfirmation from './components/delete_confirmation' import NewEnvironment from './components/forms/new_environment' import EnvironmentRole from './components/environment_role' @@ -79,7 +78,6 @@ const app = new Vue({ SidenavToggler, BaseForm, DeleteConfirmation, - SubmitConfirmation, nestedcheckboxinput, NewEnvironment, EnvironmentRole, diff --git a/templates/components/submit_confirmation.html b/templates/components/submit_confirmation.html deleted file mode 100644 index 37295823..00000000 --- a/templates/components/submit_confirmation.html +++ /dev/null @@ -1,38 +0,0 @@ -{% from "components/alert.html" import Alert %} -{% from "components/checkbox_input.html" import CheckboxInput %} - -{% macro SubmitConfirmation(modal_id, submit_text, submit_action, form, task_order) %} - -
-
- -
-
-
- - {{ form.signature(**{"v-model": "checked"}) }} - {{ form.signature.label | safe }} - -
-
-
-
-
-
- {{ form.csrf_token }} - -
- -
-
-
-{% endmacro %} diff --git a/templates/fragments/task_order_review.html b/templates/fragments/task_order_review.html new file mode 100644 index 00000000..c15935d2 --- /dev/null +++ b/templates/fragments/task_order_review.html @@ -0,0 +1,85 @@ +{% from "components/icon.html" import Icon %} +{% from "components/semi_collapsible_text.html" import SemiCollapsibleText %} +{% from "components/totals_box.html" import TotalsBox %} + + +
+ {{ SemiCollapsibleText() }} + +
+ +
+ {{ "task_orders.review.review_your_task_order" | translate }} +
+

+ {{ "task_orders.review.check_paragraph" | translate }} +

+
+
+
+ {{ "task_orders.review.task_order_number" | translate }} +
+
{{task_order.number}}
+ +
+ +
+ {{ "task_orders.review.funding_summary" | translate }} +
+ + {% for clin in task_order.clins %} +
+ {{ "{}".format(clin.jedi_clin_type) | translate}} +
+ + + + + + + + + + + + + + + + + + + + +
{{ "task_orders.review.clins.amount" | translate }}{{ "task_orders.review.clins.obligated" | translate }}{{ "task_orders.review.clins.pop_start" | translate }}{{ "task_orders.review.clins.pop_end" | translate }}{{ "task_orders.review.clins.loa" | translate }}
{{ clin.obligated_amount | dollars }} + {% if clin.is_obligated() %} + {{ "common.yes" | translate }} + {% else %} + {{ "common.no" | translate }} + {% endif %} + {{ clin.start_date | formattedDate }}{{ clin.end_date | formattedDate }} + {% for loa in clin.loas %} + + {{ loa }} + +
+ {% endfor %} +
+ {% endfor %} + +
+ +
+ {{ "task_orders.review.supporting_document.title" | translate }} +
+ +
+ {{ TotalsBox(task_order=task_order) }} + +
+
diff --git a/templates/portfolios/task_orders/review.html b/templates/portfolios/task_orders/review.html index c1a7a0e5..55e6af75 100644 --- a/templates/portfolios/task_orders/review.html +++ b/templates/portfolios/task_orders/review.html @@ -1,111 +1,12 @@ -{% from "components/icon.html" import Icon %} -{% from "components/modal.html" import Modal %} -{% from "components/semi_collapsible_text.html" import SemiCollapsibleText %} {% from "components/sticky_cta.html" import StickyCTA %} -{% from "components/submit_confirmation.html" import SubmitConfirmation %} -{% from "components/totals_box.html" import TotalsBox %} {% extends 'portfolios/base.html' %} {% block portfolio_content %} - {% set submit_modal_id = "submit-to-1" %} - {% call Modal(name=submit_modal_id) %} - {{ - SubmitConfirmation( - modal_id=submit_modal_id, - submit_text="Confirm & Submit", - submit_action=url_for('task_orders.submit_task_order', task_order_id=task_order.id), - form=signature_form, - task_order=task_order, - ) - }} + + {% call StickyCTA(text="Task order details") %} + Edit {% endcall %} - {% call StickyCTA(text="Review Funding") %} - Edit - Submit task order - {% endcall %} - -
- - {{ SemiCollapsibleText() }} - -
- -
- {{ "task_orders.review.review_your_task_order" | translate }} -
-

- {{ "task_orders.review.check_paragraph" | translate }} -

-
-
-
- {{ "task_orders.review.task_order_number" | translate }} -
-
{{task_order.number}}
- -
- -
- {{ "task_orders.review.funding_summary" | translate }} -
- - {% for clin in task_order.clins %} -
- {{ "{}".format(clin.jedi_clin_type) | translate}} -
- - - - - - - - - - - - - - - - - - - - -
{{ "task_orders.review.clins.amount" | translate }}{{ "task_orders.review.clins.obligated" | translate }}{{ "task_orders.review.clins.pop_start" | translate }}{{ "task_orders.review.clins.pop_end" | translate }}{{ "task_orders.review.clins.loa" | translate }}
{{ clin.obligated_amount | dollars }} - {% if clin.is_obligated() %} - {{ "common.yes" | translate }} - {% else %} - {{ "common.no" | translate }} - {% endif %} - {{ clin.start_date | formattedDate }}{{ clin.end_date | formattedDate }} - {% for loa in clin.loas %} - - {{ loa }} - -
- {% endfor %} -
- {% endfor %} - -
- -
- {{ "task_orders.review.supporting_document.title" | translate }} -
- -
- {{ TotalsBox(task_order=task_order) }} - -
- -
+ {% include "fragments/task_order_review.html" %} {% endblock %} diff --git a/templates/task_orders/step_4.html b/templates/task_orders/step_4.html index 9acc87c6..65d1d2d7 100644 --- a/templates/task_orders/step_4.html +++ b/templates/task_orders/step_4.html @@ -1,9 +1,5 @@ {% extends "task_orders/builder_base.html" %} -{% from "components/icon.html" import Icon %} -{% from "components/semi_collapsible_text.html" import SemiCollapsibleText %} -{% from "components/totals_box.html" import TotalsBox %} - {% set action = url_for('task_orders.confirm_signature', task_order_id=task_order_id) %} {% set previous_button_link = url_for("task_orders.add_clins", task_order_id=task_order_id) %} @@ -16,85 +12,5 @@ {% endblock %} {% block to_builder_form_field %} -
- - {{ SemiCollapsibleText() }} - -
- -
- {{ "task_orders.review.review_your_task_order" | translate }} -
-

- {{ "task_orders.review.check_paragraph" | translate }} -

-
-
-
- {{ "task_orders.review.task_order_number" | translate }} -
-
{{task_order.number}}
- -
- -
- {{ "task_orders.review.funding_summary" | translate }} -
- - {% for clin in task_order.clins %} -
- {{ "{}".format(clin.jedi_clin_type) | translate}} -
- - - - - - - - - - - - - - - - - - - - -
{{ "task_orders.review.clins.amount" | translate }}{{ "task_orders.review.clins.obligated" | translate }}{{ "task_orders.review.clins.pop_start" | translate }}{{ "task_orders.review.clins.pop_end" | translate }}{{ "task_orders.review.clins.loa" | translate }}
{{ clin.obligated_amount | dollars }} - {% if clin.is_obligated() %} - {{ "common.yes" | translate }} - {% else %} - {{ "common.no" | translate }} - {% endif %} - {{ clin.start_date | formattedDate }}{{ clin.end_date | formattedDate }} - {% for loa in clin.loas %} - - {{ loa }} - -
- {% endfor %} -
- {% endfor %} - -
- -
- {{ "task_orders.review.supporting_document.title" | translate }} -
- -
- {{ TotalsBox(task_order=task_order) }} - -
-
+ {% include "fragments/task_order_review.html" %} {% endblock %} From 3401713898f41abd0facd5ebbf6892746a89e43f Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Tue, 16 Jul 2019 17:17:25 -0400 Subject: [PATCH 11/17] Only delete and add CLINs to a TO when they are passed in the form data --- atst/domain/task_orders.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/atst/domain/task_orders.py b/atst/domain/task_orders.py index 2836fdbe..cc0920d0 100644 --- a/atst/domain/task_orders.py +++ b/atst/domain/task_orders.py @@ -32,16 +32,17 @@ class TaskOrders(BaseDomainClass): task_order = TaskOrders.get(task_order_id) task_order.pdf = pdf - for clin in task_order.clins: - db.session.delete(clin) + if len(clins) > 0: + for clin in task_order.clins: + db.session.delete(clin) + + TaskOrders.create_clins(task_order_id, clins) if number != task_order.number: task_order.number = number db.session.add(task_order) db.session.commit() - TaskOrders.create_clins(task_order_id, clins) - return task_order @classmethod From d2799c00d073e7b3e3d0cb73fcd116cfd711621a Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Tue, 16 Jul 2019 19:21:05 -0400 Subject: [PATCH 12/17] Add step numbers to sticky header --- templates/task_orders/builder_base.html | 2 +- templates/task_orders/step_1.html | 1 + templates/task_orders/step_2.html | 1 + templates/task_orders/step_3.html | 1 + templates/task_orders/step_4.html | 1 + templates/task_orders/step_5.html | 1 + translations.yaml | 2 +- 7 files changed, 7 insertions(+), 2 deletions(-) diff --git a/templates/task_orders/builder_base.html b/templates/task_orders/builder_base.html index 2ad587fe..c2b342d2 100644 --- a/templates/task_orders/builder_base.html +++ b/templates/task_orders/builder_base.html @@ -7,7 +7,7 @@
{{ form.csrf_token }} - {% call StickyCTA(text=('task_orders.form.sticky_header_text' | translate )) %} + {% call StickyCTA(text=('task_orders.form.sticky_header_text' | translate({"step": step}) )) %} {% block next_button %} diff --git a/templates/task_orders/step_3.html b/templates/task_orders/step_3.html index 91f9d73b..1ba0c5e6 100644 --- a/templates/task_orders/step_3.html +++ b/templates/task_orders/step_3.html @@ -8,6 +8,7 @@ {% set action = url_for("task_orders.update_clins", task_order_id=task_order_id) %} {% set next_button_text = "Next: Review Funding" %} {% set previous_button_link = url_for("task_orders.add_number", task_order_id=task_order_id) %} +{% set step = "3" %} {% macro LOAInput() %}
diff --git a/templates/task_orders/step_4.html b/templates/task_orders/step_4.html index 65d1d2d7..65bee9a2 100644 --- a/templates/task_orders/step_4.html +++ b/templates/task_orders/step_4.html @@ -2,6 +2,7 @@ {% set action = url_for('task_orders.confirm_signature', task_order_id=task_order_id) %} {% set previous_button_link = url_for("task_orders.add_clins", task_order_id=task_order_id) %} +{% set step = "4" %} {% block next_button %} diff --git a/translations.yaml b/translations.yaml index 917142f0..61620ecf 100644 --- a/translations.yaml +++ b/translations.yaml @@ -353,7 +353,7 @@ task_orders: supporting_docs_header: Upload your supporting documentation supporting_docs_size_limit: Your file may not exceed 1MB supporting_docs_text: Upload a single PDF containing all relevant information. - sticky_header_text: Add Funding + sticky_header_text: 'Add Funding ({step} of 5)' new: form_help_text: Before you can begin work in the cloud, you'll need to complete the information below and upload your approved task order for reference by the CCPO. app_info: From a8df5044a9e64e33b65b2698d5f267af3d54578f Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Tue, 16 Jul 2019 19:54:40 -0400 Subject: [PATCH 13/17] Update styling for buttons on the sticky header --- styles/components/_sticky_cta.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/styles/components/_sticky_cta.scss b/styles/components/_sticky_cta.scss index 514383fa..441629d0 100644 --- a/styles/components/_sticky_cta.scss +++ b/styles/components/_sticky_cta.scss @@ -44,9 +44,9 @@ width: auto; } - input { + .usa-button { margin: $gap $gap * 1.5 $gap 0; - width: 19rem; + width: 20rem; height: 3.2rem; font-size: $small-font-size; } From 4826e8002b7ce13369314e20c80b5979b2960853 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Wed, 17 Jul 2019 15:38:58 -0400 Subject: [PATCH 14/17] Rename route functions to be clearer --- atst/routes/task_orders/index.py | 4 +- atst/routes/task_orders/new.py | 22 +++--- templates/portfolios/header.html | 2 +- templates/portfolios/task_orders/index.html | 6 +- templates/portfolios/task_orders/review.html | 2 +- templates/task_orders/step_1.html | 4 +- templates/task_orders/step_2.html | 4 +- templates/task_orders/step_3.html | 4 +- templates/task_orders/step_4.html | 4 +- templates/task_orders/step_5.html | 2 +- tests/routes/task_orders/test_index.py | 3 +- tests/routes/task_orders/test_new.py | 79 ++++++++++++++------ tests/test_access.py | 32 ++++---- 13 files changed, 102 insertions(+), 66 deletions(-) diff --git a/atst/routes/task_orders/index.py b/atst/routes/task_orders/index.py index c05dde08..13010b88 100644 --- a/atst/routes/task_orders/index.py +++ b/atst/routes/task_orders/index.py @@ -15,7 +15,9 @@ from atst.utils.flash import formatted_flash as flash def review_task_order(task_order_id): task_order = TaskOrders.get(task_order_id) if task_order.is_draft: - return redirect(url_for("task_orders.add_pdf", task_order_id=task_order.id)) + return redirect( + url_for("task_orders.form_step_one_add_pdf", task_order_id=task_order.id) + ) else: signature_form = SignatureForm() return render_template( diff --git a/atst/routes/task_orders/new.py b/atst/routes/task_orders/new.py index c6fd2d72..f6e04f46 100644 --- a/atst/routes/task_orders/new.py +++ b/atst/routes/task_orders/new.py @@ -57,7 +57,7 @@ def update_task_order( @task_orders_bp.route("/portfolios//task_orders/step_1") @task_orders_bp.route("/task_orders//step_1") @user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") -def add_pdf(portfolio_id=None, task_order_id=None): +def form_step_one_add_pdf(portfolio_id=None, task_order_id=None): return render_task_orders_edit( "task_orders/step_1.html", portfolio_id=portfolio_id, @@ -68,9 +68,9 @@ def add_pdf(portfolio_id=None, task_order_id=None): @task_orders_bp.route("/portfolios//task_orders/step-1", methods=["POST"]) @task_orders_bp.route("/task_orders//step_1", methods=["POST"]) @user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") -def upload_pdf(portfolio_id=None, task_order_id=None): +def submit_form_step_one_add_pdf(portfolio_id=None, task_order_id=None): form_data = {**http_request.form, **http_request.files} - next_page = "task_orders.add_number" + next_page = "task_orders.form_step_two_add_number" current_template = "task_orders/step_1.html" return update_task_order( @@ -84,7 +84,7 @@ def upload_pdf(portfolio_id=None, task_order_id=None): @task_orders_bp.route("/task_orders//step_2") @user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") -def add_number(task_order_id): +def form_step_two_add_number(task_order_id): return render_task_orders_edit( "task_orders/step_2.html", task_order_id=task_order_id ) @@ -92,9 +92,9 @@ def add_number(task_order_id): @task_orders_bp.route("/task_orders//step_2", methods=["POST"]) @user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") -def update_number(task_order_id): +def submit_form_step_two_add_number(task_order_id): form_data = {**http_request.form} - next_page = "task_orders.add_clins" + next_page = "task_orders.form_step_three_add_clins" current_template = "task_orders/step_2.html" return update_task_order( @@ -104,7 +104,7 @@ def update_number(task_order_id): @task_orders_bp.route("/task_orders//step_3") @user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") -def add_clins(task_order_id): +def form_step_three_add_clins(task_order_id): return render_task_orders_edit( "task_orders/step_3.html", task_order_id=task_order_id ) @@ -112,9 +112,9 @@ def add_clins(task_order_id): @task_orders_bp.route("/task_orders//step_3", methods=["POST"]) @user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") -def update_clins(task_order_id): +def submit_form_step_three_add_clins(task_order_id): form_data = {**http_request.form} - next_page = "task_orders.review" + next_page = "task_orders.form_step_four_review" current_template = "task_orders/step_3.html" return update_task_order( @@ -124,7 +124,7 @@ def update_clins(task_order_id): @task_orders_bp.route("/task_orders//step_4") @user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") -def review(task_order_id): +def form_step_four_review(task_order_id): return render_task_orders_edit( "task_orders/step_4.html", task_order_id=task_order_id ) @@ -132,7 +132,7 @@ def review(task_order_id): @task_orders_bp.route("/task_orders//step_5") @user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") -def confirm_signature(task_order_id): +def form_step_five_confirm_signature(task_order_id): return render_task_orders_edit( "task_orders/step_5.html", task_order_id=task_order_id, form=SignatureForm() ) diff --git a/templates/portfolios/header.html b/templates/portfolios/header.html index 46159a63..b9e30d23 100644 --- a/templates/portfolios/header.html +++ b/templates/portfolios/header.html @@ -27,7 +27,7 @@ icon='funding', text='navigation.portfolio_navigation.breadcrumbs.funding' | translate, url=url_for("task_orders.portfolio_funding", portfolio_id=portfolio.id), - active=request.url_rule.endpoint in ["task_orders.portfolio_funding", "task_orders.review_task_order", "task_orders.add_pdf", "task_orders.upload_pdf", "task_orders.add_number", "task_orders.update_number", "task_orders.add_clins", "task_orders.update_clins", "task_orders.review", "task_orders.confirm_signature"], + active=request.url_rule.endpoint in ["task_orders.portfolio_funding", "task_orders.review_task_order", "task_orders.form_step_one_add_pdf", "task_orders.submit_form_step_one_add_pdf", "task_orders.form_step_two_add_number", "task_orders.submit_form_step_two_add_number", "task_orders.form_step_three_add_clins", "task_orders.submit_form_step_three_add_clins", "task_orders.form_step_four_review", "task_orders.form_step_five_confirm_signature"], ) }} {{ Link( icon='applications', diff --git a/templates/portfolios/task_orders/index.html b/templates/portfolios/task_orders/index.html index ed8a776b..991c98b1 100644 --- a/templates/portfolios/task_orders/index.html +++ b/templates/portfolios/task_orders/index.html @@ -13,7 +13,7 @@ {% endmacro %} {% macro TaskOrderEditButton(task_order, text="Edit", secondary=False) %} - + {{ text }} {% endmacro %} @@ -97,7 +97,7 @@ {% call StickyCTA(text="Funding") %} {% if user_can(permissions.CREATE_TASK_ORDER) %} - Start a new task order + Start a new task order {% endif %} {% endcall %} @@ -111,7 +111,7 @@ {{ EmptyState( 'This portfolio doesn’t have any active or pending task orders.', action_label='Add a New Task Order', - action_href=url_for('task_orders.add_pdf', portfolio_id=portfolio.id), + action_href=url_for('task_orders.form_step_one_add_pdf', portfolio_id=portfolio.id), icon='cloud', add_perms=user_can(permissions.CREATE_TASK_ORDER) ) }} diff --git a/templates/portfolios/task_orders/review.html b/templates/portfolios/task_orders/review.html index 55e6af75..c935411d 100644 --- a/templates/portfolios/task_orders/review.html +++ b/templates/portfolios/task_orders/review.html @@ -5,7 +5,7 @@ {% block portfolio_content %} {% call StickyCTA(text="Task order details") %} - Edit + Edit {% endcall %} {% include "fragments/task_order_review.html" %} diff --git a/templates/task_orders/step_1.html b/templates/task_orders/step_1.html index c146a74a..49894e5f 100644 --- a/templates/task_orders/step_1.html +++ b/templates/task_orders/step_1.html @@ -5,9 +5,9 @@ {% from 'components/upload_input.html' import UploadInput %} {% if task_order_id %} - {% set action = url_for("task_orders.upload_pdf", task_order_id=task_order_id) %} + {% set action = url_for("task_orders.submit_form_step_one_add_pdf", task_order_id=task_order_id) %} {% else %} - {% set action = url_for("task_orders.upload_pdf", portfolio_id=portfolio.id) %} + {% set action = url_for("task_orders.submit_form_step_one_add_pdf", portfolio_id=portfolio.id) %} {% endif %} {% set next_button_text = "Next: Add TO Number" %} diff --git a/templates/task_orders/step_2.html b/templates/task_orders/step_2.html index 5f56975e..38504855 100644 --- a/templates/task_orders/step_2.html +++ b/templates/task_orders/step_2.html @@ -2,9 +2,9 @@ {% from 'components/text_input.html' import TextInput %} -{% set action = url_for("task_orders.update_number", task_order_id=task_order_id) %} +{% set action = url_for("task_orders.submit_form_step_two_add_number", task_order_id=task_order_id) %} {% set next_button_text = "Next: Add Base CLIN" %} -{% set previous_button_link = url_for("task_orders.add_pdf", task_order_id=task_order_id) %} +{% set previous_button_link = url_for("task_orders.form_step_one_add_pdf", task_order_id=task_order_id) %} {% set step = "2" %} {% block to_builder_form_field %} diff --git a/templates/task_orders/step_3.html b/templates/task_orders/step_3.html index 1ba0c5e6..30e00ac9 100644 --- a/templates/task_orders/step_3.html +++ b/templates/task_orders/step_3.html @@ -5,9 +5,9 @@ {% from 'components/options_input.html' import OptionsInput %} {% from 'components/text_input.html' import TextInput %} -{% set action = url_for("task_orders.update_clins", task_order_id=task_order_id) %} +{% set action = url_for("task_orders.submit_form_step_three_add_clins", task_order_id=task_order_id) %} {% set next_button_text = "Next: Review Funding" %} -{% set previous_button_link = url_for("task_orders.add_number", task_order_id=task_order_id) %} +{% set previous_button_link = url_for("task_orders.form_step_two_add_number", task_order_id=task_order_id) %} {% set step = "3" %} {% macro LOAInput() %} diff --git a/templates/task_orders/step_4.html b/templates/task_orders/step_4.html index 65bee9a2..0a80f6fe 100644 --- a/templates/task_orders/step_4.html +++ b/templates/task_orders/step_4.html @@ -1,7 +1,7 @@ {% extends "task_orders/builder_base.html" %} -{% set action = url_for('task_orders.confirm_signature', task_order_id=task_order_id) %} -{% set previous_button_link = url_for("task_orders.add_clins", task_order_id=task_order_id) %} +{% set action = url_for('task_orders.form_step_five_confirm_signature', task_order_id=task_order_id) %} +{% set previous_button_link = url_for("task_orders.form_step_three_add_clins", task_order_id=task_order_id) %} {% set step = "4" %} {% block next_button %} diff --git a/templates/task_orders/step_5.html b/templates/task_orders/step_5.html index 872d49ae..d6ea4305 100644 --- a/templates/task_orders/step_5.html +++ b/templates/task_orders/step_5.html @@ -5,7 +5,7 @@ {% set action = url_for("task_orders.submit_task_order", task_order_id=task_order_id) %} {% set next_button_text = "Next: Confirm & Submit" %} -{% set previous_button_link = url_for("task_orders.review", task_order_id=task_order_id) %} +{% set previous_button_link = url_for("task_orders.form_step_four_review", task_order_id=task_order_id) %} {% set step = "5" %} {% block to_builder_form_field %} diff --git a/tests/routes/task_orders/test_index.py b/tests/routes/task_orders/test_index.py index c3476026..c2beee75 100644 --- a/tests/routes/task_orders/test_index.py +++ b/tests/routes/task_orders/test_index.py @@ -52,7 +52,8 @@ def test_review_task_order_draft(client, user_session, task_order): ) assert response.status_code == 302 assert ( - url_for("task_orders.add_pdf", task_order_id=task_order.id) in response.location + url_for("task_orders.form_step_one_add_pdf", task_order_id=task_order.id) + in response.location ) diff --git a/tests/routes/task_orders/test_new.py b/tests/routes/task_orders/test_new.py index 1107c16c..c2e1ea19 100644 --- a/tests/routes/task_orders/test_new.py +++ b/tests/routes/task_orders/test_new.py @@ -32,9 +32,11 @@ def user(): return UserFactory.create() -def test_task_orders_add_pdf(client, user_session, portfolio): +def test_task_orders_form_step_one_add_pdf(client, user_session, portfolio): user_session(portfolio.owner) - response = client.get(url_for("task_orders.add_pdf", portfolio_id=portfolio.id)) + response = client.get( + url_for("task_orders.form_step_one_add_pdf", portfolio_id=portfolio.id) + ) assert response.status_code == 200 @@ -42,7 +44,8 @@ def test_task_orders_upload_pdf(client, user_session, portfolio, pdf_upload, ses user_session(portfolio.owner) form_data = {"pdf": pdf_upload} response = client.post( - url_for("task_orders.upload_pdf", portfolio_id=portfolio.id), data=form_data + url_for("task_orders.submit_form_step_one_add_pdf", portfolio_id=portfolio.id), + data=form_data, ) assert response.status_code == 302 @@ -50,19 +53,21 @@ def test_task_orders_upload_pdf(client, user_session, portfolio, pdf_upload, ses assert task_order.pdf.filename == pdf_upload.filename -def test_task_orders_add_number(client, user_session, task_order): +def test_task_orders_form_step_two_add_number(client, user_session, task_order): user_session(task_order.creator) response = client.get( - url_for("task_orders.add_number", task_order_id=task_order.id) + url_for("task_orders.form_step_two_add_number", task_order_id=task_order.id) ) assert response.status_code == 200 -def test_task_orders_update_number(client, user_session, task_order): +def test_task_orders_submit_form_step_two_add_number(client, user_session, task_order): user_session(task_order.creator) form_data = {"number": "1234567890"} response = client.post( - url_for("task_orders.update_number", task_order_id=task_order.id), + url_for( + "task_orders.submit_form_step_two_add_number", task_order_id=task_order.id + ), data=form_data, ) @@ -70,13 +75,15 @@ def test_task_orders_update_number(client, user_session, task_order): assert task_order.number == "1234567890" -def test_task_orders_add_clins(client, user_session, task_order): +def test_task_orders_form_step_three_add_clins(client, user_session, task_order): user_session(task_order.creator) - response = client.get(url_for("task_orders.add_clins", task_order_id=task_order.id)) + response = client.get( + url_for("task_orders.form_step_three_add_clins", task_order_id=task_order.id) + ) assert response.status_code == 200 -def test_task_orders_update_clins(client, user_session, task_order): +def test_task_orders_submit_form_step_three_add_clins(client, user_session, task_order): user_session(task_order.creator) form_data = { "clins-0-jedi_clin_type": "JEDI_CLIN_1", @@ -94,23 +101,30 @@ def test_task_orders_update_clins(client, user_session, task_order): "clins-1-loas-0": "78979087", } response = client.post( - url_for("task_orders.update_clins", task_order_id=task_order.id), data=form_data + url_for( + "task_orders.submit_form_step_three_add_clins", task_order_id=task_order.id + ), + data=form_data, ) assert response.status_code == 302 assert len(task_order.clins) == 2 -def test_task_orders_review(client, user_session, task_order): +def test_task_orders_form_step_four_review(client, user_session, task_order): user_session(task_order.creator) - response = client.get(url_for("task_orders.review", task_order_id=task_order.id)) + response = client.get( + url_for("task_orders.form_step_four_review", task_order_id=task_order.id) + ) assert response.status_code == 200 -def test_task_orders_confirm_signature(client, user_session, task_order): +def test_task_orders_form_step_five_confirm_signature(client, user_session, task_order): user_session(task_order.creator) response = client.get( - url_for("task_orders.confirm_signature", task_order_id=task_order.id) + url_for( + "task_orders.form_step_five_confirm_signature", task_order_id=task_order.id + ) ) assert response.status_code == 200 @@ -119,7 +133,9 @@ def test_task_orders_form_step_one_add_pdf_existing_to( client, user_session, task_order ): user_session(task_order.creator) - response = client.get(url_for("task_orders.add_pdf", task_order_id=task_order.id)) + response = client.get( + url_for("task_orders.form_step_one_add_pdf", task_order_id=task_order.id) + ) assert response.status_code == 200 @@ -132,29 +148,41 @@ def test_task_orders_upload_pdf_existing_to( user_session(task_order.creator) form_data = {"pdf": pdf_upload2} response = client.post( - url_for("task_orders.upload_pdf", task_order_id=task_order.id), data=form_data + url_for( + "task_orders.submit_form_step_one_add_pdf", task_order_id=task_order.id + ), + data=form_data, ) assert response.status_code == 302 assert task_order.pdf.filename == pdf_upload2.filename -def test_task_orders_upload_pdf_delete_pdf(client, user_session, portfolio, pdf_upload): +def test_task_orders_submit_form_step_one_add_pdf_delete_pdf( + client, user_session, portfolio, pdf_upload +): user_session(portfolio.owner) task_order = TaskOrderFactory.create(pdf=pdf_upload, portfolio=portfolio) data = {"pdf": ""} response = client.post( - url_for("task_orders.upload_pdf", task_order_id=task_order.id), data=data + url_for( + "task_orders.submit_form_step_one_add_pdf", task_order_id=task_order.id + ), + data=data, ) assert task_order.pdf is None assert response.status_code == 302 -def test_task_orders_update_number_existing_to(client, user_session, task_order): +def test_task_orders_submit_form_step_two_add_number_existing_to( + client, user_session, task_order +): user_session(task_order.creator) form_data = {"number": "0000000000"} original_number = task_order.number response = client.post( - url_for("task_orders.update_number", task_order_id=task_order.id), + url_for( + "task_orders.submit_form_step_two_add_number", task_order_id=task_order.id + ), data=form_data, ) assert response.status_code == 302 @@ -162,7 +190,9 @@ def test_task_orders_update_number_existing_to(client, user_session, task_order) assert task_order.number != original_number -def test_task_orders_update_clins_existing_to(client, user_session, task_order): +def test_task_orders_submit_form_step_three_add_clins_existing_to( + client, user_session, task_order +): clin_list = [ { "jedi_clin_type": "JEDI_CLIN_1", @@ -194,7 +224,10 @@ def test_task_orders_update_clins_existing_to(client, user_session, task_order): "clins-0-loas-0": "123123123123", } response = client.post( - url_for("task_orders.update_clins", task_order_id=task_order.id), data=form_data + url_for( + "task_orders.submit_form_step_three_add_clins", task_order_id=task_order.id + ), + data=form_data, ) assert response.status_code == 302 diff --git a/tests/test_access.py b/tests/test_access.py index 25dd7562..893cdecc 100644 --- a/tests/test_access.py +++ b/tests/test_access.py @@ -448,18 +448,18 @@ def test_task_orders_download_task_order_pdf_access(get_url_assert_status, monke get_url_assert_status(rando, url, 404) -# task_orders.add_pdf -# task_orders.add_number -# task_orders.add_clins -# task_orders.review -# task_orders.confirm_signature +# task_orders.form_step_one_add_pdf +# task_orders.form_step_two_add_number +# task_orders.form_step_three_add_clins +# task_orders.form_step_four_review +# task_orders.form_step_five_confirm_signature def test_task_orders_new_get_routes(get_url_assert_status): get_routes = [ - "task_orders.add_pdf", - "task_orders.add_number", - "task_orders.add_clins", - "task_orders.review", - "task_orders.confirm_signature", + "task_orders.form_step_one_add_pdf", + "task_orders.form_step_two_add_number", + "task_orders.form_step_three_add_clins", + "task_orders.form_step_four_review", + "task_orders.form_step_five_confirm_signature", ] ccpo = user_with(PermissionSets.EDIT_PORTFOLIO_FUNDING) @@ -477,15 +477,15 @@ def test_task_orders_new_get_routes(get_url_assert_status): get_url_assert_status(rando, url, 404) -# task_orders.upload_pdf -# task_orders.update_number -# task_orders.update_clins +# task_orders.submit_form_step_one_add_pdf +# task_orders.submit_form_step_two_add_number +# task_orders.submit_form_step_three_add_clins def test_task_orders_new_post_routes(post_url_assert_status): post_routes = [ - ("task_orders.upload_pdf", {"pdf": ""}), - ("task_orders.update_number", {"number": "1234567890"}), + ("task_orders.submit_form_step_one_add_pdf", {"pdf": ""}), + ("task_orders.submit_form_step_two_add_number", {"number": "1234567890"}), ( - "task_orders.update_clins", + "task_orders.submit_form_step_three_add_clins", { "clins-0-jedi_clin_type": "JEDI_CLIN_1", "clins-0-clin_number": "12312", From dc3f9a8c1cdf535b60435c93fd6a70c4b54596cf Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Wed, 17 Jul 2019 15:41:41 -0400 Subject: [PATCH 15/17] Update route to include form so it is clear what step refers to Move submit route into the same file and the other form steps --- atst/routes/task_orders/index.py | 15 ----------- atst/routes/task_orders/new.py | 36 +++++++++++++++++++------- tests/routes/task_orders/test_index.py | 26 ------------------- tests/routes/task_orders/test_new.py | 29 +++++++++++++++++++++ 4 files changed, 55 insertions(+), 51 deletions(-) diff --git a/atst/routes/task_orders/index.py b/atst/routes/task_orders/index.py index 13010b88..af8d3dab 100644 --- a/atst/routes/task_orders/index.py +++ b/atst/routes/task_orders/index.py @@ -7,7 +7,6 @@ from atst.domain.task_orders import TaskOrders from atst.forms.task_order import SignatureForm from atst.models import Permissions from atst.models.task_order import Status as TaskOrderStatus -from atst.utils.flash import formatted_flash as flash @task_orders_bp.route("/task_orders//review") @@ -27,20 +26,6 @@ def review_task_order(task_order_id): ) -@task_orders_bp.route("/task_orders//submit", methods=["POST"]) -@user_can(Permissions.CREATE_TASK_ORDER, "submit task order") -def submit_task_order(task_order_id): - - task_order = TaskOrders.get(task_order_id) - TaskOrders.sign(task_order=task_order, signer_dod_id=g.current_user.dod_id) - - flash("task_order_submitted", task_order=task_order) - - return redirect( - url_for("task_orders.portfolio_funding", portfolio_id=task_order.portfolio.id) - ) - - @task_orders_bp.route("/portfolios//task_orders") @user_can(Permissions.VIEW_PORTFOLIO_FUNDING, message="view portfolio funding") def portfolio_funding(portfolio_id): diff --git a/atst/routes/task_orders/new.py b/atst/routes/task_orders/new.py index f6e04f46..24ecb265 100644 --- a/atst/routes/task_orders/new.py +++ b/atst/routes/task_orders/new.py @@ -5,6 +5,7 @@ from atst.domain.authz.decorator import user_can_access_decorator as user_can from atst.domain.task_orders import TaskOrders from atst.forms.task_order import TaskOrderForm, SignatureForm from atst.models.permissions import Permissions +from atst.utils.flash import formatted_flash as flash def render_task_orders_edit(template, portfolio_id=None, task_order_id=None, form=None): @@ -54,8 +55,8 @@ def update_task_order( ) -@task_orders_bp.route("/portfolios//task_orders/step_1") -@task_orders_bp.route("/task_orders//step_1") +@task_orders_bp.route("/portfolios//task_orders/form/step_1") +@task_orders_bp.route("/task_orders//form/step_1") @user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") def form_step_one_add_pdf(portfolio_id=None, task_order_id=None): return render_task_orders_edit( @@ -65,8 +66,10 @@ def form_step_one_add_pdf(portfolio_id=None, task_order_id=None): ) -@task_orders_bp.route("/portfolios//task_orders/step-1", methods=["POST"]) -@task_orders_bp.route("/task_orders//step_1", methods=["POST"]) +@task_orders_bp.route( + "/portfolios//task_orders/form/step-1", methods=["POST"] +) +@task_orders_bp.route("/task_orders//form/step_1", methods=["POST"]) @user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") def submit_form_step_one_add_pdf(portfolio_id=None, task_order_id=None): form_data = {**http_request.form, **http_request.files} @@ -82,7 +85,7 @@ def submit_form_step_one_add_pdf(portfolio_id=None, task_order_id=None): ) -@task_orders_bp.route("/task_orders//step_2") +@task_orders_bp.route("/task_orders//form/step_2") @user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") def form_step_two_add_number(task_order_id): return render_task_orders_edit( @@ -90,7 +93,7 @@ def form_step_two_add_number(task_order_id): ) -@task_orders_bp.route("/task_orders//step_2", methods=["POST"]) +@task_orders_bp.route("/task_orders//form/step_2", methods=["POST"]) @user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") def submit_form_step_two_add_number(task_order_id): form_data = {**http_request.form} @@ -102,7 +105,7 @@ def submit_form_step_two_add_number(task_order_id): ) -@task_orders_bp.route("/task_orders//step_3") +@task_orders_bp.route("/task_orders//form/step_3") @user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") def form_step_three_add_clins(task_order_id): return render_task_orders_edit( @@ -110,7 +113,7 @@ def form_step_three_add_clins(task_order_id): ) -@task_orders_bp.route("/task_orders//step_3", methods=["POST"]) +@task_orders_bp.route("/task_orders//form/step_3", methods=["POST"]) @user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") def submit_form_step_three_add_clins(task_order_id): form_data = {**http_request.form} @@ -122,7 +125,7 @@ def submit_form_step_three_add_clins(task_order_id): ) -@task_orders_bp.route("/task_orders//step_4") +@task_orders_bp.route("/task_orders//form/step_4") @user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") def form_step_four_review(task_order_id): return render_task_orders_edit( @@ -130,9 +133,22 @@ def form_step_four_review(task_order_id): ) -@task_orders_bp.route("/task_orders//step_5") +@task_orders_bp.route("/task_orders//form/step_5") @user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") def form_step_five_confirm_signature(task_order_id): return render_task_orders_edit( "task_orders/step_5.html", task_order_id=task_order_id, form=SignatureForm() ) + + +@task_orders_bp.route("/task_orders//submit", methods=["POST"]) +@user_can(Permissions.CREATE_TASK_ORDER, "submit task order") +def submit_task_order(task_order_id): + task_order = TaskOrders.get(task_order_id) + TaskOrders.sign(task_order=task_order, signer_dod_id=g.current_user.dod_id) + + flash("task_order_submitted", task_order=task_order) + + return redirect( + url_for("task_orders.portfolio_funding", portfolio_id=task_order.portfolio_id) + ) diff --git a/tests/routes/task_orders/test_index.py b/tests/routes/task_orders/test_index.py index c2beee75..33a75cd8 100644 --- a/tests/routes/task_orders/test_index.py +++ b/tests/routes/task_orders/test_index.py @@ -55,29 +55,3 @@ def test_review_task_order_draft(client, user_session, task_order): url_for("task_orders.form_step_one_add_pdf", task_order_id=task_order.id) in response.location ) - - -def test_submit_task_order(client, user_session, task_order): - user_session(task_order.portfolio.owner) - response = client.post( - url_for("task_orders.submit_task_order", task_order_id=task_order.id) - ) - assert response.status_code == 302 - - active_start_date = date.today() - timedelta(days=1) - active_task_order = TaskOrderFactory(portfolio=task_order.portfolio) - CLINFactory(task_order=active_task_order, start_date=active_start_date) - assert active_task_order.status == TaskOrderStatus.UNSIGNED - response = client.post( - url_for("task_orders.submit_task_order", task_order_id=active_task_order.id) - ) - assert active_task_order.status == TaskOrderStatus.ACTIVE - - upcoming_start_date = date.today() + timedelta(days=1) - upcoming_task_order = TaskOrderFactory(portfolio=task_order.portfolio) - CLINFactory(task_order=upcoming_task_order, start_date=upcoming_start_date) - assert upcoming_task_order.status == TaskOrderStatus.UNSIGNED - response = client.post( - url_for("task_orders.submit_task_order", task_order_id=upcoming_task_order.id) - ) - assert upcoming_task_order.status == TaskOrderStatus.UPCOMING diff --git a/tests/routes/task_orders/test_new.py b/tests/routes/task_orders/test_new.py index c2e1ea19..ab221bca 100644 --- a/tests/routes/task_orders/test_new.py +++ b/tests/routes/task_orders/test_new.py @@ -1,12 +1,15 @@ import pytest from flask import url_for +from datetime import timedelta, date from atst.domain.permission_sets import PermissionSets from atst.domain.task_orders import TaskOrders +from atst.models.task_order import Status as TaskOrderStatus from atst.models import Attachment, TaskOrder from atst.utils.localization import translate from tests.factories import ( + CLINFactory, PortfolioFactory, PortfolioRoleFactory, TaskOrderFactory, @@ -234,6 +237,32 @@ def test_task_orders_submit_form_step_three_add_clins_existing_to( assert len(task_order.clins) == 1 +def test_submit_task_order(client, user_session, task_order): + user_session(task_order.portfolio.owner) + response = client.post( + url_for("task_orders.submit_task_order", task_order_id=task_order.id) + ) + assert response.status_code == 302 + + active_start_date = date.today() - timedelta(days=1) + active_task_order = TaskOrderFactory(portfolio=task_order.portfolio) + CLINFactory(task_order=active_task_order, start_date=active_start_date) + assert active_task_order.status == TaskOrderStatus.UNSIGNED + response = client.post( + url_for("task_orders.submit_task_order", task_order_id=active_task_order.id) + ) + assert active_task_order.status == TaskOrderStatus.ACTIVE + + upcoming_start_date = date.today() + timedelta(days=1) + upcoming_task_order = TaskOrderFactory(portfolio=task_order.portfolio) + CLINFactory(task_order=upcoming_task_order, start_date=upcoming_start_date) + assert upcoming_task_order.status == TaskOrderStatus.UNSIGNED + response = client.post( + url_for("task_orders.submit_task_order", task_order_id=upcoming_task_order.id) + ) + assert upcoming_task_order.status == TaskOrderStatus.UPCOMING + + @pytest.mark.skip(reason="Reevaluate how form handles invalid data") def test_task_orders_update_invalid_data(client, user_session, portfolio): user_session(portfolio.owner) From aa25f671e3a7565bf343ddc85cbefad01d3c71d3 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Thu, 18 Jul 2019 09:46:51 -0400 Subject: [PATCH 16/17] Update message for perms decorator to reflect what user is trying to access --- atst/routes/task_orders/new.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/atst/routes/task_orders/new.py b/atst/routes/task_orders/new.py index 24ecb265..a806bda7 100644 --- a/atst/routes/task_orders/new.py +++ b/atst/routes/task_orders/new.py @@ -57,7 +57,7 @@ def update_task_order( @task_orders_bp.route("/portfolios//task_orders/form/step_1") @task_orders_bp.route("/task_orders//form/step_1") -@user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") +@user_can(Permissions.CREATE_TASK_ORDER, message="view task order form") def form_step_one_add_pdf(portfolio_id=None, task_order_id=None): return render_task_orders_edit( "task_orders/step_1.html", @@ -70,7 +70,7 @@ def form_step_one_add_pdf(portfolio_id=None, task_order_id=None): "/portfolios//task_orders/form/step-1", methods=["POST"] ) @task_orders_bp.route("/task_orders//form/step_1", methods=["POST"]) -@user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") +@user_can(Permissions.CREATE_TASK_ORDER, message="update task order form") def submit_form_step_one_add_pdf(portfolio_id=None, task_order_id=None): form_data = {**http_request.form, **http_request.files} next_page = "task_orders.form_step_two_add_number" @@ -86,7 +86,7 @@ def submit_form_step_one_add_pdf(portfolio_id=None, task_order_id=None): @task_orders_bp.route("/task_orders//form/step_2") -@user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") +@user_can(Permissions.CREATE_TASK_ORDER, message="view task order form") def form_step_two_add_number(task_order_id): return render_task_orders_edit( "task_orders/step_2.html", task_order_id=task_order_id @@ -94,7 +94,7 @@ def form_step_two_add_number(task_order_id): @task_orders_bp.route("/task_orders//form/step_2", methods=["POST"]) -@user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") +@user_can(Permissions.CREATE_TASK_ORDER, message="update task order form") def submit_form_step_two_add_number(task_order_id): form_data = {**http_request.form} next_page = "task_orders.form_step_three_add_clins" @@ -106,7 +106,7 @@ def submit_form_step_two_add_number(task_order_id): @task_orders_bp.route("/task_orders//form/step_3") -@user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") +@user_can(Permissions.CREATE_TASK_ORDER, message="view task order form") def form_step_three_add_clins(task_order_id): return render_task_orders_edit( "task_orders/step_3.html", task_order_id=task_order_id @@ -114,7 +114,7 @@ def form_step_three_add_clins(task_order_id): @task_orders_bp.route("/task_orders//form/step_3", methods=["POST"]) -@user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") +@user_can(Permissions.CREATE_TASK_ORDER, message="update task order form") def submit_form_step_three_add_clins(task_order_id): form_data = {**http_request.form} next_page = "task_orders.form_step_four_review" @@ -126,7 +126,7 @@ def submit_form_step_three_add_clins(task_order_id): @task_orders_bp.route("/task_orders//form/step_4") -@user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") +@user_can(Permissions.CREATE_TASK_ORDER, message="view task order form") def form_step_four_review(task_order_id): return render_task_orders_edit( "task_orders/step_4.html", task_order_id=task_order_id @@ -134,7 +134,7 @@ def form_step_four_review(task_order_id): @task_orders_bp.route("/task_orders//form/step_5") -@user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") +@user_can(Permissions.CREATE_TASK_ORDER, message="view task order form") def form_step_five_confirm_signature(task_order_id): return render_task_orders_edit( "task_orders/step_5.html", task_order_id=task_order_id, form=SignatureForm() From 3f8ade0dc992278eefc689bddbf9c1423845b953 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Thu, 18 Jul 2019 09:49:52 -0400 Subject: [PATCH 17/17] Do not show previous button on first step of form --- templates/task_orders/builder_base.html | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/templates/task_orders/builder_base.html b/templates/task_orders/builder_base.html index c2b342d2..e99aef9b 100644 --- a/templates/task_orders/builder_base.html +++ b/templates/task_orders/builder_base.html @@ -19,9 +19,11 @@ class="usa-button usa-button-primary"> {% endblock %} - - Previous - + {% if step != "1" %} + + Previous + + {% endif %}