diff --git a/atst/domain/authz.py b/atst/domain/authz.py index f2bcc0de..7075a48b 100644 --- a/atst/domain/authz.py +++ b/atst/domain/authz.py @@ -36,6 +36,27 @@ class Authorization(object): def is_ccpo(cls, user): return user.atat_role.name == "ccpo" + @classmethod + def is_ko(cls, user, task_order): + return user == task_order.contracting_officer + + @classmethod + def is_cor(cls, user, task_order): + return user == task_order.contracting_officer_representative + + @classmethod + def is_so(cls, user, task_order): + return user == task_order.security_officer + + @classmethod + def check_is_ko_or_cor(cls, user, task_order): + if Authorization.is_ko(user, task_order) or Authorization.is_cor( + user, task_order + ): + return True + else: + raise UnauthorizedError(user, "not KO or COR") + @classmethod def check_is_ko(cls, user, task_order): if task_order.contracting_officer != user: diff --git a/atst/domain/task_orders.py b/atst/domain/task_orders.py index 672eb749..00dd0218 100644 --- a/atst/domain/task_orders.py +++ b/atst/domain/task_orders.py @@ -120,6 +120,10 @@ class TaskOrders(object): return True + @classmethod + def is_signed_by_ko(cls, task_order): + return task_order.signer_dod_id is not None + @classmethod def mission_owner_sections(cls): section_list = TaskOrders.SECTIONS diff --git a/atst/routes/portfolios/task_orders.py b/atst/routes/portfolios/task_orders.py index 7fa280c9..27a8fdaa 100644 --- a/atst/routes/portfolios/task_orders.py +++ b/atst/routes/portfolios/task_orders.py @@ -65,10 +65,14 @@ def view_task_order(portfolio_id, task_order_id): dd_254_complete = DD254s.is_complete(task_order.dd_254) return render_template( "portfolios/task_orders/show.html", + dd_254_complete=dd_254_complete, + is_cor=Authorization.is_cor(g.current_user, task_order), + is_ko=Authorization.is_ko(g.current_user, task_order), + is_so=Authorization.is_so(g.current_user, task_order), + is_to_signed=TaskOrders.is_signed_by_ko(task_order), portfolio=portfolio, task_order=task_order, to_form_complete=to_form_complete, - dd_254_complete=dd_254_complete, user=g.current_user, ) @@ -78,7 +82,8 @@ def ko_review(portfolio_id, task_order_id): task_order = TaskOrders.get(g.current_user, task_order_id) portfolio = Portfolios.get(g.current_user, portfolio_id) - Authorization.check_is_ko(g.current_user, task_order) + Authorization.check_is_ko_or_cor(g.current_user, task_order) + return render_template( "/portfolios/task_orders/review.html", portfolio=portfolio, @@ -95,12 +100,22 @@ def submit_ko_review(portfolio_id, task_order_id, form=None): form_data = {**http_request.form, **http_request.files} form = KOReviewForm(form_data) - Authorization.check_is_ko(g.current_user, task_order) + Authorization.check_is_ko_or_cor(g.current_user, task_order) + if form.validate(): TaskOrders.update(user=g.current_user, task_order=task_order, **form.data) - return redirect( - url_for("task_orders.signature_requested", task_order_id=task_order_id) - ) + if Authorization.is_ko(g.current_user, task_order): + return redirect( + url_for("task_orders.signature_requested", task_order_id=task_order_id) + ) + else: + return redirect( + url_for( + "portfolios.view_task_order", + task_order_id=task_order_id, + portfolio_id=portfolio_id, + ) + ) else: return render_template( "/portfolios/task_orders/review.html", diff --git a/atst/routes/task_orders/signing.py b/atst/routes/task_orders/signing.py index e6251de3..548d8fa3 100644 --- a/atst/routes/task_orders/signing.py +++ b/atst/routes/task_orders/signing.py @@ -14,7 +14,7 @@ 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 task_order.signer_dod_id is not None: + if TaskOrders.is_signed_by_ko(task_order): raise NotFoundError("task_order") return task_order diff --git a/templates/portfolios/task_orders/show.html b/templates/portfolios/task_orders/show.html index 105ed2c7..c5468a24 100644 --- a/templates/portfolios/task_orders/show.html +++ b/templates/portfolios/task_orders/show.html @@ -124,27 +124,37 @@