Fix duplicate ref_name detection and promote to error

master
Cristi Vijdea 2019-02-27 21:47:31 +02:00
parent 3377ef08ea
commit 9caeed781e
2 changed files with 12 additions and 3 deletions

View File

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

View File

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