From 2c459024d116dc74349e53f0b25e727179cf36eb Mon Sep 17 00:00:00 2001 From: John Carter Date: Sat, 10 Mar 2018 09:46:47 +1300 Subject: [PATCH] Handle django rest framework HiddenField (#79) * Added HiddenFieldInspector (#78) * Updated docs + added test for HiddenField Added HiddenField to testproj (no change in yaml as expected) Closes #78. --- docs/changelog.rst | 7 +++++++ docs/settings.rst | 1 + src/drf_yasg/app_settings.py | 1 + src/drf_yasg/inspectors/__init__.py | 5 +++-- src/drf_yasg/inspectors/field.py | 12 +++++++++++- testproj/todo/serializer.py | 5 ++++- 6 files changed, 27 insertions(+), 4 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 681e054..19d4db2 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -2,6 +2,13 @@ Changelog ######### +********* +**1.x.x** +********* + +*Release date: TODO* + +- **IMPROVED:** ``serializers.HiddenField`` are now hidden (:issue:`78`) ********* **1.4.7** diff --git a/docs/settings.rst b/docs/settings.rst index 705dcf4..40ee9c8 100644 --- a/docs/settings.rst +++ b/docs/settings.rst @@ -66,6 +66,7 @@ to this list. :class:`'drf_yasg.inspectors.ChoiceFieldInspector' <.inspectors.ChoiceFieldInspector>`, |br| \ :class:`'drf_yasg.inspectors.FileFieldInspector' <.inspectors.FileFieldInspector>`, |br| \ :class:`'drf_yasg.inspectors.DictFieldInspector' <.inspectors.DictFieldInspector>`, |br| \ +:class:`'drf_yasg.inspectors.HiddenFieldInspector' <.inspectors.HiddenFieldInspector>`, |br| \ :class:`'drf_yasg.inspectors.SimpleFieldInspector' <.inspectors.SimpleFieldInspector>`, |br| \ :class:`'drf_yasg.inspectors.StringDefaultFieldInspector' <.inspectors.StringDefaultFieldInspector>`, |br| \ ``]`` diff --git a/src/drf_yasg/app_settings.py b/src/drf_yasg/app_settings.py index 7978959..dd7b1cd 100644 --- a/src/drf_yasg/app_settings.py +++ b/src/drf_yasg/app_settings.py @@ -11,6 +11,7 @@ SWAGGER_DEFAULTS = { 'drf_yasg.inspectors.ChoiceFieldInspector', 'drf_yasg.inspectors.FileFieldInspector', 'drf_yasg.inspectors.DictFieldInspector', + 'drf_yasg.inspectors.HiddenFieldInspector', 'drf_yasg.inspectors.SimpleFieldInspector', 'drf_yasg.inspectors.StringDefaultFieldInspector', ], diff --git a/src/drf_yasg/inspectors/__init__.py b/src/drf_yasg/inspectors/__init__.py index 8c32bf8..5af88f8 100644 --- a/src/drf_yasg/inspectors/__init__.py +++ b/src/drf_yasg/inspectors/__init__.py @@ -4,7 +4,8 @@ from .base import ( ) from .field import ( CamelCaseJSONFilter, ChoiceFieldInspector, DictFieldInspector, FileFieldInspector, InlineSerializerInspector, - ReferencingSerializerInspector, RelatedFieldInspector, SimpleFieldInspector, StringDefaultFieldInspector + ReferencingSerializerInspector, RelatedFieldInspector, SimpleFieldInspector, StringDefaultFieldInspector, + HiddenFieldInspector, ) from .query import CoreAPICompatInspector, DjangoRestResponsePagination from .view import SwaggerAutoSchema @@ -24,7 +25,7 @@ __all__ = [ # field inspectors 'InlineSerializerInspector', 'ReferencingSerializerInspector', 'RelatedFieldInspector', 'SimpleFieldInspector', 'FileFieldInspector', 'ChoiceFieldInspector', 'DictFieldInspector', 'StringDefaultFieldInspector', - 'CamelCaseJSONFilter', + 'CamelCaseJSONFilter', 'HiddenFieldInspector', # view inspectors 'SwaggerAutoSchema', diff --git a/src/drf_yasg/inspectors/field.py b/src/drf_yasg/inspectors/field.py index 208b551..bc34130 100644 --- a/src/drf_yasg/inspectors/field.py +++ b/src/drf_yasg/inspectors/field.py @@ -465,11 +465,21 @@ class DictFieldInspector(FieldInspector): return NotHandled +class HiddenFieldInspector(FieldInspector): + """Hide ``HiddenField``.""" + + def field_to_swagger_object(self, field, swagger_object_type, use_references, **kwargs): + if isinstance(field, serializers.HiddenField): + return None + + return NotHandled + + class StringDefaultFieldInspector(FieldInspector): """For otherwise unhandled fields, return them as plain :data:`.TYPE_STRING` objects.""" def field_to_swagger_object(self, field, swagger_object_type, use_references, **kwargs): # pragma: no cover - # TODO unhandled fields: TimeField HiddenField JSONField + # TODO unhandled fields: TimeField JSONField SwaggerType, ChildSwaggerType = self._get_partial_types(field, swagger_object_type, use_references, **kwargs) return SwaggerType(type=openapi.TYPE_STRING) diff --git a/testproj/todo/serializer.py b/testproj/todo/serializer.py index b23e318..daa0c2f 100644 --- a/testproj/todo/serializer.py +++ b/testproj/todo/serializer.py @@ -1,3 +1,4 @@ +from django.utils import timezone from rest_framework import serializers from .models import Todo, TodoAnother, TodoYetAnother @@ -6,7 +7,9 @@ from .models import Todo, TodoAnother, TodoYetAnother class TodoSerializer(serializers.ModelSerializer): class Meta: model = Todo - fields = ('title',) + fields = ('title', 'a_hidden_field',) + + a_hidden_field = serializers.HiddenField(default=timezone.now) class TodoAnotherSerializer(serializers.ModelSerializer):