Handle request status event transitions
This commit is contained in:
@@ -6,9 +6,11 @@ from atst.models.request_status_event import RequestStatusEvent, RequestStatus
|
||||
from atst.models.request_review import RequestReview
|
||||
from atst.models.request_internal_comment import RequestInternalComment
|
||||
from atst.utils import deep_merge
|
||||
from atst.queue import queue
|
||||
|
||||
from .query import RequestsQuery
|
||||
from .authorization import RequestsAuthorization
|
||||
from .status_event_handler import RequestStatusEventHandler
|
||||
|
||||
|
||||
def create_revision_from_request_body(body):
|
||||
@@ -95,11 +97,17 @@ class Requests(object):
|
||||
|
||||
@classmethod
|
||||
def set_status(cls, request, status: RequestStatus):
|
||||
old_status = request.status
|
||||
status_event = RequestStatusEvent(
|
||||
new_status=status, revision=request.latest_revision
|
||||
)
|
||||
request.status_events.append(status_event)
|
||||
return RequestsQuery.add_and_commit(request)
|
||||
updated_request = RequestsQuery.add_and_commit(request)
|
||||
RequestStatusEventHandler(queue).handle_status_change(
|
||||
updated_request, old_status, status
|
||||
)
|
||||
|
||||
return updated_request
|
||||
|
||||
@classmethod
|
||||
def should_auto_approve(cls, request):
|
||||
|
||||
41
atst/domain/requests/status_event_handler.py
Normal file
41
atst/domain/requests/status_event_handler.py
Normal file
@@ -0,0 +1,41 @@
|
||||
from flask import render_template
|
||||
|
||||
from atst.models.request_status_event import RequestStatus
|
||||
|
||||
|
||||
class RequestStatusEventHandler(object):
|
||||
def __init__(self, queue):
|
||||
self.queue = queue
|
||||
|
||||
def handle_status_change(self, request, old_status, new_status):
|
||||
handler = self._get_handler(old_status, new_status)
|
||||
if handler:
|
||||
handler(request)
|
||||
|
||||
def _get_handler(self, old_status, new_status):
|
||||
return {
|
||||
(
|
||||
RequestStatus.PENDING_CCPO_ACCEPTANCE,
|
||||
RequestStatus.PENDING_FINANCIAL_VERIFICATION,
|
||||
): self._send_email,
|
||||
(
|
||||
RequestStatus.PENDING_CCPO_ACCEPTANCE,
|
||||
RequestStatus.CHANGES_REQUESTED,
|
||||
): self._send_email,
|
||||
(
|
||||
RequestStatus.PENDING_CCPO_APPROVAL,
|
||||
RequestStatus.CHANGES_REQUESTED_TO_FINVER,
|
||||
): self._send_email,
|
||||
(
|
||||
RequestStatus.PENDING_CCPO_APPROVAL,
|
||||
RequestStatus.APPROVED,
|
||||
): self._send_email,
|
||||
}.get((old_status, new_status))
|
||||
|
||||
def _send_email(self, request):
|
||||
email_body = render_template(
|
||||
"emails/request_status_change.txt", request=request
|
||||
)
|
||||
self.queue.send_mail(
|
||||
[request.creator.email], "Your JEDI request status has changed", email_body
|
||||
)
|
||||
@@ -27,8 +27,8 @@ class ATSTQueue(RQ):
|
||||
# pylint: disable=pointless-string-statement
|
||||
"""Instance methods to queue up application-specific jobs."""
|
||||
|
||||
def send_mail(self, to, subject, body):
|
||||
self._queue_job(ATSTQueue._send_mail, to, subject, body)
|
||||
def send_mail(self, recipients, subject, body):
|
||||
self._queue_job(ATSTQueue._send_mail, recipients, subject, body)
|
||||
|
||||
# pylint: disable=pointless-string-statement
|
||||
"""Class methods to actually perform the work.
|
||||
@@ -38,8 +38,8 @@ class ATSTQueue(RQ):
|
||||
"""
|
||||
|
||||
@classmethod
|
||||
def _send_mail(self, to, subject, body):
|
||||
app.mailer.send(to, subject, body)
|
||||
def _send_mail(self, recipients, subject, body):
|
||||
app.mailer.send(recipients, subject, body)
|
||||
|
||||
|
||||
queue = ATSTQueue()
|
||||
|
||||
Reference in New Issue
Block a user