diff --git a/atst/domain/task_orders.py b/atst/domain/task_orders.py index b3206b35..a433965e 100644 --- a/atst/domain/task_orders.py +++ b/atst/domain/task_orders.py @@ -2,7 +2,7 @@ from flask import current_app as app from atst.database import db from atst.models.clin import CLIN -from atst.models.task_order import TaskOrder +from atst.models.task_order import TaskOrder, SORT_ORDERING from . import BaseDomainClass @@ -98,3 +98,10 @@ class TaskOrders(BaseDomainClass): if not app.config.get("CLASSIFIED"): section_list["funding"] = TaskOrders.UNCLASSIFIED_FUNDING return section_list + + @classmethod + def sort(cls, task_orders: [TaskOrder]) -> [TaskOrder]: + # Sorts a list of task orders on two keys: status (primary) and time_created (secondary) + by_time_created = sorted(task_orders, key=lambda to: to.time_created) + by_status = sorted(by_time_created, key=lambda to: SORT_ORDERING.get(to.status)) + return by_status diff --git a/atst/models/task_order.py b/atst/models/task_order.py index fce8fdfb..eda19ce1 100644 --- a/atst/models/task_order.py +++ b/atst/models/task_order.py @@ -18,6 +18,14 @@ class Status(Enum): UNSIGNED = "Unsigned" +SORT_ORDERING = { + status: order + for (order, status) in enumerate( + [Status.DRAFT, Status.ACTIVE, Status.UPCOMING, Status.EXPIRED, Status.UNSIGNED] + ) +} + + class TaskOrder(Base, mixins.TimestampsMixin): __tablename__ = "task_orders" diff --git a/atst/routes/task_orders/index.py b/atst/routes/task_orders/index.py index 544db001..1c85dab4 100644 --- a/atst/routes/task_orders/index.py +++ b/atst/routes/task_orders/index.py @@ -1,5 +1,3 @@ -from collections import defaultdict - from flask import g, render_template from . import task_orders_bp @@ -7,7 +5,6 @@ from atst.domain.authz.decorator import user_can_access_decorator as user_can from atst.domain.portfolios import Portfolios from atst.domain.task_orders import TaskOrders from atst.models import Permissions -from atst.models.task_order import Status as TaskOrderStatus @task_orders_bp.route("/task_orders/") @@ -34,7 +31,5 @@ def review_task_order(task_order_id): @user_can(Permissions.VIEW_PORTFOLIO_FUNDING, message="view portfolio funding") def portfolio_funding(portfolio_id): portfolio = Portfolios.get(g.current_user, portfolio_id) - - return render_template( - "portfolios/task_orders/index.html", task_orders=portfolio.task_orders - ) + task_orders = TaskOrders.sort(portfolio.task_orders) + return render_template("portfolios/task_orders/index.html", task_orders=task_orders) diff --git a/script/seed_sample.py b/script/seed_sample.py index d499de69..8fced973 100644 --- a/script/seed_sample.py +++ b/script/seed_sample.py @@ -174,7 +174,9 @@ def add_task_orders_to_portfolio(portfolio): clins = [ CLINFactory.build(task_order=unsigned_to, start_date=today, end_date=today), CLINFactory.build(task_order=upcoming_to, start_date=future, end_date=future), - CLINFactory.build(task_order=expired_to, start_date=yesterday, end_date=yesterday), + CLINFactory.build( + task_order=expired_to, start_date=yesterday, end_date=yesterday + ), CLINFactory.build(task_order=active_to, start_date=yesterday, end_date=future), ]