diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 0fa883d40..41c4eaf9a 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -2,10 +2,10 @@ 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, Module, Platform, PowerOutlet, - PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack, RackGroup, RackRole, Site, SUBDEVICE_ROLE_CHILD, - SUBDEVICE_ROLE_PARENT, + ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay, + DeviceBayTemplate, DeviceType, DeviceRole, Interface, InterfaceConnection, InterfaceTemplate, Manufacturer, Module, + Platform, PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack, RackGroup, RackRole, Site, + SUBDEVICE_ROLE_CHILD, SUBDEVICE_ROLE_PARENT, ) from extras.api.serializers import CustomFieldValueSerializer from tenancy.api.serializers import NestedTenantSerializer @@ -194,46 +194,118 @@ class WritableDeviceTypeSerializer(serializers.ModelSerializer): ] +# +# Console port templates +# + class ConsolePortTemplateSerializer(serializers.ModelSerializer): + device_type = NestedDeviceTypeSerializer() class Meta: model = ConsolePortTemplate - fields = ['id', 'name'] + fields = ['id', 'device_type', 'name'] +class WritableConsolePortTemplateSerializer(serializers.ModelSerializer): + + class Meta: + model = ConsolePortTemplate + fields = ['id', 'device_type', 'name'] + + +# +# Console server port templates +# + class ConsoleServerPortTemplateSerializer(serializers.ModelSerializer): + device_type = NestedDeviceTypeSerializer() class Meta: model = ConsoleServerPortTemplate - fields = ['id', 'name'] + fields = ['id', 'device_type', 'name'] +class WritableConsoleServerPortTemplateSerializer(serializers.ModelSerializer): + + class Meta: + model = ConsoleServerPortTemplate + fields = ['id', 'device_type', 'name'] + + +# +# Power port templates +# + class PowerPortTemplateSerializer(serializers.ModelSerializer): + device_type = NestedDeviceTypeSerializer() class Meta: model = PowerPortTemplate - fields = ['id', 'name'] + fields = ['id', 'device_type', 'name'] +class WritablePowerPortTemplateSerializer(serializers.ModelSerializer): + + class Meta: + model = PowerPortTemplate + fields = ['id', 'device_type', 'name'] + + +# +# Power outlet templates +# + class PowerOutletTemplateSerializer(serializers.ModelSerializer): + device_type = NestedDeviceTypeSerializer() class Meta: model = PowerOutletTemplate - fields = ['id', 'name'] + fields = ['id', 'device_type', 'name'] +class WritablePowerOutletTemplateSerializer(serializers.ModelSerializer): + + class Meta: + model = PowerOutletTemplate + fields = ['id', 'device_type', 'name'] + + +# +# Interface templates +# + class InterfaceTemplateSerializer(serializers.ModelSerializer): + device_type = NestedDeviceTypeSerializer() class Meta: model = InterfaceTemplate - fields = ['id', 'name', 'form_factor', 'mgmt_only'] + fields = ['id', 'device_type', 'name', 'form_factor', 'mgmt_only'] -class DeviceBayTemplateSerializer(serializers.ModelSerializer): +class WritableInterfaceTemplateSerializer(serializers.ModelSerializer): class Meta: - model = DeviceBay - fields = ['id', 'name',] + model = InterfaceTemplate + fields = ['id', 'device_type', 'name', 'form_factor', 'mgmt_only'] + + +# +# Device bay templates +# + +class DeviceBayTemplateSerializer(serializers.ModelSerializer): + device_type = NestedDeviceTypeSerializer() + + class Meta: + model = DeviceBayTemplate + fields = ['id', 'device_type', 'name'] + + +class WritableDeviceBayTemplateSerializer(serializers.ModelSerializer): + + class Meta: + model = DeviceBayTemplate + fields = ['id', 'device_type', 'name'] # @@ -302,7 +374,7 @@ class DeviceSerializer(serializers.ModelSerializer): class Meta: model = Device fields = [ - 'id', 'name', 'display_name', 'device_type', 'device_role', 'tenant', 'platform', 'serial', 'asset_tag', + 'id', 'name', 'display_name', 'device_type', 'device_role', 'tenant', 'platform', 'serial', 'asset_tag', 'rack', 'position', 'face', 'parent_device', 'status', 'primary_ip', 'primary_ip4', 'primary_ip6', 'comments', 'custom_field_values', ] @@ -335,8 +407,8 @@ class WritableDeviceSerializer(serializers.ModelSerializer): class Meta: model = Device fields = [ - 'id', 'name', 'device_type', 'device_role', 'tenant', 'platform', 'serial', 'asset_tag', 'rack', - 'position', 'face', 'status', 'primary_ip4', 'primary_ip6', 'comments', + 'id', 'name', 'device_type', 'device_role', 'tenant', 'platform', 'serial', 'asset_tag', 'rack', 'position', + 'face', 'status', 'primary_ip4', 'primary_ip6', 'comments', ] diff --git a/netbox/dcim/api/urls.py b/netbox/dcim/api/urls.py index 1ce2b518f..1d8eca592 100644 --- a/netbox/dcim/api/urls.py +++ b/netbox/dcim/api/urls.py @@ -21,7 +21,13 @@ router.register(r'racks', views.RackViewSet) router.register(r'manufacturers', views.ManufacturerViewSet) router.register(r'device-types', views.DeviceTypeViewSet) -# TODO: Device type components +# Device type components +router.register(r'console-port-templates', views.ConsolePortTemplateViewSet) +router.register(r'console-server-port-templates', views.ConsoleServerPortTemplateViewSet) +router.register(r'power-port-templates', views.PowerPortTemplateViewSet) +router.register(r'power-outlet-templates', views.PowerOutletTemplateViewSet) +router.register(r'interface-templates', views.InterfaceTemplateViewSet) +router.register(r'device-bay-templates', views.DeviceBayTemplateViewSet) # Devices router.register(r'device-roles', views.DeviceRoleViewSet) diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index 4c7899a6a..e44c29571 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -10,8 +10,9 @@ from django.http import Http404 from django.shortcuts import get_object_or_404 from dcim.models import ( - ConsolePort, ConsoleServerPort, Device, DeviceBay, DeviceRole, DeviceType, Interface, InterfaceConnection, - Manufacturer, Module, Platform, PowerOutlet, PowerPort, Rack, RackGroup, RackRole, Site, + ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay, + DeviceBayTemplate, DeviceRole, DeviceType, Interface, InterfaceConnection, InterfaceTemplate, Manufacturer, Module, + Platform, PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack, RackGroup, RackRole, Site, ) from dcim import filters from extras.api.renderers import BINDZoneRenderer, FlatJSONRenderer @@ -106,7 +107,7 @@ class ManufacturerViewSet(ModelViewSet): # -# Device Types +# Device types # class DeviceTypeViewSet(WritableSerializerMixin, CustomFieldModelViewSet): @@ -116,7 +117,53 @@ class DeviceTypeViewSet(WritableSerializerMixin, CustomFieldModelViewSet): # -# Device Roles +# Device type components +# + +class ConsolePortTemplateViewSet(WritableSerializerMixin, ModelViewSet): + queryset = ConsolePortTemplate.objects.select_related('device_type__manufacturer') + serializer_class = serializers.ConsolePortTemplateSerializer + write_serializer_class = serializers.WritableConsolePortTemplateSerializer + filter_class = filters.ConsolePortTemplateFilter + + +class ConsoleServerPortTemplateViewSet(WritableSerializerMixin, ModelViewSet): + queryset = ConsoleServerPortTemplate.objects.select_related('device_type__manufacturer') + serializer_class = serializers.ConsoleServerPortTemplateSerializer + write_serializer_class = serializers.WritableConsoleServerPortTemplateSerializer + filter_class = filters.ConsoleServerPortTemplateFilter + + +class PowerPortTemplateViewSet(WritableSerializerMixin, ModelViewSet): + queryset = PowerPortTemplate.objects.select_related('device_type__manufacturer') + serializer_class = serializers.PowerPortTemplateSerializer + write_serializer_class = serializers.WritablePowerPortTemplateSerializer + filter_class = filters.PowerPortTemplateFilter + + +class PowerOutletTemplateViewSet(WritableSerializerMixin, ModelViewSet): + queryset = PowerOutletTemplate.objects.select_related('device_type__manufacturer') + serializer_class = serializers.PowerOutletTemplateSerializer + write_serializer_class = serializers.WritablePowerOutletTemplateSerializer + filter_class = filters.PowerOutletTemplateFilter + + +class InterfaceTemplateViewSet(WritableSerializerMixin, ModelViewSet): + queryset = InterfaceTemplate.objects.select_related('device_type__manufacturer') + serializer_class = serializers.InterfaceTemplateSerializer + write_serializer_class = serializers.WritableInterfaceTemplateSerializer + filter_class = filters.InterfaceTemplateFilter + + +class DeviceBayTemplateViewSet(WritableSerializerMixin, ModelViewSet): + queryset = DeviceBayTemplate.objects.select_related('device_type__manufacturer') + serializer_class = serializers.DeviceBayTemplateSerializer + write_serializer_class = serializers.WritableDeviceBayTemplateSerializer + filter_class = filters.DeviceBayTemplateFilter + + +# +# Device roles # class DeviceRoleViewSet(ModelViewSet): @@ -178,35 +225,35 @@ class DeviceViewSet(WritableSerializerMixin, CustomFieldModelViewSet): class ConsolePortViewSet(WritableSerializerMixin, ModelViewSet): queryset = ConsolePort.objects.select_related('device', 'cs_port__device') serializer_class = serializers.ConsolePortSerializer - write_serializer_class= serializers.WritableConsolePortSerializer + write_serializer_class = serializers.WritableConsolePortSerializer filter_class = filters.ConsolePortFilter class ConsoleServerPortViewSet(WritableSerializerMixin, ModelViewSet): queryset = ConsoleServerPort.objects.select_related('device', 'connected_console__device') serializer_class = serializers.ConsoleServerPortSerializer - write_serializer_class= serializers.WritableConsoleServerPortSerializer + write_serializer_class = serializers.WritableConsoleServerPortSerializer filter_class = filters.ConsoleServerPortFilter class PowerPortViewSet(WritableSerializerMixin, ModelViewSet): queryset = PowerPort.objects.select_related('device', 'power_outlet__device') serializer_class = serializers.PowerPortSerializer - write_serializer_class= serializers.WritablePowerPortSerializer + write_serializer_class = serializers.WritablePowerPortSerializer filter_class = filters.PowerPortFilter class PowerOutletViewSet(WritableSerializerMixin, ModelViewSet): queryset = PowerOutlet.objects.select_related('device', 'connected_port__device') serializer_class = serializers.PowerOutletSerializer - write_serializer_class= serializers.WritablePowerOutletSerializer + write_serializer_class = serializers.WritablePowerOutletSerializer filter_class = filters.PowerOutletFilter class InterfaceViewSet(WritableSerializerMixin, ModelViewSet): queryset = Interface.objects.select_related('device') serializer_class = serializers.InterfaceSerializer - write_serializer_class= serializers.WritableInterfaceSerializer + write_serializer_class = serializers.WritableInterfaceSerializer filter_class = filters.InterfaceFilter @detail_route() @@ -220,14 +267,14 @@ class InterfaceViewSet(WritableSerializerMixin, ModelViewSet): class DeviceBayViewSet(WritableSerializerMixin, ModelViewSet): queryset = DeviceBay.objects.select_related('installed_device') serializer_class = serializers.DeviceBaySerializer - write_serializer_class= serializers.WritableDeviceBaySerializer + write_serializer_class = serializers.WritableDeviceBaySerializer filter_class = filters.DeviceBayFilter class ModuleViewSet(WritableSerializerMixin, ModelViewSet): queryset = Module.objects.select_related('device', 'manufacturer') serializer_class = serializers.ModuleSerializer - write_serializer_class= serializers.WritableModuleSerializer + write_serializer_class = serializers.WritableModuleSerializer filter_class = filters.ModuleFilter diff --git a/netbox/dcim/filters.py b/netbox/dcim/filters.py index 60db5913a..1bfdcec80 100644 --- a/netbox/dcim/filters.py +++ b/netbox/dcim/filters.py @@ -7,8 +7,9 @@ from extras.filters import CustomFieldFilterSet from tenancy.models import Tenant from utilities.filters import NullableModelMultipleChoiceFilter from .models import ( - ConsolePort, ConsoleServerPort, Device, DeviceBay, DeviceRole, DeviceType, Interface, InterfaceConnection, - Manufacturer, Module, Platform, PowerOutlet, PowerPort, Rack, RackGroup, RackRole, Site, + ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay, + DeviceBayTemplate, DeviceRole, DeviceType, Interface, InterfaceConnection, InterfaceTemplate, Manufacturer, Module, + Platform, PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack, RackGroup, RackRole, Site, ) @@ -153,6 +154,62 @@ class DeviceTypeFilter(CustomFieldFilterSet, django_filters.FilterSet): ) +class DeviceTypeComponentFilterSet(django_filters.FilterSet): + devicetype_id = django_filters.ModelMultipleChoiceFilter( + name='device_type', + queryset=DeviceType.objects.all(), + label='Device type (ID)', + ) + devicetype = django_filters.ModelMultipleChoiceFilter( + name='device_type', + queryset=DeviceType.objects.all(), + to_field_name='name', + label='Device type (name)', + ) + + +class ConsolePortTemplateFilter(DeviceTypeComponentFilterSet): + + class Meta: + model = ConsolePortTemplate + fields = ['name'] + + +class ConsoleServerPortTemplateFilter(DeviceTypeComponentFilterSet): + + class Meta: + model = ConsoleServerPortTemplate + fields = ['name'] + + +class PowerPortTemplateFilter(DeviceTypeComponentFilterSet): + + class Meta: + model = PowerPortTemplate + fields = ['name'] + + +class PowerOutletTemplateFilter(DeviceTypeComponentFilterSet): + + class Meta: + model = PowerOutletTemplate + fields = ['name'] + + +class InterfaceTemplateFilter(DeviceTypeComponentFilterSet): + + class Meta: + model = InterfaceTemplate + fields = ['name'] + + +class DeviceBayTemplateFilter(DeviceTypeComponentFilterSet): + + class Meta: + model = DeviceBayTemplate + fields = ['name'] + + class DeviceFilter(CustomFieldFilterSet, django_filters.FilterSet): q = django_filters.MethodFilter( action='search', @@ -278,7 +335,7 @@ class DeviceFilter(CustomFieldFilterSet, django_filters.FilterSet): return queryset.none() -class ConsolePortFilter(django_filters.FilterSet): +class DeviceComponentFilterSet(django_filters.FilterSet): device_id = django_filters.ModelMultipleChoiceFilter( name='device', queryset=Device.objects.all(), @@ -291,113 +348,50 @@ class ConsolePortFilter(django_filters.FilterSet): label='Device (name)', ) + +class ConsolePortFilter(DeviceComponentFilterSet): + class Meta: model = ConsolePort fields = ['name'] -class ConsoleServerPortFilter(django_filters.FilterSet): - device_id = django_filters.ModelMultipleChoiceFilter( - name='device', - queryset=Device.objects.all(), - label='Device (ID)', - ) - device = django_filters.ModelMultipleChoiceFilter( - name='device', - queryset=Device.objects.all(), - to_field_name='name', - label='Device (name)', - ) +class ConsoleServerPortFilter(DeviceComponentFilterSet): class Meta: model = ConsoleServerPort fields = ['name'] -class PowerPortFilter(django_filters.FilterSet): - device_id = django_filters.ModelMultipleChoiceFilter( - name='device', - queryset=Device.objects.all(), - label='Device (ID)', - ) - device = django_filters.ModelMultipleChoiceFilter( - name='device', - queryset=Device.objects.all(), - to_field_name='name', - label='Device (name)', - ) +class PowerPortFilter(DeviceComponentFilterSet): class Meta: model = PowerPort fields = ['name'] -class PowerOutletFilter(django_filters.FilterSet): - device_id = django_filters.ModelMultipleChoiceFilter( - name='device', - queryset=Device.objects.all(), - label='Device (ID)', - ) - device = django_filters.ModelMultipleChoiceFilter( - name='device', - queryset=Device.objects.all(), - to_field_name='name', - label='Device (name)', - ) +class PowerOutletFilter(DeviceComponentFilterSet): class Meta: model = PowerOutlet fields = ['name'] -class InterfaceFilter(django_filters.FilterSet): - device_id = django_filters.ModelMultipleChoiceFilter( - name='device', - queryset=Device.objects.all(), - label='Device (ID)', - ) - device = django_filters.ModelMultipleChoiceFilter( - name='device', - queryset=Device.objects.all(), - to_field_name='name', - label='Device (name)', - ) +class InterfaceFilter(DeviceComponentFilterSet): class Meta: model = Interface fields = ['name'] -class DeviceBayFilter(django_filters.FilterSet): - device_id = django_filters.ModelMultipleChoiceFilter( - name='device', - queryset=Device.objects.all(), - label='Device (ID)', - ) - device = django_filters.ModelMultipleChoiceFilter( - name='device', - queryset=Device.objects.all(), - to_field_name='name', - label='Device (name)', - ) +class DeviceBayFilter(DeviceComponentFilterSet): class Meta: model = DeviceBay fields = ['name'] -class ModuleFilter(django_filters.FilterSet): - device_id = django_filters.ModelMultipleChoiceFilter( - name='device', - queryset=Device.objects.all(), - label='Device (ID)', - ) - device = django_filters.ModelMultipleChoiceFilter( - name='device', - queryset=Device.objects.all(), - to_field_name='name', - label='Device (name)', - ) +class ModuleFilter(DeviceComponentFilterSet): class Meta: model = Module