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:
@@ -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"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
|
||||||
)
|
|
||||||
|
@@ -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 %}
|
||||||
|
@@ -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]
|
||||||
|
@@ -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):
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user