Merge pull request #139 from dod-ccpo/request-status-names

Update request status names to reflect document
This commit is contained in:
richard-dds
2018-08-08 13:43:29 -04:00
committed by GitHub
8 changed files with 125 additions and 34 deletions

View File

@@ -2,7 +2,8 @@ from sqlalchemy import exists, and_
from sqlalchemy.orm.exc import NoResultFound
from sqlalchemy.orm.attributes import flag_modified
from atst.models import Request, RequestStatusEvent
from atst.models.request import Request
from atst.models.request_status_event import RequestStatusEvent, RequestStatus
from atst.database import db
from .exceptions import NotFoundError
@@ -32,9 +33,7 @@ class Requests(object):
@classmethod
def create(cls, creator_id, body):
request = Request(creator=creator_id, body=body)
status_event = RequestStatusEvent(new_status="incomplete")
request.status_events.append(status_event)
request = Requests.set_status(request, RequestStatus.STARTED)
db.session.add(request)
db.session.commit()
@@ -74,10 +73,13 @@ class Requests(object):
@classmethod
def submit(cls, request):
request.status_events.append(RequestStatusEvent(new_status="submitted"))
new_status = None
if Requests.should_auto_approve(request):
request.status_events.append(RequestStatusEvent(new_status="approved"))
new_status = RequestStatus.PENDING_FINANCIAL_VERIFICATION
else:
new_status = RequestStatus.PENDING_CCPO_APPROVAL
request = Requests.set_status(request, new_status)
db.session.add(request)
db.session.commit()
@@ -100,11 +102,6 @@ class Requests(object):
request.body = deep_merge(request_delta, request.body)
if Requests.should_allow_submission(request):
request.status_events.append(
RequestStatusEvent(new_status="pending_submission")
)
# Without this, sqlalchemy won't notice the change to request.body,
# since it doesn't track dictionary mutations by default.
flag_modified(request, "body")
@@ -112,6 +109,20 @@ class Requests(object):
db.session.add(request)
db.session.commit()
@classmethod
def set_status(cls, request: Request, status: RequestStatus):
status_event = RequestStatusEvent(new_status=status)
request.status_events.append(status_event)
return request
@classmethod
def action_required_by(cls, request):
return {
RequestStatus.STARTED: "mission_owner",
RequestStatus.PENDING_FINANCIAL_VERIFICATION: "mission_owner",
RequestStatus.PENDING_CCPO_APPROVAL: "ccpo"
}.get(request.status)
@classmethod
def should_auto_approve(cls, request):
try:

View File

@@ -21,12 +21,3 @@ class Request(Base):
@property
def status(self):
return self.status_events[-1].new_status
@property
def action_required_by(self):
return {
"incomplete": "mission_owner",
"pending_submission": "mission_owner",
"submitted": "ccpo",
"approved": "mission_owner",
}.get(self.status)

View File

@@ -1,5 +1,6 @@
from sqlalchemy import Column, func, ForeignKey
from sqlalchemy.types import DateTime, String, BigInteger
from enum import Enum
from sqlalchemy import Column, func, ForeignKey, Enum as SQLAEnum
from sqlalchemy.types import DateTime, BigInteger
from sqlalchemy.schema import Sequence
from sqlalchemy.dialects.postgresql import UUID
@@ -7,11 +8,20 @@ from atst.models import Base
from atst.models.types import Id
class RequestStatus(Enum):
STARTED = "started"
PENDING_FINANCIAL_VERIFICATION = "pending_financial_verification"
PENDING_CCPO_APPROVAL = "pending_ccpo_approval"
APPROVED = "approved"
EXPIRED = "expired"
DELETED = "deleted"
class RequestStatusEvent(Base):
__tablename__ = "request_status_events"
id = Id()
new_status = Column(String())
new_status = Column(SQLAEnum(RequestStatus))
time_created = Column(DateTime(timezone=True), server_default=func.now())
request_id = Column(
UUID(as_uuid=True), ForeignKey("requests.id", ondelete="CASCADE")