diff --git a/atst/domain/requests.py b/atst/domain/requests.py index 23290085..fa122d71 100644 --- a/atst/domain/requests.py +++ b/atst/domain/requests.py @@ -1,4 +1,6 @@ +from enum import Enum from sqlalchemy import exists, and_, exc +from sqlalchemy.sql import text from sqlalchemy.orm.exc import NoResultFound from sqlalchemy.orm.attributes import flag_modified @@ -154,3 +156,43 @@ class Requests(object): @classmethod def is_pending_ccpo_approval(cls, request): return request.status == RequestStatus.PENDING_CCPO_APPROVAL + + @classmethod + def status_count(cls, status, creator=None): + if isinstance(status, Enum): + status = status.name + bindings = {"status": status} + raw = """ +SELECT count(requests_with_status.id) +FROM ( + SELECT DISTINCT ON (rse.request_id) r.*, rse.new_status as status + FROM request_status_events rse JOIN requests r ON r.id = rse.request_id + ORDER BY rse.request_id, rse.sequence DESC +) as requests_with_status +WHERE requests_with_status.status = :status + """ + + if creator: + raw += " AND requests_with_status.user_id = :user_id" + bindings["user_id"] = creator.id + + results = db.session.execute(text(raw), bindings).fetchone() + (count,) = results + return count + + @classmethod + def in_progress_count(cls): + return sum([ + Requests.status_count(RequestStatus.STARTED), + Requests.status_count(RequestStatus.PENDING_FINANCIAL_VERIFICATION), + Requests.status_count(RequestStatus.CHANGES_REQUESTED), + ]) + + @classmethod + def pending_ccpo_count(cls): + return Requests.status_count(RequestStatus.PENDING_CCPO_APPROVAL) + + @classmethod + def completed_count(cls): + return Requests.status_count(RequestStatus.APPROVED) + diff --git a/atst/models/request_status_event.py b/atst/models/request_status_event.py index 81505f2a..810a4427 100644 --- a/atst/models/request_status_event.py +++ b/atst/models/request_status_event.py @@ -12,9 +12,10 @@ class RequestStatus(Enum): STARTED = "Started" PENDING_FINANCIAL_VERIFICATION = "Pending Financial Verification" PENDING_CCPO_APPROVAL = "Pending CCPO Approval" + CHANGES_REQUESTED = "Changes Requested" APPROVED = "Approved" EXPIRED = "Expired" - DELETED = "Deleted" + CANCELED = "Canceled" class RequestStatusEvent(Base): diff --git a/atst/routes/requests/index.py b/atst/routes/requests/index.py index 7130c722..69da2058 100644 --- a/atst/routes/requests/index.py +++ b/atst/routes/requests/index.py @@ -32,22 +32,40 @@ def map_request(request): @requests_bp.route("/requests", methods=["GET"]) def requests_index(): - requests = [] - is_ccpo = Permissions.REVIEW_AND_APPROVE_JEDI_WORKSPACE_REQUEST in g.current_user.atat_permissions - if is_ccpo: - requests = Requests.get_many() - else: - requests = Requests.get_many(creator=g.current_user) + if Permissions.REVIEW_AND_APPROVE_JEDI_WORKSPACE_REQUEST in g.current_user.atat_permissions: + return _ccpo_view() + else: + return _non_ccpo_view() + + +def _ccpo_view(): + requests = Requests.get_many() mapped_requests = [map_request(r) for r in requests] - pending_fv = not is_ccpo and any(Requests.is_pending_financial_verification(r) for r in requests) - pending_ccpo = not is_ccpo and any(Requests.is_pending_ccpo_approval(r) for r in requests) + return render_template( + "requests.html", + requests=mapped_requests, + pending_financial_verification=False, + pending_ccpo_approval=False, + extended_view=True, + kpi_inprogress=Requests.in_progress_count(), + kpi_pending=Requests.pending_ccpo_count(), + kpi_completed=Requests.completed_count(), + ) + + +def _non_ccpo_view(): + requests = Requests.get_many(creator=g.current_user) + mapped_requests = [map_request(r) for r in requests] + + pending_fv = any(Requests.is_pending_financial_verification(r) for r in requests) + pending_ccpo = any(Requests.is_pending_ccpo_approval(r) for r in requests) return render_template( "requests.html", requests=mapped_requests, pending_financial_verification=pending_fv, pending_ccpo_approval=pending_ccpo, - extended_view=is_ccpo + extended_view=False, ) diff --git a/templates/requests.html b/templates/requests.html index 42d6ac1b..53950e10 100644 --- a/templates/requests.html +++ b/templates/requests.html @@ -51,16 +51,16 @@ {% if extended_view %}