소스 검색

use FieldInspector for JSONField type

Dan Starner 6 년 전
부모
커밋
e6ee9803d4
4개의 변경된 파일11개의 추가작업 그리고 14개의 파일을 삭제
  1. 0 7
      netbox/dcim/api/serializers.py
  2. 1 0
      netbox/netbox/settings.py
  3. 10 0
      netbox/utilities/custom_inspectors.py
  4. 0 7
      netbox/virtualization/api/serializers.py

+ 0 - 7
netbox/dcim/api/serializers.py

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

+ 1 - 0
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',

+ 10 - 0
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):

+ 0 - 7
netbox/virtualization/api/serializers.py

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