distinguish final CCPO approval from acceptance of initial request
This commit is contained in:
parent
c123cdd6e9
commit
c4e9971206
@ -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")
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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"
|
||||||
|
@ -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(
|
||||||
|
@ -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():
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user