Beispiel #1
0
    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
Beispiel #2
0
    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
Beispiel #3
0
    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
Beispiel #4
0
    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)
Beispiel #5
0
    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)