mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-23 04:22:01 -06:00
Standardized implementation of nested ViewSets
This commit is contained in:
parent
b8ca530c55
commit
acfba410dd
@ -44,14 +44,6 @@ class CircuitViewSet(CustomFieldModelViewSet):
|
|||||||
return serializers.CircuitSerializer
|
return serializers.CircuitSerializer
|
||||||
|
|
||||||
|
|
||||||
class NestedCircuitTerminationViewSet(CreateModelMixin, ListModelMixin, GenericViewSet):
|
|
||||||
serializer_class = serializers.CircuitTerminationSerializer
|
|
||||||
|
|
||||||
def get_queryset(self):
|
|
||||||
circuit = get_object_or_404(Circuit, pk=self.kwargs['pk'])
|
|
||||||
return CircuitTermination.objects.filter(circuit=circuit).select_related('site', 'interface__device')
|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Circuit Terminations
|
# Circuit Terminations
|
||||||
#
|
#
|
||||||
@ -59,3 +51,11 @@ class NestedCircuitTerminationViewSet(CreateModelMixin, ListModelMixin, GenericV
|
|||||||
class CircuitTerminationViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericViewSet):
|
class CircuitTerminationViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericViewSet):
|
||||||
queryset = CircuitTermination.objects.select_related('site', 'interface__device')
|
queryset = CircuitTermination.objects.select_related('site', 'interface__device')
|
||||||
serializer_class = serializers.CircuitTerminationSerializer
|
serializer_class = serializers.CircuitTerminationSerializer
|
||||||
|
|
||||||
|
|
||||||
|
class NestedCircuitTerminationViewSet(CreateModelMixin, ListModelMixin, GenericViewSet):
|
||||||
|
serializer_class = serializers.CircuitTerminationSerializer
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
circuit = get_object_or_404(Circuit, pk=self.kwargs['pk'])
|
||||||
|
return CircuitTermination.objects.filter(circuit=circuit).select_related('site', 'interface__device')
|
||||||
|
@ -5,29 +5,20 @@ from rest_framework import routers
|
|||||||
from extras.models import GRAPH_TYPE_INTERFACE, GRAPH_TYPE_SITE
|
from extras.models import GRAPH_TYPE_INTERFACE, GRAPH_TYPE_SITE
|
||||||
from extras.api.views import GraphListView, TopologyMapView
|
from extras.api.views import GraphListView, TopologyMapView
|
||||||
|
|
||||||
from .views import (
|
from . import views
|
||||||
|
|
||||||
# Viewsets
|
|
||||||
ConsolePortViewSet, ConsoleServerPortViewSet, DeviceViewSet, DeviceBayViewSet, DeviceRoleViewSet, DeviceTypeViewSet,
|
|
||||||
InterfaceViewSet, ManufacturerViewSet, ModuleViewSet, PlatformViewSet, PowerPortViewSet, PowerOutletViewSet,
|
|
||||||
RackViewSet, RackGroupViewSet, RackRoleViewSet, SiteViewSet,
|
|
||||||
|
|
||||||
# Legacy views
|
|
||||||
ConsolePortView, InterfaceConnectionView, InterfaceConnectionListView, InterfaceDetailView, PowerPortView,
|
|
||||||
LLDPNeighborsView, RackUnitListView, RelatedConnectionsView,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
router = routers.DefaultRouter()
|
router = routers.DefaultRouter()
|
||||||
router.register(r'sites', SiteViewSet)
|
router.register(r'sites', views.SiteViewSet)
|
||||||
router.register(r'rack-groups', RackGroupViewSet)
|
router.register(r'rack-groups', views.RackGroupViewSet)
|
||||||
router.register(r'rack-roles', RackRoleViewSet)
|
router.register(r'rack-roles', views.RackRoleViewSet)
|
||||||
router.register(r'racks', RackViewSet)
|
router.register(r'racks', views.RackViewSet)
|
||||||
router.register(r'manufacturers', ManufacturerViewSet)
|
router.register(r'manufacturers', views.ManufacturerViewSet)
|
||||||
router.register(r'device-types', DeviceTypeViewSet)
|
router.register(r'device-types', views.DeviceTypeViewSet)
|
||||||
router.register(r'device-roles', DeviceRoleViewSet)
|
router.register(r'device-roles', views.DeviceRoleViewSet)
|
||||||
router.register(r'platforms', PlatformViewSet)
|
router.register(r'platforms', views.PlatformViewSet)
|
||||||
router.register(r'devices', DeviceViewSet)
|
router.register(r'devices', views.DeviceViewSet)
|
||||||
|
router.register(r'interface-connections', views.InterfaceConnectionViewSet)
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
|
|
||||||
@ -37,34 +28,47 @@ urlpatterns = [
|
|||||||
url(r'^sites/(?P<pk>\d+)/graphs/$', GraphListView.as_view(), {'type': GRAPH_TYPE_SITE}, name='site_graphs'),
|
url(r'^sites/(?P<pk>\d+)/graphs/$', GraphListView.as_view(), {'type': GRAPH_TYPE_SITE}, name='site_graphs'),
|
||||||
|
|
||||||
# Racks
|
# Racks
|
||||||
url(r'^racks/(?P<pk>\d+)/rack-units/$', RackUnitListView.as_view(), name='rack_units'),
|
url(r'^racks/(?P<pk>\d+)/rack-units/$', views.RackUnitListView.as_view(), name='rack_units'),
|
||||||
|
|
||||||
|
# Device types
|
||||||
|
# TODO: Nested DeviceType components
|
||||||
|
|
||||||
# Devices
|
# Devices
|
||||||
url(r'^devices/(?P<pk>\d+)/lldp-neighbors/$', LLDPNeighborsView.as_view(), name='device_lldp-neighbors'),
|
url(r'^devices/(?P<pk>\d+)/lldp-neighbors/$', views.LLDPNeighborsView.as_view(), name='device_lldp-neighbors'),
|
||||||
url(r'^devices/(?P<pk>\d+)/console-ports/$', ConsolePortViewSet.as_view({'get': 'list'}), name='device_consoleports'),
|
url(r'^devices/(?P<pk>\d+)/console-ports/$', views.NestedConsolePortViewSet.as_view({'get': 'list'}), name='device_consoleports'),
|
||||||
url(r'^devices/(?P<pk>\d+)/console-server-ports/$', ConsoleServerPortViewSet.as_view({'get': 'list'}), name='device_consoleserverports'),
|
url(r'^devices/(?P<pk>\d+)/console-server-ports/$', views.NestedConsoleServerPortViewSet.as_view({'get': 'list'}), name='device_consoleserverports'),
|
||||||
url(r'^devices/(?P<pk>\d+)/power-ports/$', PowerPortViewSet.as_view({'get': 'list'}), name='device_powerports'),
|
url(r'^devices/(?P<pk>\d+)/power-ports/$', views.NestedPowerPortViewSet.as_view({'get': 'list'}), name='device_powerports'),
|
||||||
url(r'^devices/(?P<pk>\d+)/power-outlets/$', PowerOutletViewSet.as_view({'get': 'list'}), name='device_poweroutlets'),
|
url(r'^devices/(?P<pk>\d+)/power-outlets/$', views.NestedPowerOutletViewSet.as_view({'get': 'list'}), name='device_poweroutlets'),
|
||||||
url(r'^devices/(?P<pk>\d+)/interfaces/$', InterfaceViewSet.as_view({'get': 'list'}), name='device_interfaces'),
|
url(r'^devices/(?P<pk>\d+)/interfaces/$', views.NestedInterfaceViewSet.as_view({'get': 'list'}), name='device_interfaces'),
|
||||||
url(r'^devices/(?P<pk>\d+)/device-bays/$', DeviceBayViewSet.as_view({'get': 'list'}), name='device_devicebays'),
|
url(r'^devices/(?P<pk>\d+)/device-bays/$', views.NestedDeviceBayViewSet.as_view({'get': 'list'}), name='device_devicebays'),
|
||||||
url(r'^devices/(?P<pk>\d+)/modules/$', ModuleViewSet.as_view({'get': 'list'}), name='device_modules'),
|
url(r'^devices/(?P<pk>\d+)/modules/$', views.NestedModuleViewSet.as_view({'get': 'list'}), name='device_modules'),
|
||||||
# TODO: Services
|
# TODO: Services
|
||||||
|
|
||||||
# Console ports
|
# Console ports
|
||||||
url(r'^console-ports/(?P<pk>\d+)/$', ConsolePortView.as_view(), name='consoleport'),
|
url(r'^console-ports/(?P<pk>\d+)/$', views.ConsolePortViewSet.as_view({'get': 'retrieve'}), name='consoleport'),
|
||||||
|
|
||||||
|
# Console server ports
|
||||||
|
url(r'^console-server-ports/(?P<pk>\d+)/$', views.ConsoleServerPortViewSet.as_view({'get': 'retrieve'}), name='consoleserverport'),
|
||||||
|
|
||||||
# Power ports
|
# Power ports
|
||||||
url(r'^power-ports/(?P<pk>\d+)/$', PowerPortView.as_view(), name='powerport'),
|
url(r'^power-ports/(?P<pk>\d+)/$', views.PowerPortViewSet.as_view({'get': 'retrieve'}), name='powerport'),
|
||||||
|
|
||||||
|
# Power outlets
|
||||||
|
url(r'^power-outlets/(?P<pk>\d+)/$', views.PowerOutletViewSet.as_view({'get': 'retrieve'}), name='poweroutlet'),
|
||||||
|
|
||||||
# Interfaces
|
# Interfaces
|
||||||
url(r'^interfaces/(?P<pk>\d+)/$', InterfaceDetailView.as_view(), name='interface_detail'),
|
url(r'^interfaces/(?P<pk>\d+)/$', views.InterfaceViewSet.as_view({'get': 'retrieve'}), name='interface'),
|
||||||
url(r'^interfaces/(?P<pk>\d+)/graphs/$', GraphListView.as_view(), {'type': GRAPH_TYPE_INTERFACE},
|
url(r'^interfaces/(?P<pk>\d+)/graphs/$', GraphListView.as_view(), {'type': GRAPH_TYPE_INTERFACE},
|
||||||
name='interface_graphs'),
|
name='interface_graphs'),
|
||||||
url(r'^interface-connections/$', InterfaceConnectionListView.as_view(), name='interfaceconnection_list'),
|
|
||||||
url(r'^interface-connections/(?P<pk>\d+)/$', InterfaceConnectionView.as_view(), name='interfaceconnection_detail'),
|
# Device bays
|
||||||
|
url(r'^device-bays/(?P<pk>\d+)/$', views.DeviceBayViewSet.as_view({'get': 'retrieve'}), name='devicebay'),
|
||||||
|
|
||||||
|
# Modules
|
||||||
|
url(r'^modules/(?P<pk>\d+)/$', views.ModuleViewSet.as_view({'get': 'retrieve'}), name='module'),
|
||||||
|
|
||||||
# Miscellaneous
|
# Miscellaneous
|
||||||
url(r'^related-connections/$', RelatedConnectionsView.as_view(), name='related_connections'),
|
url(r'^related-connections/$', views.RelatedConnectionsView.as_view(), name='related_connections'),
|
||||||
url(r'^topology-maps/(?P<slug>[\w-]+)/$', TopologyMapView.as_view(), name='topology_map'),
|
url(r'^topology-maps/(?P<slug>[\w-]+)/$', TopologyMapView.as_view(), name='topology_map'),
|
||||||
|
|
||||||
]
|
]
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
from rest_framework import generics
|
from rest_framework.mixins import (
|
||||||
from rest_framework.permissions import DjangoModelPermissionsOrAnonReadOnly
|
CreateModelMixin, DestroyModelMixin, ListModelMixin, RetrieveModelMixin, UpdateModelMixin,
|
||||||
|
)
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework.settings import api_settings
|
from rest_framework.settings import api_settings
|
||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView
|
||||||
from rest_framework.viewsets import ModelViewSet
|
from rest_framework.viewsets import GenericViewSet, ModelViewSet
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib.contenttypes.models import ContentType
|
from django.contrib.contenttypes.models import ContentType
|
||||||
@ -11,8 +12,8 @@ from django.http import Http404
|
|||||||
from django.shortcuts import get_object_or_404
|
from django.shortcuts import get_object_or_404
|
||||||
|
|
||||||
from dcim.models import (
|
from dcim.models import (
|
||||||
ConsolePort, ConsoleServerPort, Device, DeviceBay, DeviceRole, DeviceType, IFACE_FF_VIRTUAL, Interface,
|
ConsolePort, ConsoleServerPort, Device, DeviceBay, DeviceRole, DeviceType, Interface, InterfaceConnection,
|
||||||
InterfaceConnection, Manufacturer, Module, Platform, PowerOutlet, PowerPort, Rack, RackGroup, RackRole, Site,
|
Manufacturer, Module, Platform, PowerOutlet, PowerPort, Rack, RackGroup, RackRole, Site,
|
||||||
)
|
)
|
||||||
from dcim import filters
|
from dcim import filters
|
||||||
from extras.api.views import CustomFieldModelViewSet
|
from extras.api.views import CustomFieldModelViewSet
|
||||||
@ -27,9 +28,6 @@ from . import serializers
|
|||||||
#
|
#
|
||||||
|
|
||||||
class SiteViewSet(CustomFieldModelViewSet):
|
class SiteViewSet(CustomFieldModelViewSet):
|
||||||
"""
|
|
||||||
List and retrieve sites
|
|
||||||
"""
|
|
||||||
queryset = Site.objects.select_related('tenant')
|
queryset = Site.objects.select_related('tenant')
|
||||||
serializer_class = serializers.SiteSerializer
|
serializer_class = serializers.SiteSerializer
|
||||||
|
|
||||||
@ -39,9 +37,6 @@ class SiteViewSet(CustomFieldModelViewSet):
|
|||||||
#
|
#
|
||||||
|
|
||||||
class RackGroupViewSet(ModelViewSet):
|
class RackGroupViewSet(ModelViewSet):
|
||||||
"""
|
|
||||||
List and retrieve rack groups
|
|
||||||
"""
|
|
||||||
queryset = RackGroup.objects.select_related('site')
|
queryset = RackGroup.objects.select_related('site')
|
||||||
serializer_class = serializers.RackGroupSerializer
|
serializer_class = serializers.RackGroupSerializer
|
||||||
filter_class = filters.RackGroupFilter
|
filter_class = filters.RackGroupFilter
|
||||||
@ -52,9 +47,6 @@ class RackGroupViewSet(ModelViewSet):
|
|||||||
#
|
#
|
||||||
|
|
||||||
class RackRoleViewSet(ModelViewSet):
|
class RackRoleViewSet(ModelViewSet):
|
||||||
"""
|
|
||||||
List and retrieve rack roles
|
|
||||||
"""
|
|
||||||
queryset = RackRole.objects.all()
|
queryset = RackRole.objects.all()
|
||||||
serializer_class = serializers.RackRoleSerializer
|
serializer_class = serializers.RackRoleSerializer
|
||||||
|
|
||||||
@ -64,9 +56,6 @@ class RackRoleViewSet(ModelViewSet):
|
|||||||
#
|
#
|
||||||
|
|
||||||
class RackViewSet(CustomFieldModelViewSet):
|
class RackViewSet(CustomFieldModelViewSet):
|
||||||
"""
|
|
||||||
List and retrieve racks
|
|
||||||
"""
|
|
||||||
queryset = Rack.objects.select_related('site', 'group__site', 'tenant')
|
queryset = Rack.objects.select_related('site', 'group__site', 'tenant')
|
||||||
filter_class = filters.RackFilter
|
filter_class = filters.RackFilter
|
||||||
|
|
||||||
@ -106,9 +95,6 @@ class RackUnitListView(APIView):
|
|||||||
#
|
#
|
||||||
|
|
||||||
class ManufacturerViewSet(ModelViewSet):
|
class ManufacturerViewSet(ModelViewSet):
|
||||||
"""
|
|
||||||
List and retrieve manufacturers
|
|
||||||
"""
|
|
||||||
queryset = Manufacturer.objects.all()
|
queryset = Manufacturer.objects.all()
|
||||||
serializer_class = serializers.ManufacturerSerializer
|
serializer_class = serializers.ManufacturerSerializer
|
||||||
|
|
||||||
@ -118,9 +104,6 @@ class ManufacturerViewSet(ModelViewSet):
|
|||||||
#
|
#
|
||||||
|
|
||||||
class DeviceTypeViewSet(CustomFieldModelViewSet):
|
class DeviceTypeViewSet(CustomFieldModelViewSet):
|
||||||
"""
|
|
||||||
List and retrieve device types
|
|
||||||
"""
|
|
||||||
queryset = DeviceType.objects.select_related('manufacturer')
|
queryset = DeviceType.objects.select_related('manufacturer')
|
||||||
filter_class = filters.DeviceTypeFilter
|
filter_class = filters.DeviceTypeFilter
|
||||||
|
|
||||||
@ -131,13 +114,10 @@ class DeviceTypeViewSet(CustomFieldModelViewSet):
|
|||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Device roles
|
# Device Roles
|
||||||
#
|
#
|
||||||
|
|
||||||
class DeviceRoleViewSet(ModelViewSet):
|
class DeviceRoleViewSet(ModelViewSet):
|
||||||
"""
|
|
||||||
List and retrieve device roles
|
|
||||||
"""
|
|
||||||
queryset = DeviceRole.objects.all()
|
queryset = DeviceRole.objects.all()
|
||||||
serializer_class = serializers.DeviceRoleSerializer
|
serializer_class = serializers.DeviceRoleSerializer
|
||||||
|
|
||||||
@ -147,9 +127,6 @@ class DeviceRoleViewSet(ModelViewSet):
|
|||||||
#
|
#
|
||||||
|
|
||||||
class PlatformViewSet(ModelViewSet):
|
class PlatformViewSet(ModelViewSet):
|
||||||
"""
|
|
||||||
List and retrieve platforms
|
|
||||||
"""
|
|
||||||
queryset = Platform.objects.all()
|
queryset = Platform.objects.all()
|
||||||
serializer_class = serializers.PlatformSerializer
|
serializer_class = serializers.PlatformSerializer
|
||||||
|
|
||||||
@ -159,9 +136,6 @@ class PlatformViewSet(ModelViewSet):
|
|||||||
#
|
#
|
||||||
|
|
||||||
class DeviceViewSet(CustomFieldModelViewSet):
|
class DeviceViewSet(CustomFieldModelViewSet):
|
||||||
"""
|
|
||||||
List and retrieve devices
|
|
||||||
"""
|
|
||||||
queryset = Device.objects.select_related(
|
queryset = Device.objects.select_related(
|
||||||
'device_type__manufacturer', 'device_role', 'tenant', 'platform', 'rack__site', 'parent_bay',
|
'device_type__manufacturer', 'device_role', 'tenant', 'platform', 'rack__site', 'parent_bay',
|
||||||
).prefetch_related(
|
).prefetch_related(
|
||||||
@ -173,13 +147,15 @@ class DeviceViewSet(CustomFieldModelViewSet):
|
|||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Console ports
|
# Console Ports
|
||||||
#
|
#
|
||||||
|
|
||||||
class ConsolePortViewSet(ModelViewSet):
|
class ConsolePortViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericViewSet):
|
||||||
"""
|
queryset = ConsolePort.objects.select_related('cs_port')
|
||||||
List and retrieve console ports (by device)
|
serializer_class = serializers.ConsolePortSerializer
|
||||||
"""
|
|
||||||
|
|
||||||
|
class NestedConsolePortViewSet(CreateModelMixin, ListModelMixin, GenericViewSet):
|
||||||
serializer_class = serializers.ConsolePortSerializer
|
serializer_class = serializers.ConsolePortSerializer
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
@ -187,20 +163,16 @@ class ConsolePortViewSet(ModelViewSet):
|
|||||||
return ConsolePort.objects.filter(device=device).select_related('cs_port')
|
return ConsolePort.objects.filter(device=device).select_related('cs_port')
|
||||||
|
|
||||||
|
|
||||||
class ConsolePortView(generics.RetrieveUpdateDestroyAPIView):
|
|
||||||
permission_classes = [DjangoModelPermissionsOrAnonReadOnly]
|
|
||||||
serializer_class = serializers.ConsolePortSerializer
|
|
||||||
queryset = ConsolePort.objects.all()
|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Console server ports
|
# Console Server Ports
|
||||||
#
|
#
|
||||||
|
|
||||||
class ConsoleServerPortViewSet(ModelViewSet):
|
class ConsoleServerPortViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericViewSet):
|
||||||
"""
|
queryset = ConsoleServerPort.objects.select_related('connected_console')
|
||||||
List and retrieve console server ports (by device)
|
serializer_class = serializers.ConsoleServerPortSerializer
|
||||||
"""
|
|
||||||
|
|
||||||
|
class NestedConsoleServerPortViewSet(CreateModelMixin, ListModelMixin, GenericViewSet):
|
||||||
serializer_class = serializers.ConsoleServerPortSerializer
|
serializer_class = serializers.ConsoleServerPortSerializer
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
@ -209,13 +181,15 @@ class ConsoleServerPortViewSet(ModelViewSet):
|
|||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Power ports
|
# Power Ports
|
||||||
#
|
#
|
||||||
|
|
||||||
class PowerPortViewSet(ModelViewSet):
|
class PowerPortViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericViewSet):
|
||||||
"""
|
queryset = PowerPort.objects.select_related('power_outlet')
|
||||||
List and retrieve power ports (by device)
|
serializer_class = serializers.PowerPortSerializer
|
||||||
"""
|
|
||||||
|
|
||||||
|
class NestedPowerPortViewSet(CreateModelMixin, ListModelMixin, GenericViewSet):
|
||||||
serializer_class = serializers.PowerPortSerializer
|
serializer_class = serializers.PowerPortSerializer
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
@ -223,20 +197,16 @@ class PowerPortViewSet(ModelViewSet):
|
|||||||
return PowerPort.objects.filter(device=device).select_related('power_outlet')
|
return PowerPort.objects.filter(device=device).select_related('power_outlet')
|
||||||
|
|
||||||
|
|
||||||
class PowerPortView(generics.RetrieveUpdateDestroyAPIView):
|
|
||||||
permission_classes = [DjangoModelPermissionsOrAnonReadOnly]
|
|
||||||
serializer_class = serializers.PowerPortSerializer
|
|
||||||
queryset = PowerPort.objects.all()
|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Power outlets
|
# Power Outlets
|
||||||
#
|
#
|
||||||
|
|
||||||
class PowerOutletViewSet(ModelViewSet):
|
class PowerOutletViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericViewSet):
|
||||||
"""
|
queryset = PowerOutlet.objects.select_related('connected_port')
|
||||||
List and retrieve power outlets (by device)
|
serializer_class = serializers.PowerOutletSerializer
|
||||||
"""
|
|
||||||
|
|
||||||
|
class NestedPowerOutletViewSet(CreateModelMixin, ListModelMixin, GenericViewSet):
|
||||||
serializer_class = serializers.PowerOutletSerializer
|
serializer_class = serializers.PowerOutletSerializer
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
@ -248,61 +218,31 @@ class PowerOutletViewSet(ModelViewSet):
|
|||||||
# Interfaces
|
# Interfaces
|
||||||
#
|
#
|
||||||
|
|
||||||
class InterfaceViewSet(ModelViewSet):
|
class InterfaceViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericViewSet):
|
||||||
"""
|
|
||||||
List and retrieve interfaces (by device)
|
|
||||||
"""
|
|
||||||
serializer_class = serializers.InterfaceSerializer
|
|
||||||
filter_class = filters.InterfaceFilter
|
|
||||||
|
|
||||||
def get_queryset(self):
|
|
||||||
|
|
||||||
device = get_object_or_404(Device, pk=self.kwargs['pk'])
|
|
||||||
queryset = Interface.objects.order_naturally(device.device_type.interface_ordering).filter(device=device)\
|
|
||||||
.select_related('connected_as_a', 'connected_as_b', 'circuit_termination')
|
|
||||||
|
|
||||||
# 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
|
|
||||||
|
|
||||||
|
|
||||||
class InterfaceDetailView(generics.RetrieveAPIView):
|
|
||||||
"""
|
|
||||||
Retrieve a single interface
|
|
||||||
"""
|
|
||||||
queryset = Interface.objects.select_related('device')
|
queryset = Interface.objects.select_related('device')
|
||||||
serializer_class = serializers.InterfaceDetailSerializer
|
serializer_class = serializers.InterfaceDetailSerializer
|
||||||
|
|
||||||
|
|
||||||
class InterfaceConnectionView(generics.RetrieveUpdateDestroyAPIView):
|
class NestedInterfaceViewSet(CreateModelMixin, ListModelMixin, GenericViewSet):
|
||||||
permission_classes = [DjangoModelPermissionsOrAnonReadOnly]
|
serializer_class = serializers.InterfaceSerializer
|
||||||
serializer_class = serializers.InterfaceConnectionSerializer
|
filter_class = filters.InterfaceFilter
|
||||||
queryset = InterfaceConnection.objects.all()
|
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
class InterfaceConnectionListView(generics.ListAPIView):
|
device = get_object_or_404(Device, pk=self.kwargs['pk'])
|
||||||
"""
|
return Interface.objects.order_naturally(device.device_type.interface_ordering).filter(device=device)\
|
||||||
Retrieve a list of all interface connections
|
.select_related('connected_as_a', 'connected_as_b', 'circuit_termination')
|
||||||
"""
|
|
||||||
serializer_class = serializers.InterfaceConnectionSerializer
|
|
||||||
queryset = InterfaceConnection.objects.all()
|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Device bays
|
# Device bays
|
||||||
#
|
#
|
||||||
|
|
||||||
class DeviceBayViewSet(ModelViewSet):
|
class DeviceBayViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericViewSet):
|
||||||
"""
|
queryset = DeviceBay.objects.select_related('installed_device')
|
||||||
List and retrieve device bays (by device)
|
serializer_class = serializers.DeviceBaySerializer
|
||||||
"""
|
|
||||||
|
|
||||||
|
class NestedDeviceBayViewSet(CreateModelMixin, ListModelMixin, GenericViewSet):
|
||||||
serializer_class = serializers.DeviceBayNestedSerializer
|
serializer_class = serializers.DeviceBayNestedSerializer
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
@ -314,10 +254,12 @@ class DeviceBayViewSet(ModelViewSet):
|
|||||||
# Modules
|
# Modules
|
||||||
#
|
#
|
||||||
|
|
||||||
class ModuleViewSet(ModelViewSet):
|
class ModuleViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericViewSet):
|
||||||
"""
|
queryset = Module.objects.select_related('device', 'manufacturer')
|
||||||
List and retrieve modules (by device)
|
serializer_class = serializers.ModuleSerializer
|
||||||
"""
|
|
||||||
|
|
||||||
|
class NestedModuleViewSet(CreateModelMixin, ListModelMixin, GenericViewSet):
|
||||||
serializer_class = serializers.ModuleSerializer
|
serializer_class = serializers.ModuleSerializer
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
@ -325,6 +267,15 @@ class ModuleViewSet(ModelViewSet):
|
|||||||
return Module.objects.filter(device=device).select_related('device', 'manufacturer')
|
return Module.objects.filter(device=device).select_related('device', 'manufacturer')
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Interface connections
|
||||||
|
#
|
||||||
|
|
||||||
|
class InterfaceConnectionViewSet(ModelViewSet):
|
||||||
|
queryset = InterfaceConnection.objects.all()
|
||||||
|
serializer_class = serializers.InterfaceConnectionSerializer
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Live queries
|
# Live queries
|
||||||
#
|
#
|
||||||
|
@ -2,22 +2,19 @@ from django.conf.urls import include, url
|
|||||||
|
|
||||||
from rest_framework import routers
|
from rest_framework import routers
|
||||||
|
|
||||||
from .views import (
|
from . import views
|
||||||
AggregateViewSet, IPAddressViewSet, PrefixViewSet, RIRViewSet, RoleViewSet, ServiceViewSet, VLANViewSet,
|
|
||||||
VLANGroupViewSet, VRFViewSet,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
router = routers.DefaultRouter()
|
router = routers.DefaultRouter()
|
||||||
router.register(r'vrfs', VRFViewSet)
|
router.register(r'vrfs', views.VRFViewSet)
|
||||||
router.register(r'rirs', RIRViewSet)
|
router.register(r'rirs', views.RIRViewSet)
|
||||||
router.register(r'aggregates', AggregateViewSet)
|
router.register(r'aggregates', views.AggregateViewSet)
|
||||||
router.register(r'roles', RoleViewSet)
|
router.register(r'roles', views.RoleViewSet)
|
||||||
router.register(r'prefixes', PrefixViewSet)
|
router.register(r'prefixes', views.PrefixViewSet)
|
||||||
router.register(r'ip-addresses', IPAddressViewSet)
|
router.register(r'ip-addresses', views.IPAddressViewSet)
|
||||||
router.register(r'vlan-groups', VLANGroupViewSet)
|
router.register(r'vlan-groups', views.VLANGroupViewSet)
|
||||||
router.register(r'vlans', VLANViewSet)
|
router.register(r'vlans', views.VLANViewSet)
|
||||||
router.register(r'services', ServiceViewSet)
|
router.register(r'services', views.ServiceViewSet)
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
|
|
||||||
|
@ -12,9 +12,6 @@ from . import serializers
|
|||||||
#
|
#
|
||||||
|
|
||||||
class VRFViewSet(CustomFieldModelViewSet):
|
class VRFViewSet(CustomFieldModelViewSet):
|
||||||
"""
|
|
||||||
List and retrieve VRFs
|
|
||||||
"""
|
|
||||||
queryset = VRF.objects.select_related('tenant')
|
queryset = VRF.objects.select_related('tenant')
|
||||||
serializer_class = serializers.VRFSerializer
|
serializer_class = serializers.VRFSerializer
|
||||||
filter_class = filters.VRFFilter
|
filter_class = filters.VRFFilter
|
||||||
@ -25,9 +22,6 @@ class VRFViewSet(CustomFieldModelViewSet):
|
|||||||
#
|
#
|
||||||
|
|
||||||
class RoleViewSet(ModelViewSet):
|
class RoleViewSet(ModelViewSet):
|
||||||
"""
|
|
||||||
List and retrieve prefix/VLAN roles
|
|
||||||
"""
|
|
||||||
queryset = Role.objects.all()
|
queryset = Role.objects.all()
|
||||||
serializer_class = serializers.RoleSerializer
|
serializer_class = serializers.RoleSerializer
|
||||||
|
|
||||||
@ -37,9 +31,6 @@ class RoleViewSet(ModelViewSet):
|
|||||||
#
|
#
|
||||||
|
|
||||||
class RIRViewSet(ModelViewSet):
|
class RIRViewSet(ModelViewSet):
|
||||||
"""
|
|
||||||
List and retrieve RIRs
|
|
||||||
"""
|
|
||||||
queryset = RIR.objects.all()
|
queryset = RIR.objects.all()
|
||||||
serializer_class = serializers.RIRSerializer
|
serializer_class = serializers.RIRSerializer
|
||||||
|
|
||||||
@ -49,9 +40,6 @@ class RIRViewSet(ModelViewSet):
|
|||||||
#
|
#
|
||||||
|
|
||||||
class AggregateViewSet(CustomFieldModelViewSet):
|
class AggregateViewSet(CustomFieldModelViewSet):
|
||||||
"""
|
|
||||||
List and retrieve aggregates
|
|
||||||
"""
|
|
||||||
queryset = Aggregate.objects.select_related('rir')
|
queryset = Aggregate.objects.select_related('rir')
|
||||||
serializer_class = serializers.AggregateSerializer
|
serializer_class = serializers.AggregateSerializer
|
||||||
filter_class = filters.AggregateFilter
|
filter_class = filters.AggregateFilter
|
||||||
@ -62,9 +50,6 @@ class AggregateViewSet(CustomFieldModelViewSet):
|
|||||||
#
|
#
|
||||||
|
|
||||||
class PrefixViewSet(CustomFieldModelViewSet):
|
class PrefixViewSet(CustomFieldModelViewSet):
|
||||||
"""
|
|
||||||
List and retrieve prefixes
|
|
||||||
"""
|
|
||||||
queryset = Prefix.objects.select_related('site', 'vrf__tenant', 'tenant', 'vlan', 'role')
|
queryset = Prefix.objects.select_related('site', 'vrf__tenant', 'tenant', 'vlan', 'role')
|
||||||
serializer_class = serializers.PrefixSerializer
|
serializer_class = serializers.PrefixSerializer
|
||||||
filter_class = filters.PrefixFilter
|
filter_class = filters.PrefixFilter
|
||||||
@ -75,9 +60,6 @@ class PrefixViewSet(CustomFieldModelViewSet):
|
|||||||
#
|
#
|
||||||
|
|
||||||
class IPAddressViewSet(CustomFieldModelViewSet):
|
class IPAddressViewSet(CustomFieldModelViewSet):
|
||||||
"""
|
|
||||||
List and retrieve IP addresses
|
|
||||||
"""
|
|
||||||
queryset = IPAddress.objects.select_related('vrf__tenant', 'tenant', 'interface__device', 'nat_inside')
|
queryset = IPAddress.objects.select_related('vrf__tenant', 'tenant', 'interface__device', 'nat_inside')
|
||||||
serializer_class = serializers.IPAddressSerializer
|
serializer_class = serializers.IPAddressSerializer
|
||||||
filter_class = filters.IPAddressFilter
|
filter_class = filters.IPAddressFilter
|
||||||
@ -88,9 +70,6 @@ class IPAddressViewSet(CustomFieldModelViewSet):
|
|||||||
#
|
#
|
||||||
|
|
||||||
class VLANGroupViewSet(ModelViewSet):
|
class VLANGroupViewSet(ModelViewSet):
|
||||||
"""
|
|
||||||
List and retrieve VLAN groups
|
|
||||||
"""
|
|
||||||
queryset = VLANGroup.objects.select_related('site')
|
queryset = VLANGroup.objects.select_related('site')
|
||||||
serializer_class = serializers.VLANGroupSerializer
|
serializer_class = serializers.VLANGroupSerializer
|
||||||
filter_class = filters.VLANGroupFilter
|
filter_class = filters.VLANGroupFilter
|
||||||
@ -101,9 +80,6 @@ class VLANGroupViewSet(ModelViewSet):
|
|||||||
#
|
#
|
||||||
|
|
||||||
class VLANViewSet(CustomFieldModelViewSet):
|
class VLANViewSet(CustomFieldModelViewSet):
|
||||||
"""
|
|
||||||
List and retrieve VLANs
|
|
||||||
"""
|
|
||||||
queryset = VLAN.objects.select_related('site', 'group', 'tenant', 'role')
|
queryset = VLAN.objects.select_related('site', 'group', 'tenant', 'role')
|
||||||
serializer_class = serializers.VLANSerializer
|
serializer_class = serializers.VLANSerializer
|
||||||
filter_class = filters.VLANFilter
|
filter_class = filters.VLANFilter
|
||||||
@ -114,9 +90,6 @@ class VLANViewSet(CustomFieldModelViewSet):
|
|||||||
#
|
#
|
||||||
|
|
||||||
class ServiceViewSet(ModelViewSet):
|
class ServiceViewSet(ModelViewSet):
|
||||||
"""
|
|
||||||
List and retrieve services
|
|
||||||
"""
|
|
||||||
queryset = Service.objects.select_related('device').prefetch_related('ipaddresses')
|
queryset = Service.objects.select_related('device').prefetch_related('ipaddresses')
|
||||||
serializer_class = serializers.ServiceSerializer
|
serializer_class = serializers.ServiceSerializer
|
||||||
filter_class = filters.ServiceFilter
|
filter_class = filters.ServiceFilter
|
||||||
|
@ -2,29 +2,21 @@ from django.conf.urls import include, url
|
|||||||
|
|
||||||
from rest_framework import routers
|
from rest_framework import routers
|
||||||
|
|
||||||
from .views import (
|
from . import views
|
||||||
|
|
||||||
# Viewsets
|
|
||||||
SecretRoleViewSet,
|
|
||||||
|
|
||||||
# Legacy views
|
|
||||||
RSAKeyGeneratorView, SecretDetailView, SecretListView,
|
|
||||||
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
router = routers.DefaultRouter()
|
router = routers.DefaultRouter()
|
||||||
router.register(r'secret-roles', SecretRoleViewSet)
|
router.register(r'secret-roles', views.SecretRoleViewSet)
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
|
|
||||||
url(r'', include(router.urls)),
|
url(r'', include(router.urls)),
|
||||||
|
|
||||||
# Secrets
|
# Secrets
|
||||||
url(r'^secrets/$', SecretListView.as_view(), name='secret_list'),
|
url(r'^secrets/$', views.SecretListView.as_view(), name='secret_list'),
|
||||||
url(r'^secrets/(?P<pk>\d+)/$', SecretDetailView.as_view(), name='secret_detail'),
|
url(r'^secrets/(?P<pk>\d+)/$', views.SecretDetailView.as_view(), name='secret_detail'),
|
||||||
|
|
||||||
# Miscellaneous
|
# Miscellaneous
|
||||||
url(r'^generate-keys/$', RSAKeyGeneratorView.as_view(), name='generate_keys'),
|
url(r'^generate-keys/$', views.RSAKeyGeneratorView.as_view(), name='generate_keys'),
|
||||||
|
|
||||||
]
|
]
|
||||||
|
@ -28,9 +28,6 @@ ERR_PRIVKEY_INVALID = "Invalid private key."
|
|||||||
#
|
#
|
||||||
|
|
||||||
class SecretRoleViewSet(ModelViewSet):
|
class SecretRoleViewSet(ModelViewSet):
|
||||||
"""
|
|
||||||
List and retrieve secret roles
|
|
||||||
"""
|
|
||||||
queryset = SecretRole.objects.all()
|
queryset = SecretRole.objects.all()
|
||||||
serializer_class = serializers.SecretRoleSerializer
|
serializer_class = serializers.SecretRoleSerializer
|
||||||
permission_classes = [IsAuthenticated]
|
permission_classes = [IsAuthenticated]
|
||||||
|
@ -2,12 +2,12 @@ from django.conf.urls import include, url
|
|||||||
|
|
||||||
from rest_framework import routers
|
from rest_framework import routers
|
||||||
|
|
||||||
from views import TenantViewSet, TenantGroupViewSet
|
from . import views
|
||||||
|
|
||||||
|
|
||||||
router = routers.DefaultRouter()
|
router = routers.DefaultRouter()
|
||||||
router.register(r'tenant-groups', TenantGroupViewSet)
|
router.register(r'tenant-groups', views.TenantGroupViewSet)
|
||||||
router.register(r'tenants', TenantViewSet)
|
router.register(r'tenants', views.TenantViewSet)
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
|
|
||||||
|
@ -12,9 +12,6 @@ from . import serializers
|
|||||||
#
|
#
|
||||||
|
|
||||||
class TenantGroupViewSet(ModelViewSet):
|
class TenantGroupViewSet(ModelViewSet):
|
||||||
"""
|
|
||||||
List and retrieve tenant groups
|
|
||||||
"""
|
|
||||||
queryset = TenantGroup.objects.all()
|
queryset = TenantGroup.objects.all()
|
||||||
serializer_class = serializers.TenantGroupSerializer
|
serializer_class = serializers.TenantGroupSerializer
|
||||||
|
|
||||||
@ -24,9 +21,6 @@ class TenantGroupViewSet(ModelViewSet):
|
|||||||
#
|
#
|
||||||
|
|
||||||
class TenantViewSet(CustomFieldModelViewSet):
|
class TenantViewSet(CustomFieldModelViewSet):
|
||||||
"""
|
|
||||||
List and retrieve tenants
|
|
||||||
"""
|
|
||||||
queryset = Tenant.objects.select_related('group')
|
queryset = Tenant.objects.select_related('group')
|
||||||
serializer_class = serializers.TenantSerializer
|
serializer_class = serializers.TenantSerializer
|
||||||
filter_class = TenantFilter
|
filter_class = TenantFilter
|
||||||
|
Loading…
Reference in New Issue
Block a user