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_review import RequestReview
|
||||
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 .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):
|
||||
body = {k: v for p in body.values() for k, v in p.items()}
|
||||
DATES = ["start_date", "date_latest_training"]
|
||||
@ -79,7 +74,10 @@ class Requests(object):
|
||||
@classmethod
|
||||
def update(cls, request_id, request_delta):
|
||||
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)
|
||||
revision = create_revision_from_request_body(new_body)
|
||||
request.revisions.append(revision)
|
||||
@ -183,7 +181,7 @@ class Requests(object):
|
||||
if task_order:
|
||||
request.task_order = task_order
|
||||
|
||||
request = Requests.update(request.id, {"financial_verification": delta})
|
||||
request = Requests._update(request, {"financial_verification": delta})
|
||||
|
||||
return request
|
||||
|
||||
|
@ -5,6 +5,7 @@ from atst.database import db
|
||||
from atst.models.task_order import TaskOrder, Source, FundingType
|
||||
from atst.models.attachment import Attachment
|
||||
from .exceptions import NotFoundError
|
||||
from atst.utils import drop, update_obj
|
||||
|
||||
|
||||
class TaskOrders(object):
|
||||
@ -38,7 +39,8 @@ class TaskOrders(object):
|
||||
|
||||
@classmethod
|
||||
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.commit()
|
||||
@ -75,3 +77,10 @@ class TaskOrders(object):
|
||||
return TaskOrders.create(
|
||||
**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.domain.task_orders import TaskOrders
|
||||
from atst.utils import getattr_path
|
||||
from atst.utils import getattr_path, update_obj
|
||||
|
||||
|
||||
def fv_extended(_http_request):
|
||||
@ -73,15 +73,33 @@ class FinancialVerificationBase(object):
|
||||
def _try_create_task_order(self, form, attachment):
|
||||
form_data = form.data
|
||||
|
||||
task_order_number = form_data.get("task_order_number")
|
||||
if task_order_number:
|
||||
task_order_number = form_data.pop("task_order_number")
|
||||
if task_order_number is None:
|
||||
return None
|
||||
|
||||
task_order_data = {
|
||||
k: v for (k, v) in form_data.items() if k in TaskOrders.TASK_ORDER_DATA
|
||||
}
|
||||
return TaskOrders.get_or_create(
|
||||
task_order_number, attachment=attachment, data=task_order_data
|
||||
)
|
||||
return None
|
||||
task_order_data["number"] = task_order_number
|
||||
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):
|
||||
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):
|
||||
_obj = obj
|
||||
for item in path.split("."):
|
||||
if isinstance(_obj, dict):
|
||||
_obj = _obj.get(item)
|
||||
else:
|
||||
_obj = getattr(_obj, item, default)
|
||||
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):
|
||||
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()
|
||||
|
||||
|
||||
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
|
||||
|
||||
|
||||
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():
|
||||
with pytest.raises(NotFoundError):
|
||||
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
|
||||
|
||||
|
||||
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):
|
||||
user = UserFactory.create()
|
||||
request = RequestFactory.create(creator=user)
|
||||
|
Loading…
x
Reference in New Issue
Block a user