소스 검색

Corrects error with ListSerializer as request_body

Daniel Sheppard 5 년 전
부모
커밋
fc8f02c180
1개의 변경된 파일30개의 추가작업 그리고 21개의 파일을 삭제
  1. 30 21
      netbox/utilities/custom_inspectors.py

+ 30 - 21
netbox/utilities/custom_inspectors.py

@@ -28,29 +28,38 @@ class NetBoxSwaggerAutoSchema(SwaggerAutoSchema):
         serializer = super().get_request_serializer()
         serializer = super().get_request_serializer()
 
 
         if serializer is not None and self.method in self.implicit_body_methods:
         if serializer is not None and self.method in self.implicit_body_methods:
-            properties = {}
-            for child_name, child in serializer.fields.items():
-                if isinstance(child, (ChoiceField, WritableNestedSerializer)):
-                    properties[child_name] = None
-                elif isinstance(child, ManyRelatedField) and isinstance(child.child_relation, SerializedPKRelatedField):
-                    properties[child_name] = None
-
-            if properties:
-                if type(serializer) not in self.writable_serializers:
-                    writable_name = 'Writable' + type(serializer).__name__
-                    meta_class = getattr(type(serializer), 'Meta', None)
-                    if meta_class:
-                        ref_name = 'Writable' + get_serializer_ref_name(serializer)
-                        writable_meta = type('Meta', (meta_class,), {'ref_name': ref_name})
-                        properties['Meta'] = writable_meta
-
-                    self.writable_serializers[type(serializer)] = type(writable_name, (type(serializer),), properties)
-
-                writable_class = self.writable_serializers[type(serializer)]
-                serializer = writable_class()
-
+            writable_class = self.get_writable_class(serializer)
+            if writable_class is not None:
+                if hasattr(serializer, 'child'):
+                    child_serializer = self.get_writable_class(serializer.child)
+                    serializer = writable_class(child=child_serializer)
+                else:
+                    serializer = writable_class()
         return serializer
         return serializer
 
 
+    def get_writable_class(self, serializer):
+        properties = {}
+        fields = {} if hasattr(serializer, 'child') else serializer.fields
+        for child_name, child in fields.items():
+            if isinstance(child, (ChoiceField, WritableNestedSerializer)):
+                properties[child_name] = None
+            elif isinstance(child, ManyRelatedField) and isinstance(child.child_relation, SerializedPKRelatedField):
+                properties[child_name] = None
+
+        if properties:
+            if type(serializer) not in self.writable_serializers:
+                writable_name = 'Writable' + type(serializer).__name__
+                meta_class = getattr(type(serializer), 'Meta', None)
+                if meta_class:
+                    ref_name = 'Writable' + get_serializer_ref_name(serializer)
+                    writable_meta = type('Meta', (meta_class,), {'ref_name': ref_name})
+                    properties['Meta'] = writable_meta
+
+                self.writable_serializers[type(serializer)] = type(writable_name, (type(serializer),), properties)
+
+            writable_class = self.writable_serializers[type(serializer)]
+            return writable_class
+
 
 
 class SerializedPKRelatedFieldInspector(FieldInspector):
 class SerializedPKRelatedFieldInspector(FieldInspector):
     def field_to_swagger_object(self, field, swagger_object_type, use_references, **kwargs):
     def field_to_swagger_object(self, field, swagger_object_type, use_references, **kwargs):