108 lines
3.9 KiB
Python
108 lines
3.9 KiB
Python
import pendulum
|
|
from flask import render_template, g, url_for
|
|
|
|
from . import requests_bp
|
|
from atst.domain.requests import Requests
|
|
from atst.models.permissions import Permissions
|
|
from atst.forms.data import SERVICE_BRANCHES
|
|
from atst.utils.flash import formatted_flash as flash
|
|
|
|
|
|
class RequestsIndex(object):
|
|
def __init__(self, user):
|
|
self.user = user
|
|
|
|
def execute(self):
|
|
if (
|
|
Permissions.REVIEW_AND_APPROVE_JEDI_PORTFOLIO_REQUEST
|
|
in self.user.atat_permissions
|
|
):
|
|
context = self._ccpo_view(self.user)
|
|
|
|
else:
|
|
context = self._non_ccpo_view(self.user)
|
|
|
|
return {
|
|
**context,
|
|
"possible_statuses": Requests.possible_statuses(),
|
|
"possible_dod_components": [b[0] for b in SERVICE_BRANCHES[1:]],
|
|
}
|
|
|
|
def _ccpo_view(self, user):
|
|
requests = Requests.get_many()
|
|
mapped_requests = [self._map_request(r, "ccpo") for r in requests]
|
|
num_action_required = len(
|
|
[r for r in mapped_requests if r.get("action_required")]
|
|
)
|
|
|
|
return {
|
|
"requests": mapped_requests,
|
|
"pending_financial_verification": False,
|
|
"pending_ccpo_acceptance": False,
|
|
"extended_view": True,
|
|
"kpi_inprogress": Requests.in_progress_count(),
|
|
"kpi_pending": Requests.pending_ccpo_count(),
|
|
"kpi_completed": Requests.completed_count(),
|
|
"num_action_required": num_action_required,
|
|
}
|
|
|
|
def _non_ccpo_view(self, user):
|
|
requests = Requests.get_many(creator=user)
|
|
mapped_requests = [self._map_request(r, "mission_owner") for r in requests]
|
|
num_action_required = len(
|
|
[r for r in mapped_requests if r.get("action_required")]
|
|
)
|
|
pending_fv = any(r.is_pending_financial_verification for r in requests)
|
|
pending_ccpo = any(r.is_pending_ccpo_acceptance for r in requests)
|
|
|
|
return {
|
|
"requests": mapped_requests,
|
|
"pending_financial_verification": pending_fv,
|
|
"pending_ccpo_acceptance": pending_ccpo,
|
|
"num_action_required": num_action_required,
|
|
"extended_view": False,
|
|
}
|
|
|
|
def _portfolio_link_for_request(self, request):
|
|
if request.is_approved:
|
|
return url_for(
|
|
"portfolios.portfolio_applications", portfolio_id=request.portfolio.id
|
|
)
|
|
else:
|
|
return None
|
|
|
|
def _map_request(self, request, viewing_role):
|
|
time_created = pendulum.instance(request.time_created)
|
|
is_new = time_created.add(days=1) > pendulum.now()
|
|
app_count = request.body.get("details_of_use", {}).get(
|
|
"num_software_systems", 0
|
|
)
|
|
annual_usage = request.annual_spend
|
|
|
|
return {
|
|
"portfolio_id": request.portfolio.id if request.portfolio else None,
|
|
"name": request.displayname,
|
|
"is_new": is_new,
|
|
"is_approved": request.is_approved,
|
|
"status": request.status_displayname,
|
|
"app_count": app_count,
|
|
"last_submission_timestamp": request.last_submission_timestamp,
|
|
"last_edited_timestamp": request.latest_revision.time_updated,
|
|
"full_name": request.creator.full_name,
|
|
"annual_usage": annual_usage,
|
|
"edit_link": url_for("requests.edit", request_id=request.id),
|
|
"action_required": request.action_required_by == viewing_role,
|
|
"dod_component": request.latest_revision.dod_component,
|
|
"portfolio_link": self._portfolio_link_for_request(request),
|
|
}
|
|
|
|
|
|
@requests_bp.route("/requests", methods=["GET"])
|
|
def requests_index():
|
|
context = RequestsIndex(g.current_user).execute()
|
|
|
|
if context.get("num_action_required"):
|
|
flash("requests_action_required", count=context.get("num_action_required"))
|
|
|
|
return render_template("requests/index.html", **context)
|