def get_serializer_class(self):
        parent_serializer_class = super(RelatedMixin, self).get_serializer_class()

        if 'related_field' in self.kwargs:
            field_name = self.kwargs['related_field']

            # Try get the class from related_serializers
            if hasattr(parent_serializer_class, 'related_serializers'):
                _class = parent_serializer_class.related_serializers.get(field_name, None)
                if _class is None:
                    raise NotFound

            elif hasattr(parent_serializer_class, 'included_serializers'):
                _class = parent_serializer_class.included_serializers.get(field_name, None)
                if _class is None:
                    raise NotFound

            else:
                assert False, \
                    'Either "included_serializers" or "related_serializers" should be configured'

            if not isinstance(_class, type):
                return import_class_from_dotted_path(_class)
            return _class

        return parent_serializer_class
Пример #2
0
    def get_serializer_class(self):
        parent_serializer_class = super(RelatedMixin,
                                        self).get_serializer_class()

        if 'related_field' in self.kwargs:
            field_name = self.kwargs['related_field']

            # Try get the class from related_serializers
            if hasattr(parent_serializer_class, 'related_serializers'):
                _class = parent_serializer_class.related_serializers.get(
                    field_name, None)
                if _class is None:
                    raise NotFound

            elif hasattr(parent_serializer_class, 'included_serializers'):
                _class = parent_serializer_class.included_serializers.get(
                    field_name, None)
                if _class is None:
                    raise NotFound

            else:
                assert False, \
                    'Either "included_serializers" or "related_serializers" should be configured'

            if not isinstance(_class, type):
                return import_class_from_dotted_path(_class)
            return _class

        return parent_serializer_class
    def __getitem__(self, key):
        value = self.serializers[key]
        if not isinstance(value, type):
            if value == "self":
                value = self.parent
            else:
                value = import_class_from_dotted_path(value)
            self.serializers[key] = value

        return value
Пример #4
0
def get_included_serializers(serializer):
    included_serializers = copy.copy(getattr(serializer, 'included_serializers', dict()))

    for name, value in six.iteritems(included_serializers):
        if not isinstance(value, type):
            if value == 'self':
                included_serializers[name] = serializer if isinstance(serializer, type) else serializer.__class__
            else:
                included_serializers[name] = import_class_from_dotted_path(value)

    return included_serializers
Пример #5
0
def get_included_serializers(serializer):
    included_serializers = copy.copy(getattr(serializer, 'included_serializers', dict()))

    for name, value in six.iteritems(included_serializers):
        if not isinstance(value, type):
            if value == 'self':
                included_serializers[name] = serializer if isinstance(serializer, type) else serializer.__class__
            else:
                included_serializers[name] = import_class_from_dotted_path(value)

    return included_serializers
def get_default_serializer_from_model(model):
    json_api_meta = getattr(model, "JSONAPIMeta", None)

    if hasattr(json_api_meta, "get_default_serializer"):
        return json_api_meta.get_default_serializer()

    serializer_string = getattr(json_api_meta, "default_serializer", None)
    if serializer_string is None:
        # return format_relation_name(model.__name__)
        raise Exception("Must define a default_serializer on %s" % model.__name__)
    serializer_class = import_class_from_dotted_path(serializer_string)
    return serializer_class
def get_included_serializers_override(serializer):
    included_serializers_override = copy.copy(getattr(serializer, "included_serializers_override", dict()))

    for name, value in six.iteritems(included_serializers_override):
        if not isinstance(value, type):
            if value == "self":
                included_serializers_override[name] = (
                    serializer if isinstance(serializer, type) else serializer.__class__
                )
            else:
                included_serializers_override[name] = import_class_from_dotted_path(value)

    return included_serializers_override
Пример #8
0
def get_included_serializers(serializer):
    included_serializers = copy.copy(
        getattr(serializer, "included_serializers", dict()))

    for name, value in iter(included_serializers.items()):
        if not isinstance(value, type):
            if value == "self":
                included_serializers[name] = (serializer if isinstance(
                    serializer, type) else serializer.__class__)
            else:
                included_serializers[name] = import_class_from_dotted_path(
                    value)

    return included_serializers
    def get_generic_included_serializers(serializer):
        included_serializers = copy.copy(getattr(serializer, 'included_generic_serializers', dict()))

        for name, serializers in iter(included_serializers.items()):
            included_serializers[name] = []
            for value in serializers:
                if not isinstance(value, type):
                    if value == 'self':
                        included_serializers[name].append(
                            serializer if isinstance(serializer, type) else serializer.__class__
                        )
                    else:
                        included_serializers[name].append(import_class_from_dotted_path(value))

        return included_serializers
Пример #10
0
    def _find_related_view(self, view_endpoints, related_serializer, parent_view):
        """
        For a given related_serializer, try to find it's "parent" view instance in view_endpoints.
        :param view_endpoints: list of all view endpoints
        :param related_serializer: the related serializer for a given related field
        :param parent_view: the parent view (used to find toMany vs. toOne).
               TODO: not actually used.
        :return:view
        """
        for path, method, view in view_endpoints:
            view_serializer = view.get_serializer()
            if not isinstance(related_serializer, type):
                related_serializer_class = import_class_from_dotted_path(related_serializer)
            else:
                related_serializer_class = related_serializer
            if isinstance(view_serializer, related_serializer_class):
                return view

        return None
Пример #11
0
def get_included_serializers(serializer):
    # included_serializers = copy.copy(getattr(serializer, 'included_serializers', dict()))
    try:
        if inspect.isclass(serializer):
            included_serializers = serializer.included_serializers
        else:
            included_serializers = serializer.__class__.included_serializers
    except AttributeError:
        included_serializers = {}

    for name, value in six.iteritems(included_serializers):
        if not isinstance(value, type):
            if value == 'self':
                included_serializers[name] = (
                    serializer if isinstance(serializer, type) else serializer.__class__
                )
            else:
                included_serializers[name] = import_class_from_dotted_path(value)

    return included_serializers