Parcourir la source

Enabled creation of device components

Jeremy Stretch il y a 8 ans
Parent
commit
e1cd846c9a
3 fichiers modifiés avec 44 ajouts et 11 suppressions
  1. 7 1
      netbox/dcim/api/serializers.py
  2. 35 7
      netbox/dcim/api/views.py
  3. 2 3
      netbox/utilities/api.py

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

@@ -330,6 +330,7 @@ class DeviceConsoleServerPortSerializer(serializers.HyperlinkedModelSerializer):
     class Meta:
         model = ConsoleServerPort
         fields = ['id', 'url', 'name', 'connected_console']
+        read_only_fields = ['connected_console']
 
 
 #
@@ -351,6 +352,7 @@ class DeviceConsolePortSerializer(serializers.HyperlinkedModelSerializer):
     class Meta:
         model = ConsolePort
         fields = ['id', 'url', 'name', 'cs_port', 'connection_status']
+        read_only_fields = ['cs_port', 'connection_status']
 
 
 #
@@ -371,6 +373,7 @@ class DevicePowerOutletSerializer(serializers.HyperlinkedModelSerializer):
     class Meta:
         model = PowerOutlet
         fields = ['id', 'url', 'name', 'connected_port']
+        read_only_fields = ['connected_port']
 
 
 #
@@ -392,6 +395,7 @@ class DevicePowerPortSerializer(serializers.HyperlinkedModelSerializer):
     class Meta:
         model = PowerPort
         fields = ['id', 'url', 'name', 'power_outlet', 'connection_status']
+        read_only_fields = ['power_outlet', 'connection_status']
 
 
 #
@@ -485,6 +489,7 @@ class DeviceDeviceBaySerializer(serializers.HyperlinkedModelSerializer):
     class Meta:
         model = DeviceBay
         fields = ['id', 'url', 'name', 'installed_device']
+        read_only_fields = ['installed_device']
 
 
 #
@@ -502,7 +507,8 @@ class ModuleSerializer(serializers.ModelSerializer):
 
 class DeviceModuleSerializer(serializers.HyperlinkedModelSerializer):
     url = serializers.HyperlinkedIdentityField(view_name='dcim-api:module-detail')
+    manufacturer = NestedManufacturerSerializer()
 
     class Meta:
         model = Module
-        fields = ['id', 'url', 'parent', 'name', 'manufacturer', 'part_id', 'serial', 'discovered']
+        fields = ['id', 'url', 'name', 'manufacturer', 'part_id', 'serial', 'discovered']

+ 35 - 7
netbox/dcim/api/views.py

@@ -179,13 +179,17 @@ class ConsolePortViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin
     serializer_class = serializers.ConsolePortSerializer
 
 
-class DeviceConsolePortViewSet(CreateModelMixin, ListModelMixin, WritableSerializerMixin, GenericViewSet):
+class DeviceConsolePortViewSet(CreateModelMixin, ListModelMixin, GenericViewSet):
     serializer_class = serializers.DeviceConsolePortSerializer
 
     def get_queryset(self):
         device = get_object_or_404(Device, pk=self.kwargs['pk'])
         return ConsolePort.objects.filter(device=device).select_related('cs_port')
 
+    def perform_create(self, serializer):
+        device = get_object_or_404(Device, pk=self.kwargs['pk'])
+        serializer.save(device=device)
+
 
 #
 # Console Server Ports
@@ -197,13 +201,17 @@ class ConsoleServerPortViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyMode
     serializer_class = serializers.ConsoleServerPortSerializer
 
 
-class DeviceConsoleServerPortViewSet(CreateModelMixin, ListModelMixin, WritableSerializerMixin, GenericViewSet):
+class DeviceConsoleServerPortViewSet(CreateModelMixin, ListModelMixin, GenericViewSet):
     serializer_class = serializers.DeviceConsoleServerPortSerializer
 
     def get_queryset(self):
         device = get_object_or_404(Device, pk=self.kwargs['pk'])
         return ConsoleServerPort.objects.filter(device=device).select_related('connected_console')
 
+    def perform_create(self, serializer):
+        device = get_object_or_404(Device, pk=self.kwargs['pk'])
+        serializer.save(device=device)
+
 
 #
 # Power Ports
@@ -215,13 +223,17 @@ class PowerPortViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin,
     serializer_class = serializers.PowerPortSerializer
 
 
-class DevicePowerPortViewSet(CreateModelMixin, ListModelMixin, WritableSerializerMixin, GenericViewSet):
+class DevicePowerPortViewSet(CreateModelMixin, ListModelMixin, GenericViewSet):
     serializer_class = serializers.DevicePowerPortSerializer
 
     def get_queryset(self):
         device = get_object_or_404(Device, pk=self.kwargs['pk'])
         return PowerPort.objects.filter(device=device).select_related('power_outlet')
 
+    def perform_create(self, serializer):
+        device = get_object_or_404(Device, pk=self.kwargs['pk'])
+        serializer.save(device=device)
+
 
 #
 # Power Outlets
@@ -233,13 +245,17 @@ class PowerOutletViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin
     serializer_class = serializers.PowerOutletSerializer
 
 
-class DevicePowerOutletViewSet(CreateModelMixin, ListModelMixin, WritableSerializerMixin, GenericViewSet):
+class DevicePowerOutletViewSet(CreateModelMixin, ListModelMixin, GenericViewSet):
     serializer_class = serializers.DevicePowerOutletSerializer
 
     def get_queryset(self):
         device = get_object_or_404(Device, pk=self.kwargs['pk'])
         return PowerOutlet.objects.filter(device=device).select_related('connected_port')
 
+    def perform_create(self, serializer):
+        device = get_object_or_404(Device, pk=self.kwargs['pk'])
+        serializer.save(device=device)
+
 
 #
 # Interfaces
@@ -258,7 +274,7 @@ class InterfaceViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin,
         return Response(serializer.data)
 
 
-class DeviceInterfaceViewSet(CreateModelMixin, ListModelMixin, WritableSerializerMixin, GenericViewSet):
+class DeviceInterfaceViewSet(CreateModelMixin, ListModelMixin, GenericViewSet):
     serializer_class = serializers.DeviceInterfaceSerializer
     filter_class = filters.InterfaceFilter
 
@@ -267,6 +283,10 @@ class DeviceInterfaceViewSet(CreateModelMixin, ListModelMixin, WritableSerialize
         return Interface.objects.order_naturally(device.device_type.interface_ordering).filter(device=device)\
             .select_related('connected_as_a', 'connected_as_b', 'circuit_termination')
 
+    def perform_create(self, serializer):
+        device = get_object_or_404(Device, pk=self.kwargs['pk'])
+        serializer.save(device=device)
+
 
 #
 # Device bays
@@ -278,13 +298,17 @@ class DeviceBayViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin,
     serializer_class = serializers.DeviceBaySerializer
 
 
-class DeviceDeviceBayViewSet(CreateModelMixin, ListModelMixin, WritableSerializerMixin, GenericViewSet):
+class DeviceDeviceBayViewSet(CreateModelMixin, ListModelMixin, GenericViewSet):
     serializer_class = serializers.DeviceDeviceBaySerializer
 
     def get_queryset(self):
         device = get_object_or_404(Device, pk=self.kwargs['pk'])
         return DeviceBay.objects.filter(device=device).select_related('installed_device')
 
+    def perform_create(self, serializer):
+        device = get_object_or_404(Device, pk=self.kwargs['pk'])
+        serializer.save(device=device)
+
 
 #
 # Modules
@@ -295,13 +319,17 @@ class ModuleViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, Wri
     serializer_class = serializers.ModuleSerializer
 
 
-class DeviceModuleViewSet(CreateModelMixin, ListModelMixin, WritableSerializerMixin, GenericViewSet):
+class DeviceModuleViewSet(CreateModelMixin, ListModelMixin, GenericViewSet):
     serializer_class = serializers.DeviceModuleSerializer
 
     def get_queryset(self):
         device = get_object_or_404(Device, pk=self.kwargs['pk'])
         return Module.objects.filter(device=device).select_related('device', 'manufacturer')
 
+    def perform_create(self, serializer):
+        device = get_object_or_404(Device, pk=self.kwargs['pk'])
+        serializer.save(device=device)
+
 
 #
 # Interface connections

+ 2 - 3
netbox/utilities/api.py

@@ -20,9 +20,8 @@ class WritableSerializerMixin(object):
 
         class WritableSerializer(ModelSerializer):
 
-            class Meta:
-                model = self.get_queryset().model
-                fields = '__all__'
+            class Meta(self.serializer_class.Meta):
+                pass
 
         if self.action in WRITE_OPERATIONS:
             return WritableSerializer