Fix duplicate ref_name detection and promote to error
parent
3377ef08ea
commit
9caeed781e
|
|
@ -72,6 +72,10 @@ class InlineSerializerInspector(SerializerInspector):
|
||||||
def get_serializer_ref_name(self, serializer):
|
def get_serializer_ref_name(self, serializer):
|
||||||
return get_serializer_ref_name(serializer)
|
return get_serializer_ref_name(serializer)
|
||||||
|
|
||||||
|
def _has_ref_name(self, serializer):
|
||||||
|
serializer_meta = getattr(serializer, 'Meta', None)
|
||||||
|
return hasattr(serializer_meta, 'ref_name')
|
||||||
|
|
||||||
def field_to_swagger_object(self, field, swagger_object_type, use_references, **kwargs):
|
def field_to_swagger_object(self, field, swagger_object_type, use_references, **kwargs):
|
||||||
SwaggerType, ChildSwaggerType = self._get_partial_types(field, swagger_object_type, use_references, **kwargs)
|
SwaggerType, ChildSwaggerType = self._get_partial_types(field, swagger_object_type, use_references, **kwargs)
|
||||||
|
|
||||||
|
|
@ -118,6 +122,7 @@ class InlineSerializerInspector(SerializerInspector):
|
||||||
# it is better to just remove title from inline models
|
# it is better to just remove title from inline models
|
||||||
del result.title
|
del result.title
|
||||||
|
|
||||||
|
setattr(result, '_serializer', serializer)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
if not ref_name or not use_references:
|
if not ref_name or not use_references:
|
||||||
|
|
@ -130,8 +135,12 @@ class InlineSerializerInspector(SerializerInspector):
|
||||||
actual_serializer = get_serializer_class(getattr(actual_schema, '_serializer', None))
|
actual_serializer = get_serializer_class(getattr(actual_schema, '_serializer', None))
|
||||||
this_serializer = get_serializer_class(field)
|
this_serializer = get_serializer_class(field)
|
||||||
if actual_serializer and actual_serializer != this_serializer: # pragma: no cover
|
if actual_serializer and actual_serializer != this_serializer: # pragma: no cover
|
||||||
logger.warning("Schema for %s will override distinct serializer %s because they "
|
explicit_refs = self._has_ref_name(actual_serializer) and self._has_ref_name(this_serializer)
|
||||||
"share the same ref_name", actual_serializer, this_serializer)
|
if not explicit_refs:
|
||||||
|
raise SwaggerGenerationError(
|
||||||
|
"Schema for %s would override distinct serializer %s because they implicitly share the same "
|
||||||
|
"ref_name; explicitly set the ref_name atribute on both serializers' Meta classes"
|
||||||
|
% (actual_serializer, this_serializer))
|
||||||
|
|
||||||
return openapi.SchemaRef(definitions, ref_name)
|
return openapi.SchemaRef(definitions, ref_name)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ from decimal import Decimal
|
||||||
|
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from rest_framework.compat import MinValueValidator, MaxLengthValidator
|
from rest_framework.compat import MaxLengthValidator, MinValueValidator
|
||||||
|
|
||||||
from snippets.models import LANGUAGE_CHOICES, STYLE_CHOICES, Snippet
|
from snippets.models import LANGUAGE_CHOICES, STYLE_CHOICES, Snippet
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue