From 3377ef08ead60c8508dca3669089d3a7e3475278 Mon Sep 17 00:00:00 2001 From: Cristi Vijdea Date: Wed, 27 Feb 2019 21:19:39 +0200 Subject: [PATCH] Fix Schema limits for ListField and ListSerializer Fixes #324 --- src/drf_yasg/inspectors/field.py | 2 ++ testproj/snippets/serializers.py | 6 ++++-- tests/reference.yaml | 9 +++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/drf_yasg/inspectors/field.py b/src/drf_yasg/inspectors/field.py index 080e130..702c8d2 100644 --- a/src/drf_yasg/inspectors/field.py +++ b/src/drf_yasg/inspectors/field.py @@ -77,9 +77,11 @@ class InlineSerializerInspector(SerializerInspector): if isinstance(field, (serializers.ListSerializer, serializers.ListField)): child_schema = self.probe_field_inspectors(field.child, ChildSwaggerType, use_references) + limits = find_limits(field) or {} return SwaggerType( type=openapi.TYPE_ARRAY, items=child_schema, + **limits ) elif isinstance(field, serializers.Serializer): if swagger_object_type != openapi.Schema: diff --git a/testproj/snippets/serializers.py b/testproj/snippets/serializers.py index fc7a04e..edab075 100644 --- a/testproj/snippets/serializers.py +++ b/testproj/snippets/serializers.py @@ -2,7 +2,7 @@ from decimal import Decimal from django.contrib.auth import get_user_model from rest_framework import serializers -from rest_framework.compat import MinValueValidator +from rest_framework.compat import MinValueValidator, MaxLengthValidator from snippets.models import LANGUAGE_CHOICES, STYLE_CHOICES, Snippet @@ -65,11 +65,13 @@ class SnippetSerializer(serializers.Serializer): ) title = serializers.CharField(required=False, allow_blank=True, max_length=100) code = serializers.CharField(style={'base_template': 'textarea.html'}) + tags = serializers.ListField(child=serializers.CharField(min_length=2), min_length=3, max_length=15) linenos = serializers.BooleanField(required=False) language = LanguageSerializer(help_text="Sample help text for language") styles = serializers.MultipleChoiceField(choices=STYLE_CHOICES, default=['friendly']) lines = serializers.ListField(child=serializers.IntegerField(), allow_empty=True, allow_null=True, required=False) - example_projects = serializers.ListSerializer(child=ExampleProjectSerializer(), read_only=True) + example_projects = serializers.ListSerializer(child=ExampleProjectSerializer(), read_only=True, + validators=[MaxLengthValidator(100)]) difficulty_factor = serializers.FloatField(help_text="this is here just to test FloatField", read_only=True, default=lambda: 6.9) rate_as_string = serializers.DecimalField(max_digits=6, decimal_places=3, default=Decimal('0.0'), diff --git a/tests/reference.yaml b/tests/reference.yaml index 7da4d79..46c31d1 100644 --- a/tests/reference.yaml +++ b/tests/reference.yaml @@ -1023,6 +1023,7 @@ definitions: Snippet: required: - code + - tags - language type: object properties: @@ -1057,6 +1058,13 @@ definitions: title: Code type: string minLength: 1 + tags: + type: array + items: + type: string + minLength: 2 + maxItems: 15 + minItems: 3 linenos: title: Linenos type: boolean @@ -1553,6 +1561,7 @@ definitions: items: $ref: '#/definitions/Project' readOnly: true + maxItems: 100 difficultyFactor: title: Difficulty factor description: this is here just to test FloatField