From e1cd846c9a06ff9eca1f6285bf3a54871ee20f51 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 31 Jan 2017 12:19:41 -0500 Subject: [PATCH] Enabled creation of device components --- netbox/dcim/api/serializers.py | 8 ++++++- netbox/dcim/api/views.py | 42 ++++++++++++++++++++++++++++------ netbox/utilities/api.py | 5 ++-- 3 files changed, 44 insertions(+), 11 deletions(-) diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 0c256c1ad..244846672 100644 --- a/netbox/dcim/api/serializers.py +++ b/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'] diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index 1dd26b73d..0f8f5d742 100644 --- a/netbox/dcim/api/views.py +++ b/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 diff --git a/netbox/utilities/api.py b/netbox/utilities/api.py index a69e4f369..939ca3c05 100644 --- a/netbox/utilities/api.py +++ b/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