Browse Source

Standardized implementation of nested ViewSets

Jeremy Stretch 8 years ago
parent
commit
acfba410dd

+ 8 - 8
netbox/circuits/api/views.py

@@ -44,14 +44,6 @@ class CircuitViewSet(CustomFieldModelViewSet):
         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
 #
@@ -59,3 +51,11 @@ class NestedCircuitTerminationViewSet(CreateModelMixin, ListModelMixin, GenericV
 class CircuitTerminationViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericViewSet):
     queryset = CircuitTermination.objects.select_related('site', 'interface__device')
     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')

+ 39 - 35
netbox/dcim/api/urls.py

@@ -5,29 +5,20 @@ from rest_framework import routers
 from extras.models import GRAPH_TYPE_INTERFACE, GRAPH_TYPE_SITE
 from extras.api.views import GraphListView, TopologyMapView
 
-from .views import (
-
-    # 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,
-)
+from . import views
 
 
 router = routers.DefaultRouter()
-router.register(r'sites', SiteViewSet)
-router.register(r'rack-groups', RackGroupViewSet)
-router.register(r'rack-roles', RackRoleViewSet)
-router.register(r'racks', RackViewSet)
-router.register(r'manufacturers', ManufacturerViewSet)
-router.register(r'device-types', DeviceTypeViewSet)
-router.register(r'device-roles', DeviceRoleViewSet)
-router.register(r'platforms', PlatformViewSet)
-router.register(r'devices', DeviceViewSet)
+router.register(r'sites', views.SiteViewSet)
+router.register(r'rack-groups', views.RackGroupViewSet)
+router.register(r'rack-roles', views.RackRoleViewSet)
+router.register(r'racks', views.RackViewSet)
+router.register(r'manufacturers', views.ManufacturerViewSet)
+router.register(r'device-types', views.DeviceTypeViewSet)
+router.register(r'device-roles', views.DeviceRoleViewSet)
+router.register(r'platforms', views.PlatformViewSet)
+router.register(r'devices', views.DeviceViewSet)
+router.register(r'interface-connections', views.InterfaceConnectionViewSet)
 
 urlpatterns = [
 
@@ -37,34 +28,47 @@ urlpatterns = [
     url(r'^sites/(?P<pk>\d+)/graphs/$', GraphListView.as_view(), {'type': GRAPH_TYPE_SITE}, name='site_graphs'),
 
     # 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
-    url(r'^devices/(?P<pk>\d+)/lldp-neighbors/$', 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-server-ports/$', ConsoleServerPortViewSet.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-outlets/$', PowerOutletViewSet.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+)/device-bays/$', DeviceBayViewSet.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+)/lldp-neighbors/$', views.LLDPNeighborsView.as_view(), name='device_lldp-neighbors'),
+    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/$', views.NestedConsoleServerPortViewSet.as_view({'get': 'list'}), name='device_consoleserverports'),
+    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/$', views.NestedPowerOutletViewSet.as_view({'get': 'list'}), name='device_poweroutlets'),
+    url(r'^devices/(?P<pk>\d+)/interfaces/$', views.NestedInterfaceViewSet.as_view({'get': 'list'}), name='device_interfaces'),
+    url(r'^devices/(?P<pk>\d+)/device-bays/$', views.NestedDeviceBayViewSet.as_view({'get': 'list'}), name='device_devicebays'),
+    url(r'^devices/(?P<pk>\d+)/modules/$', views.NestedModuleViewSet.as_view({'get': 'list'}), name='device_modules'),
     # TODO: Services
 
     # 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
-    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
-    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},
         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
-    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'),
 
 ]

+ 63 - 112
netbox/dcim/api/views.py

@@ -1,9 +1,10 @@
-from rest_framework import generics
-from rest_framework.permissions import DjangoModelPermissionsOrAnonReadOnly
+from rest_framework.mixins import (
+    CreateModelMixin, DestroyModelMixin, ListModelMixin, RetrieveModelMixin, UpdateModelMixin,
+)
 from rest_framework.response import Response
 from rest_framework.settings import api_settings
 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.contrib.contenttypes.models import ContentType
@@ -11,8 +12,8 @@ from django.http import Http404
 from django.shortcuts import get_object_or_404
 
 from dcim.models import (
-    ConsolePort, ConsoleServerPort, Device, DeviceBay, DeviceRole, DeviceType, IFACE_FF_VIRTUAL, Interface,
-    InterfaceConnection, Manufacturer, Module, Platform, PowerOutlet, PowerPort, Rack, RackGroup, RackRole, Site,
+    ConsolePort, ConsoleServerPort, Device, DeviceBay, DeviceRole, DeviceType, Interface, InterfaceConnection,
+    Manufacturer, Module, Platform, PowerOutlet, PowerPort, Rack, RackGroup, RackRole, Site,
 )
 from dcim import filters
 from extras.api.views import CustomFieldModelViewSet
@@ -27,9 +28,6 @@ from . import serializers
 #
 
 class SiteViewSet(CustomFieldModelViewSet):
-    """
-    List and retrieve sites
-    """
     queryset = Site.objects.select_related('tenant')
     serializer_class = serializers.SiteSerializer
 
@@ -39,9 +37,6 @@ class SiteViewSet(CustomFieldModelViewSet):
 #
 
 class RackGroupViewSet(ModelViewSet):
-    """
-    List and retrieve rack groups
-    """
     queryset = RackGroup.objects.select_related('site')
     serializer_class = serializers.RackGroupSerializer
     filter_class = filters.RackGroupFilter
@@ -52,9 +47,6 @@ class RackGroupViewSet(ModelViewSet):
 #
 
 class RackRoleViewSet(ModelViewSet):
-    """
-    List and retrieve rack roles
-    """
     queryset = RackRole.objects.all()
     serializer_class = serializers.RackRoleSerializer
 
@@ -64,9 +56,6 @@ class RackRoleViewSet(ModelViewSet):
 #
 
 class RackViewSet(CustomFieldModelViewSet):
-    """
-    List and retrieve racks
-    """
     queryset = Rack.objects.select_related('site', 'group__site', 'tenant')
     filter_class = filters.RackFilter
 
@@ -106,9 +95,6 @@ class RackUnitListView(APIView):
 #
 
 class ManufacturerViewSet(ModelViewSet):
-    """
-    List and retrieve manufacturers
-    """
     queryset = Manufacturer.objects.all()
     serializer_class = serializers.ManufacturerSerializer
 
@@ -118,9 +104,6 @@ class ManufacturerViewSet(ModelViewSet):
 #
 
 class DeviceTypeViewSet(CustomFieldModelViewSet):
-    """
-    List and retrieve device types
-    """
     queryset = DeviceType.objects.select_related('manufacturer')
     filter_class = filters.DeviceTypeFilter
 
@@ -131,13 +114,10 @@ class DeviceTypeViewSet(CustomFieldModelViewSet):
 
 
 #
-# Device roles
+# Device Roles
 #
 
 class DeviceRoleViewSet(ModelViewSet):
-    """
-    List and retrieve device roles
-    """
     queryset = DeviceRole.objects.all()
     serializer_class = serializers.DeviceRoleSerializer
 
@@ -147,9 +127,6 @@ class DeviceRoleViewSet(ModelViewSet):
 #
 
 class PlatformViewSet(ModelViewSet):
-    """
-    List and retrieve platforms
-    """
     queryset = Platform.objects.all()
     serializer_class = serializers.PlatformSerializer
 
@@ -159,9 +136,6 @@ class PlatformViewSet(ModelViewSet):
 #
 
 class DeviceViewSet(CustomFieldModelViewSet):
-    """
-    List and retrieve devices
-    """
     queryset = Device.objects.select_related(
         'device_type__manufacturer', 'device_role', 'tenant', 'platform', 'rack__site', 'parent_bay',
     ).prefetch_related(
@@ -173,13 +147,15 @@ class DeviceViewSet(CustomFieldModelViewSet):
 
 
 #
-# Console ports
+# Console Ports
 #
 
-class ConsolePortViewSet(ModelViewSet):
-    """
-    List and retrieve console ports (by device)
-    """
+class ConsolePortViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericViewSet):
+    queryset = ConsolePort.objects.select_related('cs_port')
+    serializer_class = serializers.ConsolePortSerializer
+
+
+class NestedConsolePortViewSet(CreateModelMixin, ListModelMixin, GenericViewSet):
     serializer_class = serializers.ConsolePortSerializer
 
     def get_queryset(self):
@@ -187,20 +163,16 @@ class ConsolePortViewSet(ModelViewSet):
         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):
-    """
-    List and retrieve console server ports (by device)
-    """
+class ConsoleServerPortViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericViewSet):
+    queryset = ConsoleServerPort.objects.select_related('connected_console')
+    serializer_class = serializers.ConsoleServerPortSerializer
+
+
+class NestedConsoleServerPortViewSet(CreateModelMixin, ListModelMixin, GenericViewSet):
     serializer_class = serializers.ConsoleServerPortSerializer
 
     def get_queryset(self):
@@ -209,13 +181,15 @@ class ConsoleServerPortViewSet(ModelViewSet):
 
 
 #
-# Power ports
+# Power Ports
 #
 
-class PowerPortViewSet(ModelViewSet):
-    """
-    List and retrieve power ports (by device)
-    """
+class PowerPortViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericViewSet):
+    queryset = PowerPort.objects.select_related('power_outlet')
+    serializer_class = serializers.PowerPortSerializer
+
+
+class NestedPowerPortViewSet(CreateModelMixin, ListModelMixin, GenericViewSet):
     serializer_class = serializers.PowerPortSerializer
 
     def get_queryset(self):
@@ -223,20 +197,16 @@ class PowerPortViewSet(ModelViewSet):
         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):
-    """
-    List and retrieve power outlets (by device)
-    """
+class PowerOutletViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericViewSet):
+    queryset = PowerOutlet.objects.select_related('connected_port')
+    serializer_class = serializers.PowerOutletSerializer
+
+
+class NestedPowerOutletViewSet(CreateModelMixin, ListModelMixin, GenericViewSet):
     serializer_class = serializers.PowerOutletSerializer
 
     def get_queryset(self):
@@ -248,61 +218,31 @@ class PowerOutletViewSet(ModelViewSet):
 # Interfaces
 #
 
-class InterfaceViewSet(ModelViewSet):
-    """
-    List and retrieve interfaces (by device)
-    """
+class InterfaceViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericViewSet):
+    queryset = Interface.objects.select_related('device')
+    serializer_class = serializers.InterfaceDetailSerializer
+
+
+class NestedInterfaceViewSet(CreateModelMixin, ListModelMixin, GenericViewSet):
     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)\
+        return 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')
-    serializer_class = serializers.InterfaceDetailSerializer
-
-
-class InterfaceConnectionView(generics.RetrieveUpdateDestroyAPIView):
-    permission_classes = [DjangoModelPermissionsOrAnonReadOnly]
-    serializer_class = serializers.InterfaceConnectionSerializer
-    queryset = InterfaceConnection.objects.all()
-
-
-class InterfaceConnectionListView(generics.ListAPIView):
-    """
-    Retrieve a list of all interface connections
-    """
-    serializer_class = serializers.InterfaceConnectionSerializer
-    queryset = InterfaceConnection.objects.all()
-
 
 #
 # Device bays
 #
 
-class DeviceBayViewSet(ModelViewSet):
-    """
-    List and retrieve device bays (by device)
-    """
+class DeviceBayViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericViewSet):
+    queryset = DeviceBay.objects.select_related('installed_device')
+    serializer_class = serializers.DeviceBaySerializer
+
+
+class NestedDeviceBayViewSet(CreateModelMixin, ListModelMixin, GenericViewSet):
     serializer_class = serializers.DeviceBayNestedSerializer
 
     def get_queryset(self):
@@ -314,10 +254,12 @@ class DeviceBayViewSet(ModelViewSet):
 # Modules
 #
 
-class ModuleViewSet(ModelViewSet):
-    """
-    List and retrieve modules (by device)
-    """
+class ModuleViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericViewSet):
+    queryset = Module.objects.select_related('device', 'manufacturer')
+    serializer_class = serializers.ModuleSerializer
+
+
+class NestedModuleViewSet(CreateModelMixin, ListModelMixin, GenericViewSet):
     serializer_class = serializers.ModuleSerializer
 
     def get_queryset(self):
@@ -326,6 +268,15 @@ class ModuleViewSet(ModelViewSet):
 
 
 #
+# Interface connections
+#
+
+class InterfaceConnectionViewSet(ModelViewSet):
+    queryset = InterfaceConnection.objects.all()
+    serializer_class = serializers.InterfaceConnectionSerializer
+
+
+#
 # Live queries
 #
 

+ 10 - 13
netbox/ipam/api/urls.py

@@ -2,22 +2,19 @@ from django.conf.urls import include, url
 
 from rest_framework import routers
 
-from .views import (
-    AggregateViewSet, IPAddressViewSet, PrefixViewSet, RIRViewSet, RoleViewSet, ServiceViewSet, VLANViewSet,
-    VLANGroupViewSet, VRFViewSet,
-)
+from . import views
 
 
 router = routers.DefaultRouter()
-router.register(r'vrfs', VRFViewSet)
-router.register(r'rirs', RIRViewSet)
-router.register(r'aggregates', AggregateViewSet)
-router.register(r'roles', RoleViewSet)
-router.register(r'prefixes', PrefixViewSet)
-router.register(r'ip-addresses', IPAddressViewSet)
-router.register(r'vlan-groups', VLANGroupViewSet)
-router.register(r'vlans', VLANViewSet)
-router.register(r'services', ServiceViewSet)
+router.register(r'vrfs', views.VRFViewSet)
+router.register(r'rirs', views.RIRViewSet)
+router.register(r'aggregates', views.AggregateViewSet)
+router.register(r'roles', views.RoleViewSet)
+router.register(r'prefixes', views.PrefixViewSet)
+router.register(r'ip-addresses', views.IPAddressViewSet)
+router.register(r'vlan-groups', views.VLANGroupViewSet)
+router.register(r'vlans', views.VLANViewSet)
+router.register(r'services', views.ServiceViewSet)
 
 urlpatterns = [
 

+ 0 - 27
netbox/ipam/api/views.py

@@ -12,9 +12,6 @@ from . import serializers
 #
 
 class VRFViewSet(CustomFieldModelViewSet):
-    """
-    List and retrieve VRFs
-    """
     queryset = VRF.objects.select_related('tenant')
     serializer_class = serializers.VRFSerializer
     filter_class = filters.VRFFilter
@@ -25,9 +22,6 @@ class VRFViewSet(CustomFieldModelViewSet):
 #
 
 class RoleViewSet(ModelViewSet):
-    """
-    List and retrieve prefix/VLAN roles
-    """
     queryset = Role.objects.all()
     serializer_class = serializers.RoleSerializer
 
@@ -37,9 +31,6 @@ class RoleViewSet(ModelViewSet):
 #
 
 class RIRViewSet(ModelViewSet):
-    """
-    List and retrieve RIRs
-    """
     queryset = RIR.objects.all()
     serializer_class = serializers.RIRSerializer
 
@@ -49,9 +40,6 @@ class RIRViewSet(ModelViewSet):
 #
 
 class AggregateViewSet(CustomFieldModelViewSet):
-    """
-    List and retrieve aggregates
-    """
     queryset = Aggregate.objects.select_related('rir')
     serializer_class = serializers.AggregateSerializer
     filter_class = filters.AggregateFilter
@@ -62,9 +50,6 @@ class AggregateViewSet(CustomFieldModelViewSet):
 #
 
 class PrefixViewSet(CustomFieldModelViewSet):
-    """
-    List and retrieve prefixes
-    """
     queryset = Prefix.objects.select_related('site', 'vrf__tenant', 'tenant', 'vlan', 'role')
     serializer_class = serializers.PrefixSerializer
     filter_class = filters.PrefixFilter
@@ -75,9 +60,6 @@ class PrefixViewSet(CustomFieldModelViewSet):
 #
 
 class IPAddressViewSet(CustomFieldModelViewSet):
-    """
-    List and retrieve IP addresses
-    """
     queryset = IPAddress.objects.select_related('vrf__tenant', 'tenant', 'interface__device', 'nat_inside')
     serializer_class = serializers.IPAddressSerializer
     filter_class = filters.IPAddressFilter
@@ -88,9 +70,6 @@ class IPAddressViewSet(CustomFieldModelViewSet):
 #
 
 class VLANGroupViewSet(ModelViewSet):
-    """
-    List and retrieve VLAN groups
-    """
     queryset = VLANGroup.objects.select_related('site')
     serializer_class = serializers.VLANGroupSerializer
     filter_class = filters.VLANGroupFilter
@@ -101,9 +80,6 @@ class VLANGroupViewSet(ModelViewSet):
 #
 
 class VLANViewSet(CustomFieldModelViewSet):
-    """
-    List and retrieve VLANs
-    """
     queryset = VLAN.objects.select_related('site', 'group', 'tenant', 'role')
     serializer_class = serializers.VLANSerializer
     filter_class = filters.VLANFilter
@@ -114,9 +90,6 @@ class VLANViewSet(CustomFieldModelViewSet):
 #
 
 class ServiceViewSet(ModelViewSet):
-    """
-    List and retrieve services
-    """
     queryset = Service.objects.select_related('device').prefetch_related('ipaddresses')
     serializer_class = serializers.ServiceSerializer
     filter_class = filters.ServiceFilter

+ 5 - 13
netbox/secrets/api/urls.py

@@ -2,29 +2,21 @@ from django.conf.urls import include, url
 
 from rest_framework import routers
 
-from .views import (
-
-    # Viewsets
-    SecretRoleViewSet,
-
-    # Legacy views
-    RSAKeyGeneratorView, SecretDetailView, SecretListView,
-
-)
+from . import views
 
 
 router = routers.DefaultRouter()
-router.register(r'secret-roles', SecretRoleViewSet)
+router.register(r'secret-roles', views.SecretRoleViewSet)
 
 urlpatterns = [
 
     url(r'', include(router.urls)),
 
     # Secrets
-    url(r'^secrets/$', SecretListView.as_view(), name='secret_list'),
-    url(r'^secrets/(?P<pk>\d+)/$', SecretDetailView.as_view(), name='secret_detail'),
+    url(r'^secrets/$', views.SecretListView.as_view(), name='secret_list'),
+    url(r'^secrets/(?P<pk>\d+)/$', views.SecretDetailView.as_view(), name='secret_detail'),
 
     # Miscellaneous
-    url(r'^generate-keys/$', RSAKeyGeneratorView.as_view(), name='generate_keys'),
+    url(r'^generate-keys/$', views.RSAKeyGeneratorView.as_view(), name='generate_keys'),
 
 ]

+ 0 - 3
netbox/secrets/api/views.py

@@ -28,9 +28,6 @@ ERR_PRIVKEY_INVALID = "Invalid private key."
 #
 
 class SecretRoleViewSet(ModelViewSet):
-    """
-    List and retrieve secret roles
-    """
     queryset = SecretRole.objects.all()
     serializer_class = serializers.SecretRoleSerializer
     permission_classes = [IsAuthenticated]

+ 3 - 3
netbox/tenancy/api/urls.py

@@ -2,12 +2,12 @@ from django.conf.urls import include, url
 
 from rest_framework import routers
 
-from views import TenantViewSet, TenantGroupViewSet
+from . import views
 
 
 router = routers.DefaultRouter()
-router.register(r'tenant-groups', TenantGroupViewSet)
-router.register(r'tenants', TenantViewSet)
+router.register(r'tenant-groups', views.TenantGroupViewSet)
+router.register(r'tenants', views.TenantViewSet)
 
 urlpatterns = [
 

+ 0 - 6
netbox/tenancy/api/views.py

@@ -12,9 +12,6 @@ from . import serializers
 #
 
 class TenantGroupViewSet(ModelViewSet):
-    """
-    List and retrieve tenant groups
-    """
     queryset = TenantGroup.objects.all()
     serializer_class = serializers.TenantGroupSerializer
 
@@ -24,9 +21,6 @@ class TenantGroupViewSet(ModelViewSet):
 #
 
 class TenantViewSet(CustomFieldModelViewSet):
-    """
-    List and retrieve tenants
-    """
     queryset = Tenant.objects.select_related('group')
     serializer_class = serializers.TenantSerializer
     filter_class = TenantFilter