From c2c60ce2d7ba5ddd5a18a1340fb12375361534a9 Mon Sep 17 00:00:00 2001 From: Tatsushi Demachi Date: Sat, 15 Sep 2018 06:41:01 +0900 Subject: [PATCH] Fix SerializedPKRelatedField type API expression A field definded as `SerializedPKRelatedField` should be shown as an array of child serializer objects in a response value definition in API view but it is shown as an array of primary key values (usually `integer` type) of a child serializer. This fixes it by introducing a new `FieldInspector` to handle the field. It doesn't affect any other type fields. --- netbox/netbox/settings.py | 1 + netbox/utilities/custom_inspectors.py | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index b0e9eaa5b..aca6f7a4a 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -279,6 +279,7 @@ SWAGGER_SETTINGS = { 'utilities.custom_inspectors.NullableBooleanFieldInspector', 'utilities.custom_inspectors.CustomChoiceFieldInspector', 'utilities.custom_inspectors.TagListFieldInspector', + 'utilities.custom_inspectors.SerializedPKRelatedFieldInspector', '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 3d55f7101..8d294a31e 100644 --- a/netbox/utilities/custom_inspectors.py +++ b/netbox/utilities/custom_inspectors.py @@ -4,7 +4,16 @@ from rest_framework.fields import ChoiceField from taggit_serializer.serializers import TagListSerializerField from extras.api.customfields import CustomFieldsSerializer -from utilities.api import ChoiceField +from utilities.api import ChoiceField, SerializedPKRelatedField + + +class SerializedPKRelatedFieldInspector(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, SerializedPKRelatedField): + return self.probe_field_inspectors(field.serializer(), ChildSwaggerType, use_references) + + return NotHandled class TagListFieldInspector(FieldInspector):