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