@@ -29,7 +29,7 @@ class TaskOrders(object):
|
||||
to_data = TaskOrders._client().get_contract(order_number, status="y")
|
||||
if to_data:
|
||||
# TODO: we need to determine exactly what we're getting and storing from the EDA client
|
||||
return TaskOrders.create(number=to_data["contract_no"], source=Source.EDA)
|
||||
return TaskOrders.create(source=Source.EDA, **to_data)
|
||||
|
||||
else:
|
||||
raise NotFoundError("task_order")
|
||||
|
@@ -5,6 +5,42 @@ import requests
|
||||
from requests.auth import HTTPBasicAuth
|
||||
|
||||
|
||||
def parse_eda_xml(xml_string):
|
||||
contract_et = ET.fromstring(xml_string)
|
||||
handler = EDAXMLHandler(contract_et)
|
||||
handler.parse()
|
||||
return {
|
||||
"clin_0001": handler.clins.get("0001"),
|
||||
"clin_0003": handler.clins.get("0003"),
|
||||
"clin_1001": handler.clins.get("1001"),
|
||||
"clin_1003": handler.clins.get("1003"),
|
||||
"clin_2001": handler.clins.get("2001"),
|
||||
"clin_2003": handler.clins.get("2003"),
|
||||
}
|
||||
|
||||
|
||||
class EDAXMLHandler:
|
||||
def __init__(self, element_tree):
|
||||
self.element_tree = element_tree
|
||||
self.clins = {}
|
||||
|
||||
@property
|
||||
def _line_items(self):
|
||||
return self.element_tree.findall(".//LineItem[LineItemType='CLIN']/../../..")
|
||||
|
||||
def parse(self):
|
||||
for line_item in self._line_items:
|
||||
number_el = line_item.find(".//LineItemBase")
|
||||
amount_details = line_item.find(
|
||||
".//ItemOtherAmounts[AmountDescription='Not to Exceed Amount (Funding)']/Amount"
|
||||
)
|
||||
if number_el is not None and amount_details is not None:
|
||||
try:
|
||||
self.clins[number_el.text] = float(amount_details.text)
|
||||
except ValueError:
|
||||
continue
|
||||
|
||||
|
||||
class EDAClientBase(object):
|
||||
def list_contracts(
|
||||
self,
|
||||
@@ -80,24 +116,16 @@ class MockEDAClient(EDAClientBase):
|
||||
|
||||
MOCK_CONTRACT_NUMBER = "DCA10096D0052"
|
||||
|
||||
# TODO: It seems likely that this will have to supply CLIN data form the
|
||||
# EDA returnclinXML API call, in addition to the basic task order data
|
||||
# below. See the EDA docs.
|
||||
def get_contract(self, contract_number, status):
|
||||
if contract_number == self.MOCK_CONTRACT_NUMBER and status == "y":
|
||||
return {
|
||||
"aco_mod": "01",
|
||||
"admin_dodaac": None,
|
||||
"cage_code": "1U305",
|
||||
"contract_no": "DCA10096D0052",
|
||||
"delivery_order": "0084",
|
||||
"duns_number": None,
|
||||
"issue_date": "20000228",
|
||||
"issue_dodaac": None,
|
||||
"location": "https://docsrv1.nit.disa.mil:443/eda/enforcer/C0414345.PDF?ver=1.4&loc=Y29udHJhY3RzL29nZGVuL3ZlbmRvci8xOTk4LzA5LzE0L0MwNDE0MzQ1LlBERg==&sourceurl=aHR0cHM6Ly9lZGE0Lm5pdC5kaXNhLm1pbC9wbHMvdXNlci9uZXdfYXBwLkdldF9Eb2M_cFRhYmxlX0lEPTImcFJlY29yZF9LZXk9OEE2ODExNjM2RUY5NkU2M0UwMzQwMDYwQjBCMjgyNkM=&uid=6CFC2B2322E86FD5E054002264936E3C&qid=19344159&signed=G&qdate=20180529194407GMT&token=6xQICrrrfIMciEJSpXmfsAYrToM=",
|
||||
"pay_dodaac": None,
|
||||
"pco_mod": "02",
|
||||
"amount": 2_000_000,
|
||||
"number": "DCA10096D0052",
|
||||
"clin_0001": 500,
|
||||
"clin_0003": 600,
|
||||
"clin_1001": 700,
|
||||
"clin_1003": 800,
|
||||
"clin_2001": 900,
|
||||
"clin_2003": 1000,
|
||||
}
|
||||
else:
|
||||
return None
|
||||
@@ -150,7 +178,10 @@ class EDAClient(EDAClientBase):
|
||||
)
|
||||
if response.text.startswith("No data found"):
|
||||
return None
|
||||
return ET.fromstring(response.text)
|
||||
|
||||
eda_data = {"number": contract_number}
|
||||
eda_data.update(parse_eda_xml(response.text))
|
||||
return eda_data
|
||||
|
||||
def get_clins(self, record_key, clins, cage_code="", duns_number=""):
|
||||
response = self._get(
|
||||
|
Reference in New Issue
Block a user