From 521d98562bb3d1b5668d02ba0fa6dc9b23ddcc72 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Thu, 7 Mar 2019 16:15:03 -0500 Subject: [PATCH] Add check to see if KO can sign the TO and update tests --- atst/domain/task_orders.py | 8 ++++ atst/routes/portfolios/task_orders.py | 4 +- atst/routes/task_orders/signing.py | 6 +-- tests/routes/portfolios/test_task_orders.py | 2 + tests/routes/task_orders/test_sign.py | 46 +++++++++++++++++++-- 5 files changed, 59 insertions(+), 7 deletions(-) diff --git a/atst/domain/task_orders.py b/atst/domain/task_orders.py index 00dd0218..63239679 100644 --- a/atst/domain/task_orders.py +++ b/atst/domain/task_orders.py @@ -120,6 +120,14 @@ class TaskOrders(object): return True + @classmethod + def can_ko_sign(cls, task_order): + return ( + TaskOrders.all_sections_complete(task_order) + and DD254s.is_complete(task_order.dd_254) + and not TaskOrders.is_signed_by_ko(task_order) + ) + @classmethod def is_signed_by_ko(cls, task_order): return task_order.signer_dod_id is not None diff --git a/atst/routes/portfolios/task_orders.py b/atst/routes/portfolios/task_orders.py index 86c07e2d..ea0b3b95 100644 --- a/atst/routes/portfolios/task_orders.py +++ b/atst/routes/portfolios/task_orders.py @@ -108,7 +108,9 @@ def submit_ko_review(portfolio_id, task_order_id, form=None): if form.validate(): TaskOrders.update(user=g.current_user, task_order=task_order, **form.data) - if Authorization.is_ko(g.current_user, task_order): + if Authorization.is_ko(g.current_user, task_order) and TaskOrders.can_ko_sign( + task_order + ): return redirect( url_for("task_orders.signature_requested", task_order_id=task_order_id) ) diff --git a/atst/routes/task_orders/signing.py b/atst/routes/task_orders/signing.py index 548d8fa3..d3cf0c55 100644 --- a/atst/routes/task_orders/signing.py +++ b/atst/routes/task_orders/signing.py @@ -4,7 +4,7 @@ import datetime from . import task_orders_bp from atst.domain.authz import Authorization -from atst.domain.exceptions import NotFoundError +from atst.domain.exceptions import NoAccessError from atst.domain.task_orders import TaskOrders from atst.forms.task_order import SignatureForm from atst.utils.flash import formatted_flash as flash @@ -14,8 +14,8 @@ def find_unsigned_ko_to(task_order_id): task_order = TaskOrders.get(g.current_user, task_order_id) Authorization.check_is_ko(g.current_user, task_order) - if TaskOrders.is_signed_by_ko(task_order): - raise NotFoundError("task_order") + if not TaskOrders.can_ko_sign(task_order): + raise NoAccessError("task_order") return task_order diff --git a/tests/routes/portfolios/test_task_orders.py b/tests/routes/portfolios/test_task_orders.py index 73430512..0db25d16 100644 --- a/tests/routes/portfolios/test_task_orders.py +++ b/tests/routes/portfolios/test_task_orders.py @@ -412,6 +412,8 @@ def test_submit_completed_ko_review_page_as_ko(client, user_session, pdf_upload) ) task_order = TaskOrderFactory.create(portfolio=portfolio, contracting_officer=ko) + dd_254 = DD254Factory.create() + TaskOrders.add_dd_254(task_order, dd_254.to_dictionary()) user_session(ko) loa_list = ["123123123", "456456456", "789789789"] diff --git a/tests/routes/task_orders/test_sign.py b/tests/routes/task_orders/test_sign.py index 0196c4dd..a7717ab0 100644 --- a/tests/routes/task_orders/test_sign.py +++ b/tests/routes/task_orders/test_sign.py @@ -1,17 +1,34 @@ from flask import url_for from atst.domain.task_orders import TaskOrders -from tests.factories import UserFactory, TaskOrderFactory, PortfolioFactory +from tests.factories import ( + UserFactory, + TaskOrderFactory, + PortfolioFactory, + DD254Factory, +) def create_ko_task_order(user_session, contracting_officer): portfolio = PortfolioFactory.create(owner=contracting_officer) user_session(contracting_officer) - return TaskOrderFactory.create( + task_order = TaskOrderFactory.create( portfolio=portfolio, contracting_officer=contracting_officer ) + TaskOrders.add_officer( + contracting_officer, + task_order, + "contracting_officer", + contracting_officer.to_dictionary(), + ) + + dd_254 = DD254Factory.create() + TaskOrders.add_dd_254(task_order, dd_254.to_dictionary()) + + return task_order + def test_show_signature_requested_not_ko(client, user_session): contracting_officer = UserFactory.create() @@ -27,12 +44,35 @@ def test_show_signature_requested_not_ko(client, user_session): def test_show_signature_requested(client, user_session): contracting_officer = UserFactory.create() - task_order = create_ko_task_order(user_session, contracting_officer) + portfolio = PortfolioFactory.create(owner=contracting_officer) + user_session(contracting_officer) + # create unfinished TO + task_order = TaskOrderFactory.create(portfolio=portfolio, clin_01=None) + TaskOrders.add_officer( + contracting_officer, + task_order, + "contracting_officer", + contracting_officer.to_dictionary(), + ) response = client.get( url_for("task_orders.signature_requested", task_order_id=task_order.id) ) + assert response.status_code == 404 + # Finish TO + TaskOrders.update(contracting_officer, task_order, clin_01=100) + response = client.get( + url_for("task_orders.signature_requested", task_order_id=task_order.id) + ) + assert response.status_code == 404 + + # Complete DD 254 + dd_254 = DD254Factory.create() + TaskOrders.add_dd_254(task_order, dd_254.to_dictionary()) + response = client.get( + url_for("task_orders.signature_requested", task_order_id=task_order.id) + ) assert response.status_code == 200