From b7c36d334daee73ba9efa18c6c6173a0d86fb24d Mon Sep 17 00:00:00 2001 From: Vitaly Babiy Date: Mon, 26 Feb 2018 11:57:53 -0500 Subject: [PATCH 1/2] Fixing issues with saving and loading so with line items. --- .gitignore | 1 + fishbowl/api.py | 3 ++- fishbowl/objects.py | 7 ++++++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index cf8b95a..a97b84a 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ fishbowl.log fishbowl/fishbowl.ini +fishbowl_api.egg-info \ No newline at end of file diff --git a/fishbowl/api.py b/fishbowl/api.py index 14265b6..2a43d56 100644 --- a/fishbowl/api.py +++ b/fishbowl/api.py @@ -665,8 +665,9 @@ def get_so(self, number): def save_so(self, so): request = xmlrequests.SaveSO(so, key=self.key) response = self.send_message(request) + # print etree.tostring(response) check_status(response.find('FbiMsgsRs')) - return objects.SalesOrder(response.find('SalesOrder')) + return objects.SalesOrder(response.find('.//SalesOrder')) class FishbowlAPI(object): diff --git a/fishbowl/objects.py b/fishbowl/objects.py index 55b0c93..4800a3e 100644 --- a/fishbowl/objects.py +++ b/fishbowl/objects.py @@ -142,7 +142,7 @@ def get_xml_data(self, base_el): if six.PY2: key = key.encode(self.encoding) if children: - if [el for el in child if el.text.strip()]: + if [el for el in child if el.text and el.text.strip()]: data[key] = self.get_xml_data(child) else: inner = [] @@ -167,8 +167,13 @@ def __setitem__(self, key, value): raise KeyError('No field named {}'.format(key)) expected_type = self.fields[key] expected_type = getattr(expected_type, 'type', expected_type) + if expected_type is None: expected_type = six.text_type + + if not inspect.isclass(expected_type): + expected_type = expected_type.__class__ + if not isinstance(value, expected_type): raise ValueError('Value was not type {}'.format(expected_type)) self.mapped[key] = value From e77872409f6ba36ab0563ed6cd675219a938fc2f Mon Sep 17 00:00:00 2001 From: Vitaly Babiy Date: Fri, 20 Apr 2018 14:40:59 -0400 Subject: [PATCH 2/2] Fixing data type issues with date times and bools --- fishbowl/objects.py | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/fishbowl/objects.py b/fishbowl/objects.py index 4800a3e..6d0397d 100644 --- a/fishbowl/objects.py +++ b/fishbowl/objects.py @@ -11,19 +11,23 @@ def fishbowl_datetime(text): - return datetime.strptime(text, '%Y-%m-%dT%H:%M:%S') - + if isinstance(text, str): + return datetime.datetime.strptime(text, '%Y-%m-%dT%H:%M:%S') + elif isinstance(text, datetime.datetime): + return text.strftime('%Y-%m-%dT%H:%M:%S') fishbowl_datetime.type = datetime.datetime def fishbowl_boolean(text): - if not text: - return False - if text.lower() in ('0', 'false', 'f'): - return False - return True - + if isinstance(text, str): + if not text: + return False + if text.lower() in ('0', 'false', 'f'): + return False + return True + elif isinstance(text, bool): + return 'true' if text else 'false' fishbowl_boolean.type = bool @@ -397,8 +401,8 @@ class SalesOrderItem(FishbowlObject): ('CustomerPartNum', None), ('Taxable', fishbowl_boolean), ('Quantity', int), - ('ProductPrice', int), - ('TotalPrice', int), + ('ProductPrice', decimal.Decimal), + ('TotalPrice', decimal.Decimal), ('UOMCode', None), ('ItemType', int), ('Status', int),