1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

use FieldInspector for JSONField type

This commit is contained in:
Dan Starner
2020-03-03 12:04:46 -05:00
parent 3070c7e991
commit e6ee9803d4
4 changed files with 11 additions and 14 deletions

View File

@ -376,7 +376,6 @@ class DeviceSerializer(TaggitSerializer, CustomFieldModelSerializer):
cluster = NestedClusterSerializer(required=False, allow_null=True)
virtual_chassis = NestedVirtualChassisSerializer(required=False, allow_null=True)
tags = TagListSerializerField(required=False)
local_context_data = serializers.SerializerMethodField()
class Meta:
model = Device
@ -412,12 +411,6 @@ class DeviceSerializer(TaggitSerializer, CustomFieldModelSerializer):
data['device_bay'] = NestedDeviceBaySerializer(instance=device_bay, context=context).data
return data
@swagger_serializer_method(serializer_or_field=serializers.DictField)
def get_local_context_data(self, obj):
"""Used to strongly type the local_context_data field for Swagger generation
"""
return obj.local_context_data
class DeviceWithConfigContextSerializer(DeviceSerializer):
config_context = serializers.SerializerMethodField()

View File

@ -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',

View File

@ -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):

View File

@ -67,7 +67,6 @@ class VirtualMachineSerializer(TaggitSerializer, CustomFieldModelSerializer):
primary_ip4 = NestedIPAddressSerializer(required=False, allow_null=True)
primary_ip6 = NestedIPAddressSerializer(required=False, allow_null=True)
tags = TagListSerializerField(required=False)
local_context_data = serializers.SerializerMethodField()
class Meta:
model = VirtualMachine
@ -78,12 +77,6 @@ class VirtualMachineSerializer(TaggitSerializer, CustomFieldModelSerializer):
]
validators = []
@swagger_serializer_method(serializer_or_field=serializers.DictField)
def get_local_context_data(self, obj):
"""Used to strongly type the local_context_data field for Swagger generation
"""
return obj.local_context_data
class VirtualMachineWithConfigContextSerializer(VirtualMachineSerializer):
config_context = serializers.SerializerMethodField()