diff --git a/.secrets.baseline b/.secrets.baseline
index 385c0b04..05921baa 100644
--- a/.secrets.baseline
+++ b/.secrets.baseline
@@ -3,7 +3,7 @@
"files": "^.secrets.baseline$|^.*pgsslrootcert.yml$",
"lines": null
},
- "generated_at": "2019-12-05T17:54:05Z",
+ "generated_at": "2019-12-06T21:22:07Z",
"plugins_used": [
{
"base64_limit": 4.5,
@@ -161,7 +161,7 @@
"hashed_secret": "e4f14805dfd1e6af030359090c535e149e6b4207",
"is_secret": false,
"is_verified": false,
- "line_number": 31,
+ "line_number": 41,
"type": "Hex High Entropy String"
}
],
diff --git a/atst/domain/task_orders.py b/atst/domain/task_orders.py
index eceb01c3..6a4f66a0 100644
--- a/atst/domain/task_orders.py
+++ b/atst/domain/task_orders.py
@@ -67,10 +67,10 @@ class TaskOrders(BaseDomainClass):
def sort_by_status(cls, task_orders):
by_status = {}
for status in SORT_ORDERING:
- by_status[status] = []
+ by_status[status.value] = []
for task_order in task_orders:
- by_status[task_order.status].append(task_order)
+ by_status[task_order.display_status].append(task_order)
return by_status
diff --git a/atst/models/task_order.py b/atst/models/task_order.py
index 8bae6a7b..aa925878 100644
--- a/atst/models/task_order.py
+++ b/atst/models/task_order.py
@@ -1,10 +1,12 @@
from datetime import timedelta
from enum import Enum
+import random
from sqlalchemy import Column, DateTime, ForeignKey, String
from sqlalchemy.ext.hybrid import hybrid_property
from sqlalchemy.orm import relationship
+from atst.domain.csp.reports import MockReportingProvider
from atst.models.base import Base
import atst.models.types as types
import atst.models.mixins as mixins
@@ -20,7 +22,13 @@ class Status(Enum):
UNSIGNED = "Not signed"
-SORT_ORDERING = [Status.ACTIVE, Status.DRAFT, Status.UPCOMING, Status.EXPIRED, Status.UNSIGNED]
+SORT_ORDERING = [
+ Status.ACTIVE,
+ Status.DRAFT,
+ Status.UPCOMING,
+ Status.EXPIRED,
+ Status.UNSIGNED,
+]
class TaskOrder(Base, mixins.TimestampsMixin):
@@ -126,12 +134,11 @@ class TaskOrder(Base, mixins.TimestampsMixin):
@property
def start_date(self):
- return min((c.start_date for c in self.clins), default=self.time_created.date())
+ return min((c.start_date for c in self.clins), default=None)
@property
def end_date(self):
- default_end_date = self.start_date + timedelta(days=1)
- return max((c.end_date for c in self.clins), default=default_end_date)
+ return max((c.end_date for c in self.clins), default=None)
@property
def days_to_expiration(self):
@@ -165,6 +172,12 @@ class TaskOrder(Base, mixins.TimestampsMixin):
# Faked for display purposes
return 50
+ @property
+ def invoiced_funds(self):
+ # TODO: implement this using reporting data from the CSP
+ percentage_spent = random.randrange(50, 100)
+ return (self.total_obligated_funds * percentage_spent) / 100
+
@property
def display_status(self):
return self.status.value
diff --git a/atst/routes/task_orders/index.py b/atst/routes/task_orders/index.py
index 4c0adc07..5e2a778e 100644
--- a/atst/routes/task_orders/index.py
+++ b/atst/routes/task_orders/index.py
@@ -30,6 +30,4 @@ def portfolio_funding(portfolio_id):
portfolio = Portfolios.get(g.current_user, portfolio_id)
task_orders = TaskOrders.sort_by_status(portfolio.task_orders)
# TODO: Get expended amount from the CSP
- return render_template(
- "task_orders/index.html", task_orders=task_orders
- )
+ return render_template("task_orders/index.html", task_orders=task_orders)
diff --git a/templates/task_orders/index.html b/templates/task_orders/index.html
index 1ef4e55b..441977a5 100644
--- a/templates/task_orders/index.html
+++ b/templates/task_orders/index.html
@@ -47,7 +47,7 @@
Total Expended
-
$0
+
{{ task_order.invoiced_funds | dollars }}
@@ -72,7 +72,7 @@
{% if task_orders %}
{% call AccordionList() %}
{% for status, to_list in task_orders.items() %}
- {{ TaskOrderList(to_list, status.value) }}
+ {{ TaskOrderList(to_list, status) }}
{% endfor %}
{% endcall %}
{% else %}
diff --git a/tests/domain/test_task_orders.py b/tests/domain/test_task_orders.py
index d2005c50..acc2d158 100644
--- a/tests/domain/test_task_orders.py
+++ b/tests/domain/test_task_orders.py
@@ -148,9 +148,9 @@ def test_task_order_sort_by_status():
]
sorted_by_status = TaskOrders.sort_by_status(initial_to_list)
- assert len(sorted_by_status[Status.DRAFT]) == 3
- assert len(sorted_by_status[Status.ACTIVE]) == 1
- assert len(sorted_by_status[Status.UPCOMING]) == 1
- assert len(sorted_by_status[Status.EXPIRED]) == 2
- assert len(sorted_by_status[Status.UNSIGNED]) == 1
- assert list(sorted_by_status.keys()) == SORT_ORDERING
+ assert len(sorted_by_status["Draft"]) == 3
+ assert len(sorted_by_status["Active"]) == 1
+ assert len(sorted_by_status["Upcoming"]) == 1
+ assert len(sorted_by_status["Expired"]) == 2
+ assert len(sorted_by_status["Not signed"]) == 1
+ assert list(sorted_by_status.keys()) == [status.value for status in SORT_ORDERING]
diff --git a/tests/routes/task_orders/test_index.py b/tests/routes/task_orders/test_index.py
index 708b2bdc..48d8bd6b 100644
--- a/tests/routes/task_orders/test_index.py
+++ b/tests/routes/task_orders/test_index.py
@@ -29,8 +29,10 @@ def task_order():
user = UserFactory.create()
portfolio = PortfolioFactory.create(owner=user)
attachment = Attachment(filename="sample_attachment", object_name="sample")
+ task_order = TaskOrderFactory.create(portfolio=portfolio)
+ CLINFactory.create(task_order=task_order)
- return TaskOrderFactory.create(portfolio=portfolio)
+ return task_order
def test_review_task_order_not_draft(client, user_session, task_order):
diff --git a/tests/routes/task_orders/test_new.py b/tests/routes/task_orders/test_new.py
index 4d2f5fdb..1e8e16eb 100644
--- a/tests/routes/task_orders/test_new.py
+++ b/tests/routes/task_orders/test_new.py
@@ -19,6 +19,16 @@ def build_pdf_form_data(filename="sample.pdf", object_name=None):
def task_order():
user = UserFactory.create()
portfolio = PortfolioFactory.create(owner=user)
+ task_order = TaskOrderFactory.create(portfolio=portfolio)
+ CLINFactory.create(task_order=task_order)
+
+ return task_order
+
+
+@pytest.fixture
+def incomplete_to():
+ user = UserFactory.create()
+ portfolio = PortfolioFactory.create(owner=user)
return TaskOrderFactory.create(portfolio=portfolio)
@@ -234,7 +244,7 @@ def test_task_orders_submit_form_step_three_add_clins_existing_to(
},
]
TaskOrders.create_clins(task_order.id, clin_list)
- assert len(task_order.clins) == 2
+ assert len(task_order.clins) == 3
user_session(task_order.portfolio.owner)
form_data = {
@@ -267,11 +277,11 @@ def test_task_orders_form_step_four_review(client, user_session, completed_task_
def test_task_orders_form_step_four_review_incomplete_to(
- client, user_session, task_order
+ client, user_session, incomplete_to
):
- user_session(task_order.portfolio.owner)
+ user_session(incomplete_to.portfolio.owner)
response = client.get(
- url_for("task_orders.form_step_four_review", task_order_id=task_order.id)
+ url_for("task_orders.form_step_four_review", task_order_id=incomplete_to.id)
)
assert response.status_code == 404
@@ -290,12 +300,13 @@ def test_task_orders_form_step_five_confirm_signature(
def test_task_orders_form_step_five_confirm_signature_incomplete_to(
- client, user_session, task_order
+ client, user_session, incomplete_to
):
- user_session(task_order.portfolio.owner)
+ user_session(incomplete_to.portfolio.owner)
response = client.get(
url_for(
- "task_orders.form_step_five_confirm_signature", task_order_id=task_order.id
+ "task_orders.form_step_five_confirm_signature",
+ task_order_id=incomplete_to.id,
)
)
assert response.status_code == 404