diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 89958bc13..7f4f44b1a 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -506,6 +506,7 @@ REST_FRAMEWORK = { SWAGGER_SETTINGS = { 'DEFAULT_AUTO_SCHEMA_CLASS': 'utilities.custom_inspectors.NetBoxSwaggerAutoSchema', 'DEFAULT_FIELD_INSPECTORS': [ + 'utilities.custom_inspectors.JSONFieldInspector', 'utilities.custom_inspectors.NullableBooleanFieldInspector', 'utilities.custom_inspectors.CustomChoiceFieldInspector', 'utilities.custom_inspectors.TagListFieldInspector', diff --git a/netbox/utilities/custom_inspectors.py b/netbox/utilities/custom_inspectors.py index 3eaf1ccf1..68fe57d82 100644 --- a/netbox/utilities/custom_inspectors.py +++ b/netbox/utilities/custom_inspectors.py @@ -1,3 +1,4 @@ +from django.contrib.postgres.fields import JSONField from drf_yasg import openapi from drf_yasg.inspectors import FieldInspector, NotHandled, PaginatorInspector, FilterInspector, SwaggerAutoSchema from drf_yasg.utils import get_serializer_ref_name @@ -119,6 +120,15 @@ class NullableBooleanFieldInspector(FieldInspector): return result +class JSONFieldInspector(FieldInspector): + """Required because by default, Swagger sees a JSONField as a string and not dict + """ + def process_result(self, result, method_name, obj, **kwargs): + if isinstance(result, openapi.Schema) and isinstance(obj, JSONField): + result.type = 'dict' + return result + + class IdInFilterInspector(FilterInspector): def process_result(self, result, method_name, obj, **kwargs): if isinstance(result, list):