Refactor FinVer to make room for draft feature

This commit is contained in:
richard-dds
2018-10-15 12:28:18 -04:00
parent ec8589fdbd
commit e72b980d94
8 changed files with 304 additions and 412 deletions

View File

@@ -4,89 +4,87 @@ from flask import request as http_request
from . import requests_bp
from atst.domain.requests import Requests
from atst.forms.financial import FinancialForm, ExtendedFinancialForm
from atst.forms.exceptions import FormValidationError
from atst.domain.requests.financial_verification import (
PENumberValidator,
TaskOrderNumberValidator,
)
class FinancialVerification:
def __init__(self, request, extended=False, post_data=None):
class UpdateFinancialVerification(object):
def __init__(
self,
pe_validator,
task_order_validator,
user,
request,
fv_data,
is_extended=False,
):
self.pe_validator = pe_validator
self.task_order_validator = task_order_validator
self.user = user
self.request = request
self._extended = extended
self._post_data = post_data
self._form = None
self.reset()
self.fv_data = fv_data
self.is_extended = is_extended
def reset(self):
self._updateable = False
self._valid = False
self.workspace = None
if self._form:
self._form.reset()
@property
def is_extended(self):
return self._extended or self.is_pending_changes
@property
def is_pending_changes(self):
return self.request.is_pending_financial_verification_changes
@property
def _task_order_data(self):
if self.request.task_order:
task_order = self.request.task_order
data = task_order.to_dictionary()
data["task_order_number"] = task_order.number
data["funding_type"] = task_order.funding_type.value
return data
def _get_form(self):
if self.is_extended:
return ExtendedFinancialForm(data=self.fv_data)
else:
return {}
return FinancialForm(data=self.fv_data)
@property
def _form_data(self):
if self._post_data:
return self._post_data
else:
form_data = self.request.body.get("financial_verification", {})
form_data.update(self._task_order_data)
def execute(self):
form = self._get_form()
return form_data
should_update = True
should_submit = True
updated_request = None
submitted = False
workspace = None
@property
def form(self):
if not self._form:
if self.is_extended:
self._form = ExtendedFinancialForm(data=self._form_data)
else:
self._form = FinancialForm(data=self._form_data)
if not form.validate():
should_update = False
return self._form
if not self.pe_validator.validate(self.request, form.pe_id):
suggestion = self.pe_validator.suggest_pe_id(form.pe_id.data)
error_str = (
"We couldn't find that PE number. {}"
"If you have double checked it you can submit anyway. "
"Your request will need to go through a manual review."
).format('Did you mean "{}"? '.format(suggestion) if suggestion else "")
form.pe_id.errors += (error_str,)
should_submit = False
def validate(self):
if self.form.validate():
self._updateable = True
self._valid = self.form.perform_extra_validation(
self.request.body.get("financial_verification")
if not self.task_order_validator.validate(form.task_order_number):
form.task_order_number.errors += ("Task Order number not found",)
should_submit = False
if should_update:
updated_request = Requests.update_financial_verification(
self.request.id, form.data
)
else:
self._updateable = False
self._valid = False
form.reset()
raise FormValidationError(form)
return self._valid
if should_submit:
updated_request = Requests.submit_financial_verification(updated_request)
if updated_request.is_financially_verified:
workspace = Requests.approve_and_create_workspace(updated_request)
submitted = True
else:
form.reset()
raise FormValidationError(form)
@property
def pending(self):
return self.request.is_pending_ccpo_approval
def finalize(self):
if self._updateable:
self.request = Requests.update_financial_verification(
self.request.id, self.form.data
)
if self._valid:
self.request = Requests.submit_financial_verification(self.request)
if self.request.is_financially_verified:
self.workspace = Requests.approve_and_create_workspace(self.request)
if submitted:
return {
"state": "submitted",
"workspace": workspace,
"request": updated_request,
}
else:
return {"state": "pending", "request": updated_request}
@requests_bp.route("/requests/verify/<string:request_id>", methods=["GET"])
@@ -106,29 +104,32 @@ def financial_verification(request_id):
@requests_bp.route("/requests/verify/<string:request_id>", methods=["POST"])
def update_financial_verification(request_id):
request = Requests.get(g.current_user, request_id)
finver = FinancialVerification(
request, extended=http_request.args.get("extended"), post_data=http_request.form
)
fv_data = http_request.form
is_extended = http_request.args.get("extended")
finver.validate()
finver.finalize()
if finver.workspace:
return redirect(
url_for(
"workspaces.new_project",
workspace_id=finver.workspace.id,
newWorkspace=True,
)
)
elif finver.pending:
return redirect(url_for("requests.requests_index", modal="pendingCCPOApproval"))
else:
finver.reset()
try:
response_context = UpdateFinancialVerification(
PENumberValidator(),
TaskOrderNumberValidator(),
g.current_user,
request,
fv_data,
is_extended=is_extended,
).execute()
except FormValidationError as e:
return render_template(
"requests/financial_verification.html",
jedi_request=finver.request,
f=finver.form,
extended=finver.is_extended,
jedi_request=request,
f=e.form,
extended=is_extended,
)
if response_context["state"] == "submitted":
workspace = response_context["workspace"]
return redirect(
url_for(
"workspaces.new_project", workspace_id=workspace.id, newWorkspace=True
)
)
elif response_context["state"] == "pending":
return redirect(url_for("requests.requests_index", modal="pendingCCPOApproval"))