From 5ee0e5df837ac792ab234f3452dc11f3036e2876 Mon Sep 17 00:00:00 2001 From: Jimmy Merrild Krag Date: Fri, 20 Apr 2018 15:47:20 +0200 Subject: [PATCH] Correct schema parsing for JSONField (#5878) Fixes #5873. * Use Object type. * Add test for field_to_schema --- rest_framework/schemas/inspectors.py | 3 ++ tests/test_schemas.py | 41 ++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/rest_framework/schemas/inspectors.py b/rest_framework/schemas/inspectors.py index 171b88b0b..89a1fc93a 100644 --- a/rest_framework/schemas/inspectors.py +++ b/rest_framework/schemas/inspectors.py @@ -95,6 +95,8 @@ def field_to_schema(field): description=description, format='date-time' ) + elif isinstance(field, serializers.JSONField): + return coreschema.Object(title=title, description=description) if field.style.get('base_template') == 'textarea.html': return coreschema.String( @@ -102,6 +104,7 @@ def field_to_schema(field): description=description, format='textarea' ) + return coreschema.String(title=title, description=description) diff --git a/tests/test_schemas.py b/tests/test_schemas.py index 081cb809d..47afe867d 100644 --- a/tests/test_schemas.py +++ b/tests/test_schemas.py @@ -17,6 +17,7 @@ from rest_framework.schemas import ( AutoSchema, ManualSchema, SchemaGenerator, get_schema_view ) from rest_framework.schemas.generators import EndpointEnumerator +from rest_framework.schemas.inspectors import field_to_schema from rest_framework.schemas.utils import is_list_view from rest_framework.test import APIClient, APIRequestFactory from rest_framework.utils import formatting @@ -763,6 +764,46 @@ class TestAutoSchema(TestCase): link = view.schema.get_link(path, method, base_url) assert link == expected + def test_field_to_schema(self): + label = 'Test label' + help_text = 'This is a helpful test text' + + cases = [ + # tuples are ([field], [expected schema]) + # TODO: Add remaining cases + ( + serializers.BooleanField(label=label, help_text=help_text), + coreschema.Boolean(title=label, description=help_text) + ), + ( + serializers.DecimalField(1000, 1000, label=label, help_text=help_text), + coreschema.Number(title=label, description=help_text) + ), + ( + serializers.FloatField(label=label, help_text=help_text), + coreschema.Number(title=label, description=help_text) + ), + ( + serializers.IntegerField(label=label, help_text=help_text), + coreschema.Integer(title=label, description=help_text) + ), + ( + serializers.DateField(label=label, help_text=help_text), + coreschema.String(title=label, description=help_text, format='date') + ), + ( + serializers.DateTimeField(label=label, help_text=help_text), + coreschema.String(title=label, description=help_text, format='date-time') + ), + ( + serializers.JSONField(label=label, help_text=help_text), + coreschema.Object(title=label, description=help_text) + ), + ] + + for case in cases: + self.assertEqual(field_to_schema(case[0]), case[1]) + def test_docstring_is_not_stripped_by_get_description(): class ExampleDocstringAPIView(APIView):