okta/framework/Utils.py (77 lines of code) (raw):

import json import dateutil.parser from datetime import datetime import types import six import inspect class Utils(object): @staticmethod def deserialize(from_data, to_class): def custom_setattr(o, a, v): if hasattr(o, 'alt_names') and a in o.alt_names: a = o.alt_names[a] setattr(o, a, v) json_dump = {} if from_data is None or len(from_data) == 0: json_dump = {} elif isinstance(from_data, six.text_type) or isinstance(from_data, six.string_types): json_dump = json.loads(from_data) else: json_dump = from_data list_type = types.ListType if six.PY2 else list if isinstance(json_dump, list_type): obj_list = list() for obj in json_dump: obj_list.append(Utils.deserialize(obj, to_class)) return obj_list else: obj = to_class() # Loop through each type of object in types if hasattr(to_class, 'types'): for attr, attr_type in six.iteritems(to_class.types): if attr in json_dump: val = json_dump[attr] if not val: continue if attr_type == datetime: val = dateutil.parser.parse(val) elif attr_type == str or attr_type == int or attr_type == dict or attr_type == bool: pass else: val = Utils.deserialize(val, attr_type) custom_setattr(obj, attr, val) # Otherwise, assume all the properties are strings else: for key, value in six.iteritems(json_dump): if key in to_class.__dict__: custom_setattr(obj, key, json_dump[key]) # Some models have dicts as values if hasattr(to_class, 'dict_types'): for attr, attr_type in six.iteritems(to_class.dict_types): if attr in json_dump: dictionary = json_dump[attr] new_dict = dict() for key, value in six.iteritems(dictionary): val = Utils.deserialize(value, attr_type) new_dict[key] = val custom_setattr(obj, attr, new_dict) return obj @staticmethod def remove_nulls(d): built = {} for k, v in six.iteritems(d): if v is None: continue if isinstance(v, dict): built[k] = Utils.remove_nulls(v) if isinstance(v, object) and hasattr(v, '__dict__'): built[k] = Utils.remove_nulls(v.__dict__) else: built[k] = v return built @staticmethod def replace_alt_names(obj, d): built = d.copy() if hasattr(obj, 'alt_names'): for key, value in six.iteritems(obj.alt_names): if value in built: built[key] = built[value] del built[value] return built