From d061b975c4ad771935d4c9a8fa4394c5a3114c0f Mon Sep 17 00:00:00 2001 From: Tatsushi Demachi Date: Sat, 15 Sep 2018 06:17:24 +0900 Subject: [PATCH] Fix tags field to be shown as array in API view `tags` field in serializers is defineded as `TagListSerializerField`. It should be shown as an array value in API view but actually, it is a simple string value. This fixes it by introducing a new `FieldInspector` to handle `TagListSerializerField` type field as an array. It doesn't affects any other type fields. --- netbox/netbox/settings.py | 1 + netbox/utilities/custom_inspectors.py | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index cdcc71069..b0e9eaa5b 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -278,6 +278,7 @@ SWAGGER_SETTINGS = { 'DEFAULT_FIELD_INSPECTORS': [ 'utilities.custom_inspectors.NullableBooleanFieldInspector', 'utilities.custom_inspectors.CustomChoiceFieldInspector', + 'utilities.custom_inspectors.TagListFieldInspector', 'drf_yasg.inspectors.CamelCaseJSONFilter', 'drf_yasg.inspectors.ReferencingSerializerInspector', 'drf_yasg.inspectors.RelatedFieldInspector', diff --git a/netbox/utilities/custom_inspectors.py b/netbox/utilities/custom_inspectors.py index ca6e08fc1..3d55f7101 100644 --- a/netbox/utilities/custom_inspectors.py +++ b/netbox/utilities/custom_inspectors.py @@ -1,11 +1,25 @@ from drf_yasg import openapi from drf_yasg.inspectors import FieldInspector, NotHandled, PaginatorInspector, FilterInspector from rest_framework.fields import ChoiceField +from taggit_serializer.serializers import TagListSerializerField from extras.api.customfields import CustomFieldsSerializer from utilities.api import ChoiceField +class TagListFieldInspector(FieldInspector): + 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) + if isinstance(field, TagListSerializerField): + child_schema = self.probe_field_inspectors(field.child, ChildSwaggerType, use_references) + return SwaggerType( + type=openapi.TYPE_ARRAY, + items=child_schema, + ) + + return NotHandled + + class CustomChoiceFieldInspector(FieldInspector): def field_to_swagger_object(self, field, swagger_object_type, use_references, **kwargs): # this returns a callable which extracts title, description and other stuff