|
|
@@ -1,14 +1,24 @@
|
|
|
from drf_yasg import openapi
|
|
|
from drf_yasg.inspectors import FieldInspector, NotHandled, PaginatorInspector, FilterInspector, SwaggerAutoSchema
|
|
|
+from drf_yasg.utils import get_serializer_ref_name
|
|
|
from rest_framework.fields import ChoiceField
|
|
|
from rest_framework.relations import ManyRelatedField
|
|
|
from taggit_serializer.serializers import TagListSerializerField
|
|
|
|
|
|
+from dcim.api.serializers import InterfaceSerializer as DCIMInterfaceSerializer
|
|
|
+from virtualization.api.serializers import InterfaceSerializer as VirtualMachineInterfaceSerializer
|
|
|
from extras.api.customfields import CustomFieldsSerializer
|
|
|
from utilities.api import ChoiceField, SerializedPKRelatedField, WritableNestedSerializer
|
|
|
|
|
|
|
|
|
+# this might be ugly, but it limits drf_yasg-specific code to this file
|
|
|
+DCIMInterfaceSerializer.Meta.ref_name = 'DCIMInterface'
|
|
|
+VirtualMachineInterfaceSerializer.Meta.ref_name = 'VirtualMachineInterface'
|
|
|
+
|
|
|
+
|
|
|
class NetBoxSwaggerAutoSchema(SwaggerAutoSchema):
|
|
|
+ writable_serializers = {}
|
|
|
+
|
|
|
def get_request_serializer(self):
|
|
|
serializer = super().get_request_serializer()
|
|
|
|
|
|
@@ -21,7 +31,17 @@ class NetBoxSwaggerAutoSchema(SwaggerAutoSchema):
|
|
|
properties[child_name] = None
|
|
|
|
|
|
if properties:
|
|
|
- writable_class = type('Writable' + type(serializer).__name__, (type(serializer),), 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()
|
|
|
|
|
|
return serializer
|