diff --git a/atst/domain/task_orders.py b/atst/domain/task_orders.py index e2baecd0..c5e8e9f9 100644 --- a/atst/domain/task_orders.py +++ b/atst/domain/task_orders.py @@ -173,6 +173,14 @@ class TaskOrders(object): "{} is not an officer role on task orders".format(officer_type) ) + @classmethod + def add_dd_254(user, task_order, dd_254_data): + dd_254 = DD254(**dd_254_data) + task_order.dd_254 = dd_254 + + db.session.add(task_order) + db.session.commit() + class DD254s: # TODO: standin implementation until we have a real download, diff --git a/atst/routes/portfolios/task_orders.py b/atst/routes/portfolios/task_orders.py index 9a8c23a2..e83353f3 100644 --- a/atst/routes/portfolios/task_orders.py +++ b/atst/routes/portfolios/task_orders.py @@ -181,4 +181,37 @@ def so_review(portfolio_id, task_order_id): form = so_review_form(task_order) - return render_template("portfolios/task_orders/so_review.html", form=form) + return render_template( + "portfolios/task_orders/so_review.html", + form=form, + portfolio=task_order.portfolio, + task_order=task_order, + ) + + +@portfolios_bp.route( + "/portfolios//task_order//dd254", methods=["POST"] +) +def submit_so_review(portfolio_id, task_order_id): + task_order = TaskOrders.get(g.current_user, task_order_id) + Authorization.check_is_so(g.current_user, task_order) + + form = DD254Form(http_request.form) + + if form.validate(): + TaskOrders.add_dd_254(task_order, form.data) + # TODO: will redirect to download, sign, upload page + return redirect( + url_for( + "portfolios.view_task_order", + portfolio_id=task_order.portfolio.id, + task_order_id=task_order.id, + ) + ) + else: + return render_template( + "portfolios/task_orders/so_review.html", + form=form, + portfolio=task_order.portfolio, + task_order=task_order, + ) diff --git a/templates/portfolios/task_orders/so_review.html b/templates/portfolios/task_orders/so_review.html index fb07027e..b4ccd365 100644 --- a/templates/portfolios/task_orders/so_review.html +++ b/templates/portfolios/task_orders/so_review.html @@ -5,6 +5,8 @@ {% block content %} +{% include "fragments/flash.html" %} +
@@ -14,16 +16,26 @@
+
-

{{ "task_orders.so_review.certification" | translate }}

- {{ TextInput(form.certifying_official) }} - {{ TextInput(form.co_title) }} - {{ TextInput(form.co_phone, placeholder='(123) 456-7890', validation='usPhone') }} - {{ TextInput(form.co_address, paragraph=True) }} +
+ {{ form.csrf_token }} +

{{ "task_orders.so_review.certification" | translate }}

+ {{ TextInput(form.certifying_official) }} + {{ TextInput(form.co_title) }} + {{ TextInput(form.co_phone, placeholder='(123) 456-7890', validation='usPhone') }} + {{ TextInput(form.co_address, paragraph=True) }} -
+
- {{ MultiCheckboxInput(form.required_distribution) }} + {{ MultiCheckboxInput(form.required_distribution) }} + +
+ +
+
diff --git a/tests/routes/portfolios/test_task_orders.py b/tests/routes/portfolios/test_task_orders.py index 8375d89f..c6ecc97d 100644 --- a/tests/routes/portfolios/test_task_orders.py +++ b/tests/routes/portfolios/test_task_orders.py @@ -12,6 +12,7 @@ from tests.factories import ( PortfolioRoleFactory, TaskOrderFactory, UserFactory, + DD254Factory, random_future_date, random_past_date, ) @@ -353,3 +354,37 @@ def test_so_review_page(app, client, user_session): assert ( task_order.so_first_name in co_name and task_order.so_last_name in co_name ) + + +def test_submit_so_review(app, client, user_session): + portfolio = PortfolioFactory.create() + so = UserFactory.create() + PortfolioRoleFactory.create( + role=Roles.get("officer"), + portfolio=portfolio, + user=so, + status=PortfolioStatus.ACTIVE, + ) + task_order = TaskOrderFactory.create(portfolio=portfolio, security_officer=so) + dd_254_data = DD254Factory.dictionary() + + user_session(so) + response = client.post( + url_for( + "portfolios.submit_so_review", + portfolio_id=portfolio.id, + task_order_id=task_order.id, + ), + data=dd_254_data, + ) + expected_redirect = url_for( + "portfolios.view_task_order", + portfolio_id=portfolio.id, + task_order_id=task_order.id, + _external=True, + ) + assert response.status_code == 302 + assert response.headers["Location"] == expected_redirect + + assert task_order.dd_254 + assert task_order.dd_254.certifying_official == dd_254_data["certifying_official"]