move task order concerns into that domain class
This commit is contained in:
parent
8aa6185c91
commit
f32a3eb90d
@ -5,7 +5,6 @@ from sqlalchemy.orm.exc import NoResultFound
|
|||||||
from sqlalchemy.orm.attributes import flag_modified
|
from sqlalchemy.orm.attributes import flag_modified
|
||||||
|
|
||||||
from atst.models.request import Request
|
from atst.models.request import Request
|
||||||
from atst.models.task_order import TaskOrder, Source as TaskOrderSource
|
|
||||||
from atst.models.request_status_event import RequestStatusEvent, RequestStatus
|
from atst.models.request_status_event import RequestStatusEvent, RequestStatus
|
||||||
from atst.domain.workspaces import Workspaces
|
from atst.domain.workspaces import Workspaces
|
||||||
from atst.database import db
|
from atst.database import db
|
||||||
@ -54,6 +53,7 @@ class Requests(object):
|
|||||||
and_(Request.id == request_id, Request.creator == creator)
|
and_(Request.id == request_id, Request.creator == creator)
|
||||||
)
|
)
|
||||||
).scalar()
|
).scalar()
|
||||||
|
|
||||||
except exc.DataError:
|
except exc.DataError:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@ -73,10 +73,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
|
||||||
|
|
||||||
@ -114,11 +113,11 @@ 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:
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -153,8 +152,10 @@ class Requests(object):
|
|||||||
return {
|
return {
|
||||||
RequestStatus.STARTED: "mission_owner",
|
RequestStatus.STARTED: "mission_owner",
|
||||||
RequestStatus.PENDING_FINANCIAL_VERIFICATION: "mission_owner",
|
RequestStatus.PENDING_FINANCIAL_VERIFICATION: "mission_owner",
|
||||||
RequestStatus.PENDING_CCPO_APPROVAL: "ccpo"
|
RequestStatus.PENDING_CCPO_APPROVAL: "ccpo",
|
||||||
}.get(request.status)
|
}.get(
|
||||||
|
request.status
|
||||||
|
)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def should_auto_approve(cls, request):
|
def should_auto_approve(cls, request):
|
||||||
@ -166,16 +167,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(
|
||||||
@ -215,11 +213,13 @@ WHERE requests_with_status.status = :status
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def in_progress_count(cls):
|
def in_progress_count(cls):
|
||||||
return sum([
|
return sum(
|
||||||
|
[
|
||||||
Requests.status_count(RequestStatus.STARTED),
|
Requests.status_count(RequestStatus.STARTED),
|
||||||
Requests.status_count(RequestStatus.PENDING_FINANCIAL_VERIFICATION),
|
Requests.status_count(RequestStatus.PENDING_FINANCIAL_VERIFICATION),
|
||||||
Requests.status_count(RequestStatus.CHANGES_REQUESTED),
|
Requests.status_count(RequestStatus.CHANGES_REQUESTED),
|
||||||
])
|
]
|
||||||
|
)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def pending_ccpo_count(cls):
|
def pending_ccpo_count(cls):
|
||||||
@ -229,8 +229,6 @@ WHERE requests_with_status.status = :status
|
|||||||
def completed_count(cls):
|
def completed_count(cls):
|
||||||
return Requests.status_count(RequestStatus.APPROVED)
|
return Requests.status_count(RequestStatus.APPROVED)
|
||||||
|
|
||||||
_TASK_ORDER_DATA = [col.name for col in TaskOrder.__table__.c if col.name != "id"]
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def update_financial_verification(cls, request_id, financial_data):
|
def update_financial_verification(cls, request_id, financial_data):
|
||||||
request = Requests._get_with_lock(request_id)
|
request = Requests._get_with_lock(request_id)
|
||||||
@ -238,31 +236,29 @@ WHERE requests_with_status.status = :status
|
|||||||
return
|
return
|
||||||
|
|
||||||
request_data = financial_data.copy()
|
request_data = financial_data.copy()
|
||||||
task_order_data = {k: request_data.pop(k) for (k,v) in financial_data.items() if k in Requests._TASK_ORDER_DATA}
|
task_order_data = {
|
||||||
|
k: request_data.pop(k)
|
||||||
|
for (k, v) in financial_data.items()
|
||||||
|
if k in TaskOrders.TASK_ORDER_DATA
|
||||||
|
}
|
||||||
task_order_number = request_data.pop("task_order_number")
|
task_order_number = request_data.pop("task_order_number")
|
||||||
|
|
||||||
task_order = Requests._get_or_create_task_order(task_order_number, task_order_data)
|
task_order = TaskOrders.get_or_create_task_order(
|
||||||
|
task_order_number, task_order_data
|
||||||
|
)
|
||||||
|
|
||||||
if task_order:
|
if task_order:
|
||||||
request.task_order = task_order
|
request.task_order = task_order
|
||||||
|
|
||||||
request = Requests._merge_body(request, {"financial_verification": request_data})
|
request = Requests._merge_body(
|
||||||
|
request, {"financial_verification": request_data}
|
||||||
|
)
|
||||||
|
|
||||||
db.session.add(request)
|
db.session.add(request)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
return request
|
return request
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def _get_or_create_task_order(cls, number, task_order_data=None):
|
|
||||||
if task_order_data:
|
|
||||||
return TaskOrders.create(**task_order_data, number=number, source=TaskOrderSource.MANUAL)
|
|
||||||
else:
|
|
||||||
try:
|
|
||||||
return TaskOrders.get(number)
|
|
||||||
except NotFoundError:
|
|
||||||
return
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def submit_financial_verification(cls, request_id):
|
def submit_financial_verification(cls, request_id):
|
||||||
request = Requests._get_with_lock(request_id)
|
request = Requests._get_with_lock(request_id)
|
||||||
@ -273,4 +269,3 @@ WHERE requests_with_status.status = :status
|
|||||||
|
|
||||||
db.session.add(request)
|
db.session.add(request)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@ from .exceptions import NotFoundError
|
|||||||
|
|
||||||
|
|
||||||
class TaskOrders(object):
|
class TaskOrders(object):
|
||||||
|
TASK_ORDER_DATA = [col.name for col in TaskOrder.__table__.c if col.name != "id"]
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get(cls, order_number):
|
def get(cls, order_number):
|
||||||
@ -28,6 +29,7 @@ class TaskOrders(object):
|
|||||||
if to_data:
|
if to_data:
|
||||||
# TODO: we need to determine exactly what we're getting and storing from the EDA client
|
# TODO: we need to determine exactly what we're getting and storing from the EDA client
|
||||||
return TaskOrders.create(number=to_data["contract_no"], source=Source.EDA)
|
return TaskOrders.create(number=to_data["contract_no"], source=Source.EDA)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
raise NotFoundError("task_order")
|
raise NotFoundError("task_order")
|
||||||
|
|
||||||
@ -43,3 +45,14 @@ class TaskOrders(object):
|
|||||||
@classmethod
|
@classmethod
|
||||||
def _client(cls):
|
def _client(cls):
|
||||||
return app.eda_client
|
return app.eda_client
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_or_create_task_order(cls, number, task_order_data=None):
|
||||||
|
try:
|
||||||
|
return TaskOrders.get(number)
|
||||||
|
|
||||||
|
except NotFoundError:
|
||||||
|
if task_order_data:
|
||||||
|
return TaskOrders.create(
|
||||||
|
**task_order_data, number=number, source=Source.MANUAL
|
||||||
|
)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user