Fake task order's expended funds, default task order start and end date to None, fix how task orders are sorted by status

This commit is contained in:
leigh-mil
2019-12-06 16:26:09 -05:00
parent 3fdde78531
commit ac8dd662d1
8 changed files with 51 additions and 27 deletions

View File

@@ -3,7 +3,7 @@
"files": "^.secrets.baseline$|^.*pgsslrootcert.yml$", "files": "^.secrets.baseline$|^.*pgsslrootcert.yml$",
"lines": null "lines": null
}, },
"generated_at": "2019-12-05T17:54:05Z", "generated_at": "2019-12-06T21:22:07Z",
"plugins_used": [ "plugins_used": [
{ {
"base64_limit": 4.5, "base64_limit": 4.5,
@@ -161,7 +161,7 @@
"hashed_secret": "e4f14805dfd1e6af030359090c535e149e6b4207", "hashed_secret": "e4f14805dfd1e6af030359090c535e149e6b4207",
"is_secret": false, "is_secret": false,
"is_verified": false, "is_verified": false,
"line_number": 31, "line_number": 41,
"type": "Hex High Entropy String" "type": "Hex High Entropy String"
} }
], ],

View File

@@ -67,10 +67,10 @@ class TaskOrders(BaseDomainClass):
def sort_by_status(cls, task_orders): def sort_by_status(cls, task_orders):
by_status = {} by_status = {}
for status in SORT_ORDERING: for status in SORT_ORDERING:
by_status[status] = [] by_status[status.value] = []
for task_order in task_orders: 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 return by_status

View File

@@ -1,10 +1,12 @@
from datetime import timedelta from datetime import timedelta
from enum import Enum from enum import Enum
import random
from sqlalchemy import Column, DateTime, ForeignKey, String from sqlalchemy import Column, DateTime, ForeignKey, String
from sqlalchemy.ext.hybrid import hybrid_property from sqlalchemy.ext.hybrid import hybrid_property
from sqlalchemy.orm import relationship from sqlalchemy.orm import relationship
from atst.domain.csp.reports import MockReportingProvider
from atst.models.base import Base from atst.models.base import Base
import atst.models.types as types import atst.models.types as types
import atst.models.mixins as mixins import atst.models.mixins as mixins
@@ -20,7 +22,13 @@ class Status(Enum):
UNSIGNED = "Not signed" 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): class TaskOrder(Base, mixins.TimestampsMixin):
@@ -126,12 +134,11 @@ class TaskOrder(Base, mixins.TimestampsMixin):
@property @property
def start_date(self): 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 @property
def end_date(self): def end_date(self):
default_end_date = self.start_date + timedelta(days=1) return max((c.end_date for c in self.clins), default=None)
return max((c.end_date for c in self.clins), default=default_end_date)
@property @property
def days_to_expiration(self): def days_to_expiration(self):
@@ -165,6 +172,12 @@ class TaskOrder(Base, mixins.TimestampsMixin):
# Faked for display purposes # Faked for display purposes
return 50 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 @property
def display_status(self): def display_status(self):
return self.status.value return self.status.value

View File

@@ -30,6 +30,4 @@ def portfolio_funding(portfolio_id):
portfolio = Portfolios.get(g.current_user, portfolio_id) portfolio = Portfolios.get(g.current_user, portfolio_id)
task_orders = TaskOrders.sort_by_status(portfolio.task_orders) task_orders = TaskOrders.sort_by_status(portfolio.task_orders)
# TODO: Get expended amount from the CSP # TODO: Get expended amount from the CSP
return render_template( return render_template("task_orders/index.html", task_orders=task_orders)
"task_orders/index.html", task_orders=task_orders
)

View File

@@ -47,7 +47,7 @@
</div> </div>
<div class="col col--grow"> <div class="col col--grow">
<h5>Total Expended</h5> <h5>Total Expended</h5>
<p>$0</p> <p>{{ task_order.invoiced_funds | dollars }}</p>
</div> </div>
</div> </div>
</div> </div>
@@ -72,7 +72,7 @@
{% if task_orders %} {% if task_orders %}
{% call AccordionList() %} {% call AccordionList() %}
{% for status, to_list in task_orders.items() %} {% for status, to_list in task_orders.items() %}
{{ TaskOrderList(to_list, status.value) }} {{ TaskOrderList(to_list, status) }}
{% endfor %} {% endfor %}
{% endcall %} {% endcall %}
{% else %} {% else %}

View File

@@ -148,9 +148,9 @@ def test_task_order_sort_by_status():
] ]
sorted_by_status = TaskOrders.sort_by_status(initial_to_list) sorted_by_status = TaskOrders.sort_by_status(initial_to_list)
assert len(sorted_by_status[Status.DRAFT]) == 3 assert len(sorted_by_status["Draft"]) == 3
assert len(sorted_by_status[Status.ACTIVE]) == 1 assert len(sorted_by_status["Active"]) == 1
assert len(sorted_by_status[Status.UPCOMING]) == 1 assert len(sorted_by_status["Upcoming"]) == 1
assert len(sorted_by_status[Status.EXPIRED]) == 2 assert len(sorted_by_status["Expired"]) == 2
assert len(sorted_by_status[Status.UNSIGNED]) == 1 assert len(sorted_by_status["Not signed"]) == 1
assert list(sorted_by_status.keys()) == SORT_ORDERING assert list(sorted_by_status.keys()) == [status.value for status in SORT_ORDERING]

View File

@@ -29,8 +29,10 @@ def task_order():
user = UserFactory.create() user = UserFactory.create()
portfolio = PortfolioFactory.create(owner=user) portfolio = PortfolioFactory.create(owner=user)
attachment = Attachment(filename="sample_attachment", object_name="sample") 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): def test_review_task_order_not_draft(client, user_session, task_order):

View File

@@ -19,6 +19,16 @@ def build_pdf_form_data(filename="sample.pdf", object_name=None):
def task_order(): def task_order():
user = UserFactory.create() user = UserFactory.create()
portfolio = PortfolioFactory.create(owner=user) 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) 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) 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) user_session(task_order.portfolio.owner)
form_data = { 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( 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( 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 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( 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( response = client.get(
url_for( 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 assert response.status_code == 404