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 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
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
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
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
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