예제 #1
0
    def _serialize(self, value, attr, obj):
        if not self.many:
            value = [value]

        links = None
        result = []
        if value:
            for instance in value:
                field = Relationship(type_=type_from_model_name(
                    instance.__class__.__name__),
                                     id_field='pk',
                                     self_url=self.self_url,
                                     related_url=self.related_url,
                                     many=False)
                field._add_to_schema(self.name, self.parent)
                field.include_data = self.include_data
                data = field._serialize(instance, attr, obj)
                if links is None and 'links' in data:
                    links = data['links']
                result.append(data.get('data'))
        else:
            data = super(PolymorphicRelationship,
                         self)._serialize(None, attr, obj)
            if links is None and 'links' in data:
                links = data['links']

        if not self.many:
            result = result[0]
        data = {}
        if links is not None:
            data['links'] = order_dict(links, LINKS_OBJECT_ORDER)
        if self.include_resource_linkage or self.include_data:
            data['data'] = result
        return order_dict(data, TOP_LEVEL_OBJECT_ORDER)
예제 #2
0
    def _serialize(self, value, attr, obj):
        if not self.many:
            value = [value]

        links = None
        result = []
        if value:
            for instance in value:
                field = Relationship(
                    type_=type_from_model_name(instance.__class__.__name__),
                    id_field='pk',
                    self_url=self.self_url,
                    related_url=self.related_url,
                    many=False)
                field._add_to_schema(self.name, self.parent)
                field.include_data = self.include_data
                data = field._serialize(instance, attr, obj)
                if links is None and 'links' in data:
                    links = data['links']
                result.append(data.get('data'))
        else:
            data = super(PolymorphicRelationship, self)._serialize(
                None, attr, obj)
            if links is None and 'links' in data:
                links = data['links']

        if not self.many:
            result = result[0]
        data = {}
        if links is not None:
            data['links'] = order_dict(links, LINKS_OBJECT_ORDER)
        if self.include_resource_linkage or self.include_data:
            data['data'] = result
        return order_dict(data, TOP_LEVEL_OBJECT_ORDER)
예제 #3
0
 def format_item(self, item):
     item = super(JsonApiSerializer, self).format_item(item)
     if 'attributes' in item:
         attributes = item.pop('attributes')
         attributes.pop('-url', None)  # super call adds this
         if attributes:
             item['attributes'] = order_dict(attributes, self.field_order)
     if 'relationships' in item:
         item['relationships'] = order_dict(item['relationships'],
                                            self.relationship_order)
     return order_dict(item, RESOURCE_OBJECT_ORDER)
예제 #4
0
 def format_item(self, item):
     item = super(JsonApiSerializer, self).format_item(item)
     if 'attributes' in item:
         attributes = item.pop('attributes')
         attributes.pop('-url', None)  # super call adds this
         if attributes:
             item['attributes'] = order_dict(attributes, self.field_order)
     if 'relationships' in item:
         item['relationships'] = order_dict(item['relationships'],
                                            self.relationship_order)
     return order_dict(item, RESOURCE_OBJECT_ORDER)
예제 #5
0
    def data(self):
        links = None
        data = []
        included = []
        included_set = set()

        default_type = type_from_model_name(self.default_model.__name__)
        default_serializer = get_schema(default_type)

        for instance in self.collection:
            type_ = type_from_model_name(instance.__class__.__name__)
            serializer_class = get_schema(type_)
            if not issubclass(serializer_class.opts.model, self.base):
                serializer_class = default_serializer

            serialized = serializer_class(instance=instance,
                                          **self.kwargs).data
            if not links and 'links' in serialized:
                links = serialized['links']
            data.append(serialized['data'])
            for include in serialized.get('included', []):
                key = (include['type'], include['id'])
                if key not in included_set:
                    included.append(include)
                    included_set.add(key)

        response = {'data': data}
        if links:
            response['links'] = links
        if included:
            included.sort(key=itemgetter('type', 'id'))
            response['included'] = included

        return order_dict(response, TOP_LEVEL_OBJECT_ORDER)
예제 #6
0
    def data(self):
        links = None
        data = []
        included = []
        included_set = set()

        default_type = type_from_model_name(self.default_model.__name__)
        default_serializer = get_schema(default_type)

        for instance in self.collection:
            type_ = type_from_model_name(instance.__class__.__name__)
            serializer_class = get_schema(type_)
            if not issubclass(serializer_class.opts.model, self.base):
                serializer_class = default_serializer

            serialized = serializer_class(instance=instance, **self.kwargs).data
            if not links and 'links' in serialized:
                links = serialized['links']
            data.append(serialized['data'])
            for include in serialized.get('included', []):
                key = (include['type'], include['id'])
                if key not in included_set:
                    included.append(include)
                    included_set.add(key)

        response = {
            'data': data
        }
        if links:
            response['links'] = links
        if included:
            included.sort(key=itemgetter('type', 'id'))
            response['included'] = included

        return order_dict(response, TOP_LEVEL_OBJECT_ORDER)
예제 #7
0
    def format_json_api_response(self, data, many):
        updated_set = set()
        deleted_set = set()
        updated = []
        deleted = []

        for instance in self.deleted:
            if instance.data_key in deleted_set:
                continue
            deleted_set.add(instance.data_key)
            if instance != self.instance:
                deleted.append(instance)

        for instance in self.updated:
            if (instance.data_key in updated_set
                    or instance.data_key in deleted_set):
                continue
            updated_set.add(instance.data_key)
            updated.append(instance)

        self.add_includes(updated)
        response = super(JsonApiSerializer,
                         self).format_json_api_response(data, many)

        if 'included' in response:
            response['included'].sort(key=itemgetter('type', 'id'))

        deleted = self.format_profile_references(deleted)
        if deleted:
            self.add_profile_to_response(DELETED_PROFILE,
                                         DELETED_PROFILE_ALIAS, deleted,
                                         response)

        updated = self.format_profile_references(updated)
        if updated:
            self.add_profile_to_response(UPDATES_PROFILE,
                                         UPDATES_PROFILE_ALIAS, updated,
                                         response)

        if (isinstance(self.instance, Model)
                and self.instance.data_key in deleted_set):
            response.pop('data', None)
            if not response.get('meta'):
                return {}

        return order_dict(response, TOP_LEVEL_OBJECT_ORDER)
예제 #8
0
    def format_json_api_response(self, data, many):
        updated_set = set()
        deleted_set = set()
        updated = []
        deleted = []

        for instance in self.deleted:
            if instance.data_key in deleted_set:
                continue
            deleted_set.add(instance.data_key)
            if instance != self.instance:
                deleted.append(instance)

        for instance in self.updated:
            if (instance.data_key in updated_set or
                    instance.data_key in deleted_set):
                continue
            updated_set.add(instance.data_key)
            updated.append(instance)

        self.add_includes(updated)
        response = super(JsonApiSerializer, self).format_json_api_response(
            data, many)

        if 'included' in response:
            response['included'].sort(key=itemgetter('type', 'id'))

        deleted = self.format_profile_references(deleted)
        if deleted:
            self.add_profile_to_response(DELETED_PROFILE, DELETED_PROFILE_ALIAS,
                                         deleted, response)

        updated = self.format_profile_references(updated)
        if updated:
            self.add_profile_to_response(UPDATES_PROFILE, UPDATES_PROFILE_ALIAS,
                                         updated, response)

        if (isinstance(self.instance, Model) and
                self.instance.data_key in deleted_set):
            response.pop('data', None)
            if not response.get('meta'):
                return {}

        return order_dict(response, TOP_LEVEL_OBJECT_ORDER)
예제 #9
0
 def _serialize(self, value, attr, obj):
     data = super(Relationship, self)._serialize(value, attr, obj)
     if 'links' in data:
         data['links'] = order_dict(data['links'], LINKS_OBJECT_ORDER)
     return order_dict(data, TOP_LEVEL_OBJECT_ORDER)
예제 #10
0
 def get_resource_linkage(self, value):
     data = super(Relationship, self).get_resource_linkage(value)
     if self.many:
         return [order_dict(item, TOP_LEVEL_OBJECT_ORDER) for item in data]
     return order_dict(data, TOP_LEVEL_OBJECT_ORDER)
예제 #11
0
 def _serialize(self, value, attr, obj):
     data = super(Relationship, self)._serialize(value, attr, obj)
     if 'links' in data:
         data['links'] = order_dict(data['links'], LINKS_OBJECT_ORDER)
     return order_dict(data, TOP_LEVEL_OBJECT_ORDER)
예제 #12
0
 def get_resource_linkage(self, value):
     data = super(Relationship, self).get_resource_linkage(value)
     if self.many:
         return [order_dict(item, TOP_LEVEL_OBJECT_ORDER) for item in data]
     return order_dict(data, TOP_LEVEL_OBJECT_ORDER)