Remember if finver form is extended
This commit is contained in:
parent
5d2b976e5f
commit
22cbca5951
28
alembic/versions/edf509c974f6_extended_fv.py
Normal file
28
alembic/versions/edf509c974f6_extended_fv.py
Normal 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 ###
|
@ -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
|
||||||
|
@ -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}
|
||||||
)
|
)
|
||||||
|
@ -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):
|
||||||
|
@ -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):
|
||||||
|
@ -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(
|
||||||
|
@ -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(
|
||||||
|
@ -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()
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user