distinguish final CCPO approval from acceptance of initial request

This commit is contained in:
dandds 2018-09-10 10:28:44 -04:00
parent c123cdd6e9
commit c4e9971206
7 changed files with 32 additions and 25 deletions

View File

@ -76,10 +76,9 @@ class Requests(object):
filters.append(Request.creator == creator) filters.append(Request.creator == creator)
requests = ( requests = (
db.session.query(Request) db.session.query(Request).filter(*filters).order_by(
.filter(*filters) Request.time_created.desc()
.order_by(Request.time_created.desc()) ).all()
.all()
) )
return requests return requests
@ -91,7 +90,7 @@ class Requests(object):
if Requests.should_auto_approve(request): if Requests.should_auto_approve(request):
new_status = RequestStatus.PENDING_FINANCIAL_VERIFICATION new_status = RequestStatus.PENDING_FINANCIAL_VERIFICATION
else: else:
new_status = RequestStatus.PENDING_CCPO_APPROVAL new_status = RequestStatus.PENDING_CCPO_ACCEPTANCE
request = Requests.set_status(request, new_status) request = Requests.set_status(request, new_status)
@ -119,10 +118,9 @@ class Requests(object):
# Query for request matching id, acquiring a row-level write lock. # Query for request matching id, acquiring a row-level write lock.
# https://www.postgresql.org/docs/10/static/sql-select.html#SQL-FOR-UPDATE-SHARE # https://www.postgresql.org/docs/10/static/sql-select.html#SQL-FOR-UPDATE-SHARE
return ( return (
db.session.query(Request) db.session.query(Request).filter_by(id=request_id).with_for_update(
.filter_by(id=request_id) of=Request
.with_for_update(of=Request) ).one()
.one()
) )
except NoResultFound: except NoResultFound:
@ -156,16 +154,13 @@ class Requests(object):
return dollar_value < cls.AUTO_APPROVE_THRESHOLD return dollar_value < cls.AUTO_APPROVE_THRESHOLD
_VALID_SUBMISSION_STATUSES = [ _VALID_SUBMISSION_STATUSES = [
RequestStatus.STARTED, RequestStatus.STARTED, RequestStatus.CHANGES_REQUESTED
RequestStatus.CHANGES_REQUESTED,
] ]
@classmethod @classmethod
def should_allow_submission(cls, request): def should_allow_submission(cls, request):
all_request_sections = [ all_request_sections = [
"details_of_use", "details_of_use", "information_about_you", "primary_poc"
"information_about_you",
"primary_poc",
] ]
existing_request_sections = request.body.keys() existing_request_sections = request.body.keys()
return request.status in Requests._VALID_SUBMISSION_STATUSES and all( return request.status in Requests._VALID_SUBMISSION_STATUSES and all(
@ -176,6 +171,10 @@ class Requests(object):
def is_pending_financial_verification(cls, request): def is_pending_financial_verification(cls, request):
return request.status == RequestStatus.PENDING_FINANCIAL_VERIFICATION return request.status == RequestStatus.PENDING_FINANCIAL_VERIFICATION
@classmethod
def is_pending_ccpo_acceptance(cls, request):
return request.status == RequestStatus.PENDING_CCPO_ACCEPTANCE
@classmethod @classmethod
def is_pending_ccpo_approval(cls, request): def is_pending_ccpo_approval(cls, request):
return request.status == RequestStatus.PENDING_CCPO_APPROVAL return request.status == RequestStatus.PENDING_CCPO_APPROVAL
@ -215,7 +214,12 @@ WHERE requests_with_status.status = :status
@classmethod @classmethod
def pending_ccpo_count(cls): def pending_ccpo_count(cls):
return Requests.status_count(RequestStatus.PENDING_CCPO_APPROVAL) return sum(
[
Requests.status_count(RequestStatus.PENDING_CCPO_ACCEPTANCE),
Requests.status_count(RequestStatus.PENDING_CCPO_APPROVAL),
]
)
@classmethod @classmethod
def completed_count(cls): def completed_count(cls):
@ -237,8 +241,9 @@ WHERE requests_with_status.status = :status
else: else:
task_order_number = request_data.get("task_order_number") task_order_number = request_data.get("task_order_number")
if "task_order" in request_data and isinstance( if (
request_data["task_order"], FileStorage "task_order" in request_data
and isinstance(request_data["task_order"], FileStorage)
): ):
task_order_data["pdf"] = request_data.pop("task_order") task_order_data["pdf"] = request_data.pop("task_order")

View File

@ -157,6 +157,7 @@ class Request(Base):
return { return {
RequestStatus.PENDING_FINANCIAL_VERIFICATION: "mission_owner", RequestStatus.PENDING_FINANCIAL_VERIFICATION: "mission_owner",
RequestStatus.PENDING_CCPO_APPROVAL: "ccpo", RequestStatus.PENDING_CCPO_APPROVAL: "ccpo",
RequestStatus.PENDING_CCPO_ACCEPTANCE: "ccpo",
}.get(self.status) }.get(self.status)
@property @property

View File

@ -13,6 +13,7 @@ class RequestStatus(Enum):
STARTED = "Started" STARTED = "Started"
SUBMITTED = "Submitted" SUBMITTED = "Submitted"
PENDING_FINANCIAL_VERIFICATION = "Pending Financial Verification" PENDING_FINANCIAL_VERIFICATION = "Pending Financial Verification"
PENDING_CCPO_ACCEPTANCE = "Pending CCPO Acceptance"
PENDING_CCPO_APPROVAL = "Pending CCPO Approval" PENDING_CCPO_APPROVAL = "Pending CCPO Approval"
CHANGES_REQUESTED = "Changes Requested" CHANGES_REQUESTED = "Changes Requested"
APPROVED = "Approved" APPROVED = "Approved"

View File

@ -30,7 +30,7 @@ class RequestsIndex(object):
return { return {
"requests": mapped_requests, "requests": mapped_requests,
"pending_financial_verification": False, "pending_financial_verification": False,
"pending_ccpo_approval": False, "pending_ccpo_acceptance": False,
"extended_view": True, "extended_view": True,
"kpi_inprogress": Requests.in_progress_count(), "kpi_inprogress": Requests.in_progress_count(),
"kpi_pending": Requests.pending_ccpo_count(), "kpi_pending": Requests.pending_ccpo_count(),
@ -47,12 +47,12 @@ class RequestsIndex(object):
pending_fv = any( pending_fv = any(
Requests.is_pending_financial_verification(r) for r in requests Requests.is_pending_financial_verification(r) for r in requests
) )
pending_ccpo = any(Requests.is_pending_ccpo_approval(r) for r in requests) pending_ccpo = any(Requests.is_pending_ccpo_acceptance(r) for r in requests)
return { return {
"requests": mapped_requests, "requests": mapped_requests,
"pending_financial_verification": pending_fv, "pending_financial_verification": pending_fv,
"pending_ccpo_approval": pending_ccpo, "pending_ccpo_acceptance": pending_ccpo,
"num_action_required": num_action_required, "num_action_required": num_action_required,
"extended_view": False, "extended_view": False,
} }
@ -76,7 +76,7 @@ class RequestsIndex(object):
edit_link = url_for( edit_link = url_for(
"requests.financial_verification", request_id=request.id "requests.financial_verification", request_id=request.id
) )
elif Requests.is_pending_ccpo_approval(request): elif Requests.is_pending_ccpo_acceptance(request) or Requests.is_pending_ccpo_approval(request):
edit_link = url_for("requests.view_pending_request", request_id=request.id) edit_link = url_for("requests.view_pending_request", request_id=request.id)
else: else:
edit_link = url_for( edit_link = url_for(

View File

@ -51,14 +51,14 @@ def test_dont_auto_approve_if_dollar_value_is_1m_or_above():
new_request = RequestFactory.create(initial_revision={"dollar_value": 1000000}) new_request = RequestFactory.create(initial_revision={"dollar_value": 1000000})
request = Requests.submit(new_request) request = Requests.submit(new_request)
assert request.status == RequestStatus.PENDING_CCPO_APPROVAL assert request.status == RequestStatus.PENDING_CCPO_ACCEPTANCE
def test_dont_auto_approve_if_no_dollar_value_specified(): def test_dont_auto_approve_if_no_dollar_value_specified():
new_request = RequestFactory.create(initial_revision={}) new_request = RequestFactory.create(initial_revision={})
request = Requests.submit(new_request) request = Requests.submit(new_request)
assert request.status == RequestStatus.PENDING_CCPO_APPROVAL assert request.status == RequestStatus.PENDING_CCPO_ACCEPTANCE
def test_should_allow_submission(): def test_should_allow_submission():

View File

@ -71,4 +71,4 @@ def test_can_submit_request_approval(client, user_session):
response = client.post( response = client.post(
url_for("requests.submit_approval", request_id=request.id), data=review_data url_for("requests.submit_approval", request_id=request.id), data=review_data
) )
assert response.status_code == 301 assert response.status_code == 302

View File

@ -81,4 +81,4 @@ def test_stepthrough_request_form(user_session, screens, client):
) )
finished_request = Requests.get(user, req_id) finished_request = Requests.get(user, req_id)
assert finished_request.status == RequestStatus.PENDING_CCPO_APPROVAL assert finished_request.status == RequestStatus.PENDING_CCPO_ACCEPTANCE