Fix task order creation
This commit is contained in:
parent
a1735874e6
commit
39bbfb745a
@ -5,17 +5,12 @@ from atst.models.request_revision import RequestRevision
|
|||||||
from atst.models.request_status_event import RequestStatusEvent, RequestStatus
|
from atst.models.request_status_event import RequestStatusEvent, RequestStatus
|
||||||
from atst.models.request_review import RequestReview
|
from atst.models.request_review import RequestReview
|
||||||
from atst.models.request_internal_comment import RequestInternalComment
|
from atst.models.request_internal_comment import RequestInternalComment
|
||||||
from atst.utils import deep_merge
|
from atst.utils import deep_merge, pick
|
||||||
|
|
||||||
from .query import RequestsQuery
|
from .query import RequestsQuery
|
||||||
from .authorization import RequestsAuthorization
|
from .authorization import RequestsAuthorization
|
||||||
|
|
||||||
|
|
||||||
def pick(keys, d):
|
|
||||||
_keys = set(keys)
|
|
||||||
return {k: v for (k, v) in d.items() if k in _keys}
|
|
||||||
|
|
||||||
|
|
||||||
def create_revision_from_request_body(body):
|
def create_revision_from_request_body(body):
|
||||||
body = {k: v for p in body.values() for k, v in p.items()}
|
body = {k: v for p in body.values() for k, v in p.items()}
|
||||||
DATES = ["start_date", "date_latest_training"]
|
DATES = ["start_date", "date_latest_training"]
|
||||||
@ -79,7 +74,10 @@ class Requests(object):
|
|||||||
@classmethod
|
@classmethod
|
||||||
def update(cls, request_id, request_delta):
|
def update(cls, request_id, request_delta):
|
||||||
request = RequestsQuery.get_with_lock(request_id)
|
request = RequestsQuery.get_with_lock(request_id)
|
||||||
|
return Requests._update(request, request_delta)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _update(cls, request, request_delta):
|
||||||
new_body = deep_merge(request_delta, request.body)
|
new_body = deep_merge(request_delta, request.body)
|
||||||
revision = create_revision_from_request_body(new_body)
|
revision = create_revision_from_request_body(new_body)
|
||||||
request.revisions.append(revision)
|
request.revisions.append(revision)
|
||||||
@ -183,7 +181,7 @@ class Requests(object):
|
|||||||
if task_order:
|
if task_order:
|
||||||
request.task_order = task_order
|
request.task_order = task_order
|
||||||
|
|
||||||
request = Requests.update(request.id, {"financial_verification": delta})
|
request = Requests._update(request, {"financial_verification": delta})
|
||||||
|
|
||||||
return request
|
return request
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@ from atst.database import db
|
|||||||
from atst.models.task_order import TaskOrder, Source, FundingType
|
from atst.models.task_order import TaskOrder, Source, FundingType
|
||||||
from atst.models.attachment import Attachment
|
from atst.models.attachment import Attachment
|
||||||
from .exceptions import NotFoundError
|
from .exceptions import NotFoundError
|
||||||
|
from atst.utils import drop, update_obj
|
||||||
|
|
||||||
|
|
||||||
class TaskOrders(object):
|
class TaskOrders(object):
|
||||||
@ -38,7 +39,8 @@ class TaskOrders(object):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def create(cls, **kwargs):
|
def create(cls, **kwargs):
|
||||||
task_order = TaskOrder(**kwargs)
|
to_data = drop(["source"], kwargs)
|
||||||
|
task_order = TaskOrder(source=Source.MANUAL, **to_data)
|
||||||
|
|
||||||
db.session.add(task_order)
|
db.session.add(task_order)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
@ -75,3 +77,10 @@ class TaskOrders(object):
|
|||||||
return TaskOrders.create(
|
return TaskOrders.create(
|
||||||
**data, number=number, pdf=attachment, source=Source.MANUAL
|
**data, number=number, pdf=attachment, source=Source.MANUAL
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def update(cls, task_order, dct):
|
||||||
|
updated = update_obj(task_order, dct)
|
||||||
|
db.session.add(updated)
|
||||||
|
db.session.commit()
|
||||||
|
return updated
|
||||||
|
@ -13,7 +13,7 @@ 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
|
from atst.utils import getattr_path, update_obj
|
||||||
|
|
||||||
|
|
||||||
def fv_extended(_http_request):
|
def fv_extended(_http_request):
|
||||||
@ -73,15 +73,33 @@ class FinancialVerificationBase(object):
|
|||||||
def _try_create_task_order(self, form, attachment):
|
def _try_create_task_order(self, form, attachment):
|
||||||
form_data = form.data
|
form_data = form.data
|
||||||
|
|
||||||
task_order_number = form_data.get("task_order_number")
|
task_order_number = form_data.pop("task_order_number")
|
||||||
if task_order_number:
|
if task_order_number is None:
|
||||||
task_order_data = {
|
return None
|
||||||
k: v for (k, v) in form_data.items() if k in TaskOrders.TASK_ORDER_DATA
|
|
||||||
}
|
task_order_data = {
|
||||||
return TaskOrders.get_or_create(
|
k: v for (k, v) in form_data.items() if k in TaskOrders.TASK_ORDER_DATA
|
||||||
task_order_number, attachment=attachment, data=task_order_data
|
}
|
||||||
)
|
task_order_data["number"] = task_order_number
|
||||||
return None
|
funding_type = getattr_path(form_data, "funding_type.data")
|
||||||
|
task_order_data["funding_type"] = funding_type if funding_type != "" else None
|
||||||
|
|
||||||
|
if attachment:
|
||||||
|
task_order_data["pdf"] = attachment
|
||||||
|
|
||||||
|
try:
|
||||||
|
task_order = TaskOrders.get(task_order_number)
|
||||||
|
task_order = TaskOrders.update(task_order, task_order_data)
|
||||||
|
return task_order
|
||||||
|
except NotFoundError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
try:
|
||||||
|
return TaskOrders._get_from_eda(task_order_number)
|
||||||
|
except NotFoundError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
return TaskOrders.create(**task_order_data)
|
||||||
|
|
||||||
def _apply_pe_number_error(self, field):
|
def _apply_pe_number_error(self, field):
|
||||||
suggestion = self.pe_validator.suggest_pe_id(field.data)
|
suggestion = self.pe_validator.suggest_pe_id(field.data)
|
||||||
|
@ -26,10 +26,30 @@ def deep_merge(source, destination: dict):
|
|||||||
def getattr_path(obj, path, default=None):
|
def getattr_path(obj, path, default=None):
|
||||||
_obj = obj
|
_obj = obj
|
||||||
for item in path.split("."):
|
for item in path.split("."):
|
||||||
_obj = getattr(_obj, item, default)
|
if isinstance(_obj, dict):
|
||||||
|
_obj = _obj.get(item)
|
||||||
|
else:
|
||||||
|
_obj = getattr(_obj, item, default)
|
||||||
return _obj
|
return _obj
|
||||||
|
|
||||||
|
|
||||||
|
def update_obj(obj, dct):
|
||||||
|
for k, v in dct.items():
|
||||||
|
if hasattr(obj, k) and v is not None:
|
||||||
|
setattr(obj, k, v)
|
||||||
|
return obj
|
||||||
|
|
||||||
|
|
||||||
def camel_to_snake(camel_cased):
|
def camel_to_snake(camel_cased):
|
||||||
s1 = re.sub("(.)([A-Z][a-z]+)", r"\1_\2", 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()
|
return re.sub("([a-z0-9])([A-Z])", r"\1_\2", s1).lower()
|
||||||
|
|
||||||
|
|
||||||
|
def drop(keys, dct):
|
||||||
|
_keys = set(keys)
|
||||||
|
return {k: v for k, v in dct.items() if k not in _keys}
|
||||||
|
|
||||||
|
|
||||||
|
def pick(keys, dct):
|
||||||
|
_keys = set(keys)
|
||||||
|
return {k: v for (k, v) in dct.items() if k in _keys}
|
||||||
|
@ -15,16 +15,6 @@ def test_can_get_task_order():
|
|||||||
assert to.id == to.id
|
assert to.id == to.id
|
||||||
|
|
||||||
|
|
||||||
def test_can_get_task_order_from_eda(monkeypatch):
|
|
||||||
monkeypatch.setattr(
|
|
||||||
"atst.domain.task_orders.TaskOrders._client", lambda: MockEDAClient()
|
|
||||||
)
|
|
||||||
to = TaskOrders.get(MockEDAClient.MOCK_CONTRACT_NUMBER)
|
|
||||||
|
|
||||||
assert to.number == MockEDAClient.MOCK_CONTRACT_NUMBER
|
|
||||||
assert to.source == TaskOrderSource.EDA
|
|
||||||
|
|
||||||
|
|
||||||
def test_nonexistent_task_order_raises_without_client():
|
def test_nonexistent_task_order_raises_without_client():
|
||||||
with pytest.raises(NotFoundError):
|
with pytest.raises(NotFoundError):
|
||||||
TaskOrders.get("some fake number")
|
TaskOrders.get("some fake number")
|
||||||
|
@ -226,6 +226,23 @@ def test_can_save_draft_with_just_pdf(extended_financial_verification_data):
|
|||||||
assert form.task_order
|
assert form.task_order
|
||||||
|
|
||||||
|
|
||||||
|
def test_task_order_info_present_in_extended_form(
|
||||||
|
fv_data, extended_financial_verification_data
|
||||||
|
):
|
||||||
|
request = RequestFactory.create()
|
||||||
|
user = UserFactory.create()
|
||||||
|
data = {
|
||||||
|
"clin_0001": extended_financial_verification_data["clin_0001"],
|
||||||
|
"task_order_number": fv_data["task_order_number"],
|
||||||
|
}
|
||||||
|
SaveFinancialVerificationDraft(
|
||||||
|
TrueValidator, TrueValidator, user, request, data, is_extended=True
|
||||||
|
).execute()
|
||||||
|
|
||||||
|
form = GetFinancialVerificationForm(user, request, is_extended=True).execute()
|
||||||
|
assert form.clin_0001.data
|
||||||
|
|
||||||
|
|
||||||
def test_update_fv_route(client, user_session, fv_data):
|
def test_update_fv_route(client, user_session, fv_data):
|
||||||
user = UserFactory.create()
|
user = UserFactory.create()
|
||||||
request = RequestFactory.create(creator=user)
|
request = RequestFactory.create(creator=user)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user