Remember if finver form is extended

This commit is contained in:
richard-dds 2018-10-19 14:49:50 -04:00
parent 5d2b976e5f
commit 22cbca5951
9 changed files with 64 additions and 55 deletions

View File

@ -0,0 +1,28 @@
"""extended fv
Revision ID: edf509c974f6
Revises: 9c24c609878a
Create Date: 2018-10-19 14:06:45.396974
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'edf509c974f6'
down_revision = '9c24c609878a'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('request_revisions', sa.Column('extended', sa.Boolean(), nullable=True))
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column('request_revisions', 'extended')
# ### end Alembic commands ###

View File

@ -161,7 +161,7 @@ class Requests(object):
return Requests.status_count(RequestStatus.APPROVED) return Requests.status_count(RequestStatus.APPROVED)
@classmethod @classmethod
def update_financial_verification(cls, request_id, financial_data, task_order=None): def update_financial_verification(cls, request_id, financial_data, extended=False, task_order=None):
request = RequestsQuery.get_with_lock(request_id) request = RequestsQuery.get_with_lock(request_id)
# request_data = financial_data.copy() # request_data = financial_data.copy()
@ -201,6 +201,7 @@ class Requests(object):
], ],
financial_data, financial_data,
) )
delta = {**delta, "extended": extended}
if task_order: if task_order:
request.task_order = task_order request.task_order = task_order

View File

@ -182,4 +182,5 @@ class ExtendedFinancialForm(BaseFinancialForm):
FileAllowed(["pdf"], "Only PDF documents can be uploaded."), FileAllowed(["pdf"], "Only PDF documents can be uploaded."),
InputRequired(), InputRequired(),
], ],
render_kw={"required": False}
) )

View File

@ -1,26 +1,14 @@
from sqlalchemy import event from sqlalchemy import event
from flask import g from flask import g
import re
from atst.models.audit_event import AuditEvent from atst.models.audit_event import AuditEvent
from atst.utils import camel_to_snake, getattr_path
ACTION_CREATE = "create" ACTION_CREATE = "create"
ACTION_UPDATE = "update" ACTION_UPDATE = "update"
ACTION_DELETE = "delete" ACTION_DELETE = "delete"
def getattr_path(obj, path, default=None):
_obj = obj
for item in path.split("."):
_obj = getattr(_obj, item, default)
return _obj
def camel_to_snake(camel_cased):
s1 = re.sub("(.)([A-Z][a-z]+)", r"\1_\2", camel_cased)
return re.sub("([a-z0-9])([A-Z])", r"\1_\2", s1).lower()
class AuditableMixin(object): class AuditableMixin(object):
@staticmethod @staticmethod
def create_audit_event(connection, resource, action): def create_audit_event(connection, resource, action):

View File

@ -100,6 +100,7 @@ class Request(Base, mixins.TimestampsMixin, mixins.AuditableMixin):
"uii_ids", "uii_ids",
"treasury_code", "treasury_code",
"ba_code", "ba_code",
"extended"
] ]
@property @property
@ -135,7 +136,7 @@ class Request(Base, mixins.TimestampsMixin, mixins.AuditableMixin):
@property @property
def financial_verification(self): def financial_verification(self):
return self.body.get("financial_verification") return self.body.get("financial_verification", {})
@property @property
def is_financially_verified(self): def is_financially_verified(self):

View File

@ -77,6 +77,7 @@ class RequestRevision(Base, mixins.TimestampsMixin, mixins.AuditableMixin):
uii_ids = Column(ARRAY(String)) uii_ids = Column(ARRAY(String))
treasury_code = Column(String) treasury_code = Column(String)
ba_code = Column(String) ba_code = Column(String)
extended = Column(Boolean, default=False)
def __repr__(self): def __repr__(self):
return "<RequestRevision(request='{}', id='{}')>".format( return "<RequestRevision(request='{}', id='{}')>".format(

View File

@ -13,6 +13,11 @@ from atst.domain.requests.financial_verification import (
) )
from atst.models.attachment import Attachment from atst.models.attachment import Attachment
from atst.domain.task_orders import TaskOrders from atst.domain.task_orders import TaskOrders
from atst.utils import getattr_path
def fv_extended(_http_request):
return bool(_http_request.args.get("extended"))
class FinancialVerificationBase(object): class FinancialVerificationBase(object):
@ -24,7 +29,7 @@ class FinancialVerificationBase(object):
task_order_dict.update( task_order_dict.update(
{ {
"task_order_number": request.task_order.number, "task_order_number": request.task_order.number,
"funding_type": request.task_order.funding_type.value, "funding_type": getattr_path(request, "task_order.funding_type.value")
} }
) )
existing_fv_data = {**existing_fv_data, **task_order_dict} existing_fv_data = {**existing_fv_data, **task_order_dict}
@ -51,7 +56,10 @@ class FinancialVerificationBase(object):
form.task_order.data, "task_order", self.request.id form.task_order.data, "task_order", self.request.id
) )
elif isinstance(form.task_order.data, str): elif isinstance(form.task_order.data, str):
attachment = Attachment.get_for_resource("task_order", self.request.id) try:
attachment = Attachment.get_for_resource("task_order", self.request.id)
except NotFoundError:
pass
if attachment: if attachment:
form.task_order.data = attachment.id form.task_order.data = attachment.id
@ -139,7 +147,7 @@ class UpdateFinancialVerification(FinancialVerificationBase):
if should_update: if should_update:
task_order = self._try_create_task_order(form, attachment) task_order = self._try_create_task_order(form, attachment)
updated_request = Requests.update_financial_verification( updated_request = Requests.update_financial_verification(
self.request.id, form.data, task_order=task_order self.request.id, form.data, extended=self.is_extended, task_order=task_order
) )
if should_submit: if should_submit:
return Requests.submit_financial_verification(updated_request) return Requests.submit_financial_verification(updated_request)
@ -186,7 +194,7 @@ class SaveFinancialVerificationDraft(FinancialVerificationBase):
attachment = self._process_attachment(self.is_extended, form) attachment = self._process_attachment(self.is_extended, form)
task_order = self._try_create_task_order(form, attachment) task_order = self._try_create_task_order(form, attachment)
updated_request = Requests.update_financial_verification( updated_request = Requests.update_financial_verification(
self.request.id, form.data, task_order=task_order self.request.id, form.data, extended=self.is_extended, task_order=task_order
) )
if valid: if valid:
@ -198,7 +206,7 @@ class SaveFinancialVerificationDraft(FinancialVerificationBase):
@requests_bp.route("/requests/verify/<string:request_id>", methods=["GET"]) @requests_bp.route("/requests/verify/<string:request_id>", methods=["GET"])
def financial_verification(request_id): def financial_verification(request_id):
request = Requests.get(g.current_user, request_id) request = Requests.get(g.current_user, request_id)
is_extended = http_request.args.get("extended") is_extended = fv_extended(http_request) or request.financial_verification.get("extended", False)
form = GetFinancialVerificationForm( form = GetFinancialVerificationForm(
g.current_user, request, is_extended=is_extended g.current_user, request, is_extended=is_extended
@ -217,7 +225,7 @@ def financial_verification(request_id):
def update_financial_verification(request_id): def update_financial_verification(request_id):
request = Requests.get(g.current_user, request_id) request = Requests.get(g.current_user, request_id)
fv_data = {**http_request.form, **http_request.files} fv_data = {**http_request.form, **http_request.files}
is_extended = http_request.args.get("extended") is_extended = fv_extended(http_request)
try: try:
updated_request = UpdateFinancialVerification( updated_request = UpdateFinancialVerification(
@ -251,7 +259,7 @@ def update_financial_verification(request_id):
def save_financial_verification_draft(request_id): def save_financial_verification_draft(request_id):
request = Requests.get(g.current_user, request_id) request = Requests.get(g.current_user, request_id)
fv_data = {**http_request.form, **http_request.files} fv_data = {**http_request.form, **http_request.files}
is_extended = http_request.args.get("extended") is_extended = fv_extended(http_request)
try: try:
SaveFinancialVerificationDraft( SaveFinancialVerificationDraft(

View File

@ -1,3 +1,5 @@
import re
def first_or_none(predicate, lst): def first_or_none(predicate, lst):
return next((x for x in lst if predicate(x)), None) return next((x for x in lst if predicate(x)), None)
@ -18,3 +20,15 @@ def deep_merge(source, destination: dict):
return b return b
return _deep_merge(source, dict(destination)) return _deep_merge(source, dict(destination))
def getattr_path(obj, path, default=None):
_obj = obj
for item in path.split("."):
_obj = getattr(_obj, item, default)
return _obj
def camel_to_snake(camel_cased):
s1 = re.sub("(.)([A-Z][a-z]+)", r"\1_\2", camel_cased)
return re.sub("([a-z0-9])([A-Z])", r"\1_\2", s1).lower()

View File

@ -143,39 +143,6 @@ request_financial_data = {
} }
def test_update_financial_verification_without_task_order(
extended_financial_verification_data
):
request = RequestFactory.create()
financial_data = {**request_financial_data, **extended_financial_verification_data}
Requests.update_financial_verification(request.id, financial_data)
assert request.task_order
assert request.task_order.clin_0001 == int(
extended_financial_verification_data["clin_0001"]
)
assert request.task_order.source == TaskOrderSource.MANUAL
assert request.task_order.pdf
def test_update_financial_verification_with_task_order():
task_order = TaskOrderFactory.create(source=TaskOrderSource.EDA)
financial_data = {**request_financial_data, "task_order_number": task_order.number}
request = RequestFactory.create()
Requests.update_financial_verification(request.id, financial_data)
assert request.task_order == task_order
def test_update_financial_verification_with_invalid_task_order():
request = RequestFactory.create()
Requests.update_financial_verification(request.id, request_financial_data)
assert not request.task_order
assert "task_order_number" in request.body.get("financial_verification")
assert (
request.body["financial_verification"]["task_order_number"]
== request_financial_data["task_order_number"]
)
def test_set_status_sets_revision(): def test_set_status_sets_revision():
request = RequestFactory.create() request = RequestFactory.create()
Requests.set_status(request, RequestStatus.APPROVED) Requests.set_status(request, RequestStatus.APPROVED)