From 47a89999b84efa32a901c98a37214c9268b0fff1 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 10 Aug 2016 10:44:37 -0400 Subject: [PATCH] Extended DCIM API to include a device modules list --- netbox/dcim/api/serializers.py | 21 ++++++++++++++++++++- netbox/dcim/api/urls.py | 1 + netbox/dcim/api/views.py | 27 ++++++++++++++++----------- 3 files changed, 37 insertions(+), 12 deletions(-) diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index c36612c49..d40488301 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -3,7 +3,7 @@ from rest_framework import serializers from ipam.models import IPAddress from dcim.models import ( ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay, DeviceType, - DeviceRole, Interface, InterfaceConnection, InterfaceTemplate, Manufacturer, Platform, PowerOutlet, + DeviceRole, Interface, InterfaceConnection, InterfaceTemplate, Manufacturer, Module, Platform, PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack, RackGroup, RACK_FACE_FRONT, RACK_FACE_REAR, Site, ) from tenancy.api.serializers import TenantNestedSerializer @@ -385,6 +385,25 @@ class DeviceBayDetailSerializer(DeviceBaySerializer): fields = ['id', 'device', 'name', 'installed_device'] +# +# Modules +# + +class ModuleSerializer(serializers.ModelSerializer): + device = DeviceNestedSerializer() + manufacturer = ManufacturerNestedSerializer() + + class Meta: + model = Module + fields = ['id', 'device', 'parent', 'name', 'manufacturer', 'part_id', 'serial', 'discovered'] + + +class ModuleNestedSerializer(ModuleSerializer): + + class Meta(ModuleSerializer.Meta): + fields = ['id', 'device', 'parent', 'name'] + + # # Interface connections # diff --git a/netbox/dcim/api/urls.py b/netbox/dcim/api/urls.py index a22a661aa..024a06f67 100644 --- a/netbox/dcim/api/urls.py +++ b/netbox/dcim/api/urls.py @@ -50,6 +50,7 @@ urlpatterns = [ url(r'^devices/(?P\d+)/power-outlets/$', PowerOutletListView.as_view(), name='device_poweroutlets'), url(r'^devices/(?P\d+)/interfaces/$', InterfaceListView.as_view(), name='device_interfaces'), url(r'^devices/(?P\d+)/device-bays/$', DeviceBayListView.as_view(), name='device_devicebays'), + url(r'^devices/(?P\d+)/modules/$', ModuleListView.as_view(), name='device_modules'), # Console ports url(r'^console-ports/(?P\d+)/$', ConsolePortView.as_view(), name='consoleport'), diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index e14eb8f87..02dbec2c3 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -10,7 +10,7 @@ from django.shortcuts import get_object_or_404 from dcim.models import ( ConsolePort, ConsoleServerPort, Device, DeviceBay, DeviceRole, DeviceType, IFACE_FF_VIRTUAL, Interface, - InterfaceConnection, Manufacturer, Platform, PowerOutlet, PowerPort, Rack, RackGroup, Site, + InterfaceConnection, Manufacturer, Module, Platform, PowerOutlet, PowerPort, Rack, RackGroup, Site, ) from dcim import filters from .exceptions import MissingFilterException @@ -349,18 +349,23 @@ class DeviceBayListView(generics.ListAPIView): def get_queryset(self): device = get_object_or_404(Device, pk=self.kwargs['pk']) - queryset = DeviceBay.objects.filter(device=device).select_related('installed_device') + return DeviceBay.objects.filter(device=device).select_related('installed_device') - # Filter by type (physical or virtual) - iface_type = self.request.query_params.get('type') - if iface_type == 'physical': - queryset = queryset.exclude(form_factor=IFACE_FF_VIRTUAL) - elif iface_type == 'virtual': - queryset = queryset.filter(form_factor=IFACE_FF_VIRTUAL) - elif iface_type is not None: - queryset = queryset.empty() - return queryset +# +# Modules +# + +class ModuleListView(generics.ListAPIView): + """ + List device modules (by device) + """ + serializer_class = serializers.ModuleSerializer + + def get_queryset(self): + + device = get_object_or_404(Device, pk=self.kwargs['pk']) + return Module.objects.filter(device=device).select_related('device', 'manufacturer') #