Source code for fedex.tools.conversion
"""Response output conversion tools to help parse suds
response object output.
"""
# This is the suds way of doing this, but its slower.
# For reference only.
# from suds.sudsobject import asdict
# from suds.sax.text import Text
#
# def response_to_dict(obj):
# """ Converts a suds object to a dictionary.
# :param obj: object
# :return: dictionary
# """
# out = {}
# for k, v in asdict(obj).items(): # k = k.lower()
# if hasattr(v, '__keylist__'):
# out[k] = response_to_dict(v)
# elif isinstance(v, list): # tuple not used
# out[k] = []
# for item in v:
# if hasattr(item, '__keylist__'):
# out[k].append(response_to_dict(item))
# else:
# out[k].append(
# item.title() if isinstance(item, Text) else item)
# else:
# out[k] = v.title() if isinstance(v, Text) else v
# return out
[docs]def basic_sobject_to_dict(obj):
"""Converts suds object to dict very quickly.
Does not serialize date time or normalize key case.
:param obj: suds object
:return: dict object
"""
if not hasattr(obj, '__keylist__'):
return obj
data = {}
fields = obj.__keylist__
for field in fields:
val = getattr(obj, field)
if isinstance(val, list):
data[field] = []
for item in val:
data[field].append(basic_sobject_to_dict(item))
else:
data[field] = basic_sobject_to_dict(val)
return data
[docs]def sobject_to_dict(obj, key_to_lower=False, json_serialize=False):
"""
Converts a suds object to a dict. Includes advanced features.
:param json_serialize: If set, changes date and time types to iso string.
:param key_to_lower: If set, changes index key name to lower case.
:param obj: suds object
:return: dict object
"""
import datetime
if not hasattr(obj, '__keylist__'):
if json_serialize and isinstance(obj, (datetime.datetime, datetime.time, datetime.date)):
return obj.isoformat()
else:
return obj
data = {}
fields = obj.__keylist__
for field in fields:
val = getattr(obj, field)
if key_to_lower:
field = field.lower()
if isinstance(val, list):
data[field] = []
for item in val:
data[field].append(sobject_to_dict(item, json_serialize=json_serialize))
else:
data[field] = sobject_to_dict(val, json_serialize=json_serialize)
return data
[docs]def sobject_to_json(obj, key_to_lower=False):
"""
Converts a suds object to a JSON string.
:param obj: suds object
:param key_to_lower: If set, changes index key name to lower case.
:return: json object
"""
import json
data = sobject_to_dict(obj, key_to_lower=key_to_lower, json_serialize=True)
return json.dumps(data)