diff --git a/atst/routes/portfolios/task_orders.py b/atst/routes/portfolios/task_orders.py
index 15dbdd03..64748875 100644
--- a/atst/routes/portfolios/task_orders.py
+++ b/atst/routes/portfolios/task_orders.py
@@ -5,6 +5,7 @@ from flask import g, redirect, render_template, url_for, request as http_request
from . import portfolios_bp
from atst.database import db
from atst.domain.task_orders import TaskOrders
+from atst.domain.exceptions import NotFoundError
from atst.domain.portfolios import Portfolios
from atst.domain.authz import Authorization
from atst.forms.officers import EditTaskOrderOfficersForm
@@ -113,12 +114,16 @@ def task_order_invitations(portfolio_id, task_order_id):
portfolio = Portfolios.get(g.current_user, portfolio_id)
task_order = TaskOrders.get(g.current_user, task_order_id)
form = EditTaskOrderOfficersForm(obj=task_order)
- return render_template(
- "portfolios/task_orders/invitations.html",
- portfolio=portfolio,
- task_order=task_order,
- form=form,
- )
+
+ if TaskOrders.all_sections_complete(task_order):
+ return render_template(
+ "portfolios/task_orders/invitations.html",
+ portfolio=portfolio,
+ task_order=task_order,
+ form=form,
+ )
+ else:
+ raise NotFoundError("task_order")
@portfolios_bp.route(
diff --git a/templates/portfolios/task_orders/show.html b/templates/portfolios/task_orders/show.html
index 1acbcf30..ce3791bf 100644
--- a/templates/portfolios/task_orders/show.html
+++ b/templates/portfolios/task_orders/show.html
@@ -203,10 +203,12 @@
{{ InvitationStatus('Contracting Officer', task_order.contracting_officer, officer_info=task_order.officer_dictionary('contracting_officer')) }}
{{ InvitationStatus('Contracting Officer Representative', task_order.contracting_officer_representative, officer_info=task_order.officer_dictionary('contracting_officer_representative')) }}
diff --git a/tests/routes/portfolios/test_task_orders.py b/tests/routes/portfolios/test_task_orders.py
index c8c86543..fe994bc8 100644
--- a/tests/routes/portfolios/test_task_orders.py
+++ b/tests/routes/portfolios/test_task_orders.py
@@ -5,6 +5,7 @@ from datetime import timedelta, date
from atst.domain.roles import Roles
from atst.domain.task_orders import TaskOrders
from atst.models.portfolio_role import Status as PortfolioStatus
+from atst.utils.localization import translate
from tests.factories import (
PortfolioFactory,
@@ -178,6 +179,7 @@ def test_ko_can_view_task_order(client, user_session):
)
task_order = TaskOrderFactory.create(portfolio=portfolio, contracting_officer=ko)
user_session(ko)
+
response = client.get(
url_for(
"portfolios.view_task_order",
@@ -186,9 +188,21 @@ def test_ko_can_view_task_order(client, user_session):
)
)
assert response.status_code == 200
+ assert translate("common.manage") in response.data.decode()
+
+ TaskOrders.update(ko, task_order, clin_01=None)
+ response = client.get(
+ url_for(
+ "portfolios.view_task_order",
+ portfolio_id=portfolio.id,
+ task_order_id=task_order.id,
+ )
+ )
+ assert response.status_code == 200
+ assert translate("common.manage") not in response.data.decode()
-def test_can_view_task_order_invitations(client, user_session):
+def test_can_view_task_order_invitations_when_complete(client, user_session):
portfolio = PortfolioFactory.create()
user_session(portfolio.owner)
task_order = TaskOrderFactory.create(portfolio=portfolio)
@@ -202,6 +216,20 @@ def test_can_view_task_order_invitations(client, user_session):
assert response.status_code == 200
+def test_cant_view_task_order_invitations_when_not_complete(client, user_session):
+ portfolio = PortfolioFactory.create()
+ user_session(portfolio.owner)
+ task_order = TaskOrderFactory.create(portfolio=portfolio, clin_01=None)
+ response = client.get(
+ url_for(
+ "portfolios.task_order_invitations",
+ portfolio_id=portfolio.id,
+ task_order_id=task_order.id,
+ )
+ )
+ assert response.status_code == 404
+
+
def test_ko_can_view_ko_review_page(client, user_session):
portfolio = PortfolioFactory.create()
ko = UserFactory.create()
diff --git a/translations.yaml b/translations.yaml
index 4547e4fb..85bc8ef5 100644
--- a/translations.yaml
+++ b/translations.yaml
@@ -20,6 +20,7 @@ base_public:
title_tag: JEDI Cloud
common:
back: Back
+ manage: manage
save_and_continue: Save & Continue
sign: Sign
components: