def _load_attributes_from_response(self, **response): """ Loads attributes If the data has a nested object with a resource_uri, try to math an existing object """ for key, value in response.iteritems(): if type(value) == list: res = [] for elem in value: if type(elem)==dict and 'resource_uri' in elem: # Try to match a relation try: from icebergsdk.resources import get_class_from_resource_uri obj_cls = get_class_from_resource_uri(elem['resource_uri']) res.append(obj_cls.findOrCreate(elem)) except Exception: logger.exception('Cant parse resource') else: res.append(elem) self.__dict__[key] = res elif type(value) == dict: if 'resource_uri' in value: # Try to match a relation try: from icebergsdk.resources import get_class_from_resource_uri obj_cls = get_class_from_resource_uri(value['resource_uri']) self.__dict__[key] = obj_cls.findOrCreate(value) except: pass elif 'id' in value: # Fall back self.__dict__[key] = value['id'] else: self.__dict__[key] = value return self
def _load_attributes_from_response(self, **response): """ Loads attributes If the data has a nested object with a resource_uri, try to math an existing object """ for key, value in response.iteritems(): if key == "meta": continue if type(value) == list: res = [] for elem in value: if type( elem ) == dict and 'resource_uri' in elem: # Try to match a relation try: from icebergsdk.resources import get_class_from_resource_uri obj_cls = get_class_from_resource_uri( elem['resource_uri']) res.append( obj_cls.findOrCreate(self._handler, elem)) except Exception: logger.exception('Cant parse resource') else: res.append(elem) self.__dict__[key] = res elif type(value) == dict: if len(value) == 0: self.__dict__[key] = None elif key in self.raw_fields: self.__dict__[key] = value ## keep this field as raw elif 'resource_uri' in value: # Try to match a relation try: from icebergsdk.resources import get_class_from_resource_uri obj_cls = get_class_from_resource_uri( value['resource_uri']) self.__dict__[key] = obj_cls.findOrCreate( self._handler, value) except: ## keep it as dict self.__dict__[key] = value elif 'id' in value: # Fall back self.__dict__[key] = value['id'] else: self.__dict__[key] = value ## keep it as dict elif value and key in (self.DATETIME_FIELDS + self.GENERIC_DATETIME_FIELDS): if type(value) == int: self.__dict__[key] = datetime.fromtimestamp(value, tz=pytz.utc) else: self.__dict__[key] = date_parser.parse(value) elif value and key in (self.DECIMAL_FIELDS + self.GENERIC_DECIMAL_FIELDS): self.__dict__[key] = Decimal(str(value)) else: self.__dict__[key] = value return self
def _load_attributes_from_response(self, **response): for key, value in response.iteritems(): if type(value) == dict: if 'resource_uri' in value: # Try to match a relation from icebergsdk.resources import get_class_from_resource_uri try: obj_cls = get_class_from_resource_uri(value['resource_uri']) self.__dict__[key] = obj_cls.findOrCreate(value) except: pass elif 'id' in value: self.__dict__[key] = value['id'] else: self.__dict__[key] = value return self
def findOrCreate(cls, handler, data): """ Take a dict and return an corresponding Iceberg resource object. Check in _objects_store for reuse of existing object Example: data: { "id": 1, "resource_uri": "/v1/user/1/" ... } Will return an User object """ from icebergsdk.resources import get_class_from_resource_uri try: obj_cls = get_class_from_resource_uri(data['resource_uri']) except: obj = cls(handler=handler) else: data_type = obj_cls.endpoint if "pk" in data: key = str(data['pk']) else: key = str(data['id']) if not data_type in handler._objects_store: # New type collectore handler._objects_store[data_type] = weakref.WeakValueDictionary() obj = obj_cls(handler=handler) handler._objects_store[data_type][key] = obj else: if key in handler._objects_store[data_type]: obj = handler._objects_store[data_type][key] else: obj = obj_cls(handler=handler) handler._objects_store[data_type][key] = obj return obj._load_attributes_from_response(**data)
def findOrCreate(cls, handler, data): """ Take a dict and return an corresponding Iceberg resource object. Check in _objects_store for reuse of existing object Example: data: { "id": 1, "resource_uri": "/v1/user/1/" ... } Will return an User object """ from icebergsdk.resources import get_class_from_resource_uri try: obj_cls = get_class_from_resource_uri(data['resource_uri']) except: obj = cls(handler=handler) else: data_type = obj_cls.endpoint if "pk" in data: key = str(data['pk']) else: key = str(data['id']) if not data_type in handler._objects_store: # New type collectore handler._objects_store[ data_type] = weakref.WeakValueDictionary() obj = obj_cls(handler=handler) handler._objects_store[data_type][key] = obj else: if key in handler._objects_store[data_type]: obj = handler._objects_store[data_type][key] else: obj = obj_cls(handler=handler) handler._objects_store[data_type][key] = obj return obj._load_attributes_from_response(**data)