mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
Move CustomFieldModelViewSet functionality into NetBoxModelViewSet
This commit is contained in:
@ -3,7 +3,6 @@ from rest_framework.routers import APIRootView
|
|||||||
from circuits import filtersets
|
from circuits import filtersets
|
||||||
from circuits.models import *
|
from circuits.models import *
|
||||||
from dcim.api.views import PassThroughPortMixin
|
from dcim.api.views import PassThroughPortMixin
|
||||||
from extras.api.views import CustomFieldModelViewSet
|
|
||||||
from netbox.api.viewsets import NetBoxModelViewSet
|
from netbox.api.viewsets import NetBoxModelViewSet
|
||||||
from utilities.utils import count_related
|
from utilities.utils import count_related
|
||||||
from . import serializers
|
from . import serializers
|
||||||
@ -21,7 +20,7 @@ class CircuitsRootView(APIRootView):
|
|||||||
# Providers
|
# Providers
|
||||||
#
|
#
|
||||||
|
|
||||||
class ProviderViewSet(CustomFieldModelViewSet):
|
class ProviderViewSet(NetBoxModelViewSet):
|
||||||
queryset = Provider.objects.prefetch_related('tags').annotate(
|
queryset = Provider.objects.prefetch_related('tags').annotate(
|
||||||
circuit_count=count_related(Circuit, 'provider')
|
circuit_count=count_related(Circuit, 'provider')
|
||||||
)
|
)
|
||||||
@ -33,7 +32,7 @@ class ProviderViewSet(CustomFieldModelViewSet):
|
|||||||
# Circuit Types
|
# Circuit Types
|
||||||
#
|
#
|
||||||
|
|
||||||
class CircuitTypeViewSet(CustomFieldModelViewSet):
|
class CircuitTypeViewSet(NetBoxModelViewSet):
|
||||||
queryset = CircuitType.objects.prefetch_related('tags').annotate(
|
queryset = CircuitType.objects.prefetch_related('tags').annotate(
|
||||||
circuit_count=count_related(Circuit, 'type')
|
circuit_count=count_related(Circuit, 'type')
|
||||||
)
|
)
|
||||||
@ -45,7 +44,7 @@ class CircuitTypeViewSet(CustomFieldModelViewSet):
|
|||||||
# Circuits
|
# Circuits
|
||||||
#
|
#
|
||||||
|
|
||||||
class CircuitViewSet(CustomFieldModelViewSet):
|
class CircuitViewSet(NetBoxModelViewSet):
|
||||||
queryset = Circuit.objects.prefetch_related(
|
queryset = Circuit.objects.prefetch_related(
|
||||||
'type', 'tenant', 'provider', 'termination_a', 'termination_z'
|
'type', 'tenant', 'provider', 'termination_a', 'termination_z'
|
||||||
).prefetch_related('tags')
|
).prefetch_related('tags')
|
||||||
@ -70,7 +69,7 @@ class CircuitTerminationViewSet(PassThroughPortMixin, NetBoxModelViewSet):
|
|||||||
# Provider networks
|
# Provider networks
|
||||||
#
|
#
|
||||||
|
|
||||||
class ProviderNetworkViewSet(CustomFieldModelViewSet):
|
class ProviderNetworkViewSet(NetBoxModelViewSet):
|
||||||
queryset = ProviderNetwork.objects.prefetch_related('tags')
|
queryset = ProviderNetwork.objects.prefetch_related('tags')
|
||||||
serializer_class = serializers.ProviderNetworkSerializer
|
serializer_class = serializers.ProviderNetworkSerializer
|
||||||
filterset_class = filtersets.ProviderNetworkFilterSet
|
filterset_class = filtersets.ProviderNetworkFilterSet
|
||||||
|
@ -14,7 +14,7 @@ from rest_framework.viewsets import ViewSet
|
|||||||
from circuits.models import Circuit
|
from circuits.models import Circuit
|
||||||
from dcim import filtersets
|
from dcim import filtersets
|
||||||
from dcim.models import *
|
from dcim.models import *
|
||||||
from extras.api.views import ConfigContextQuerySetMixin, CustomFieldModelViewSet
|
from extras.api.views import ConfigContextQuerySetMixin
|
||||||
from ipam.models import Prefix, VLAN
|
from ipam.models import Prefix, VLAN
|
||||||
from netbox.api.authentication import IsAuthenticatedOrLoginNotRequired
|
from netbox.api.authentication import IsAuthenticatedOrLoginNotRequired
|
||||||
from netbox.api.exceptions import ServiceUnavailable
|
from netbox.api.exceptions import ServiceUnavailable
|
||||||
@ -103,7 +103,7 @@ class PassThroughPortMixin(object):
|
|||||||
# Regions
|
# Regions
|
||||||
#
|
#
|
||||||
|
|
||||||
class RegionViewSet(CustomFieldModelViewSet):
|
class RegionViewSet(NetBoxModelViewSet):
|
||||||
queryset = Region.objects.add_related_count(
|
queryset = Region.objects.add_related_count(
|
||||||
Region.objects.all(),
|
Region.objects.all(),
|
||||||
Site,
|
Site,
|
||||||
@ -119,7 +119,7 @@ class RegionViewSet(CustomFieldModelViewSet):
|
|||||||
# Site groups
|
# Site groups
|
||||||
#
|
#
|
||||||
|
|
||||||
class SiteGroupViewSet(CustomFieldModelViewSet):
|
class SiteGroupViewSet(NetBoxModelViewSet):
|
||||||
queryset = SiteGroup.objects.add_related_count(
|
queryset = SiteGroup.objects.add_related_count(
|
||||||
SiteGroup.objects.all(),
|
SiteGroup.objects.all(),
|
||||||
Site,
|
Site,
|
||||||
@ -135,7 +135,7 @@ class SiteGroupViewSet(CustomFieldModelViewSet):
|
|||||||
# Sites
|
# Sites
|
||||||
#
|
#
|
||||||
|
|
||||||
class SiteViewSet(CustomFieldModelViewSet):
|
class SiteViewSet(NetBoxModelViewSet):
|
||||||
queryset = Site.objects.prefetch_related(
|
queryset = Site.objects.prefetch_related(
|
||||||
'region', 'tenant', 'asns', 'tags'
|
'region', 'tenant', 'asns', 'tags'
|
||||||
).annotate(
|
).annotate(
|
||||||
@ -154,7 +154,7 @@ class SiteViewSet(CustomFieldModelViewSet):
|
|||||||
# Locations
|
# Locations
|
||||||
#
|
#
|
||||||
|
|
||||||
class LocationViewSet(CustomFieldModelViewSet):
|
class LocationViewSet(NetBoxModelViewSet):
|
||||||
queryset = Location.objects.add_related_count(
|
queryset = Location.objects.add_related_count(
|
||||||
Location.objects.add_related_count(
|
Location.objects.add_related_count(
|
||||||
Location.objects.all(),
|
Location.objects.all(),
|
||||||
@ -176,7 +176,7 @@ class LocationViewSet(CustomFieldModelViewSet):
|
|||||||
# Rack roles
|
# Rack roles
|
||||||
#
|
#
|
||||||
|
|
||||||
class RackRoleViewSet(CustomFieldModelViewSet):
|
class RackRoleViewSet(NetBoxModelViewSet):
|
||||||
queryset = RackRole.objects.prefetch_related('tags').annotate(
|
queryset = RackRole.objects.prefetch_related('tags').annotate(
|
||||||
rack_count=count_related(Rack, 'role')
|
rack_count=count_related(Rack, 'role')
|
||||||
)
|
)
|
||||||
@ -188,7 +188,7 @@ class RackRoleViewSet(CustomFieldModelViewSet):
|
|||||||
# Racks
|
# Racks
|
||||||
#
|
#
|
||||||
|
|
||||||
class RackViewSet(CustomFieldModelViewSet):
|
class RackViewSet(NetBoxModelViewSet):
|
||||||
queryset = Rack.objects.prefetch_related(
|
queryset = Rack.objects.prefetch_related(
|
||||||
'site', 'location', 'role', 'tenant', 'tags'
|
'site', 'location', 'role', 'tenant', 'tags'
|
||||||
).annotate(
|
).annotate(
|
||||||
@ -260,7 +260,7 @@ class RackReservationViewSet(NetBoxModelViewSet):
|
|||||||
# Manufacturers
|
# Manufacturers
|
||||||
#
|
#
|
||||||
|
|
||||||
class ManufacturerViewSet(CustomFieldModelViewSet):
|
class ManufacturerViewSet(NetBoxModelViewSet):
|
||||||
queryset = Manufacturer.objects.prefetch_related('tags').annotate(
|
queryset = Manufacturer.objects.prefetch_related('tags').annotate(
|
||||||
devicetype_count=count_related(DeviceType, 'manufacturer'),
|
devicetype_count=count_related(DeviceType, 'manufacturer'),
|
||||||
inventoryitem_count=count_related(InventoryItem, 'manufacturer'),
|
inventoryitem_count=count_related(InventoryItem, 'manufacturer'),
|
||||||
@ -274,7 +274,7 @@ class ManufacturerViewSet(CustomFieldModelViewSet):
|
|||||||
# Device/module types
|
# Device/module types
|
||||||
#
|
#
|
||||||
|
|
||||||
class DeviceTypeViewSet(CustomFieldModelViewSet):
|
class DeviceTypeViewSet(NetBoxModelViewSet):
|
||||||
queryset = DeviceType.objects.prefetch_related('manufacturer', 'tags').annotate(
|
queryset = DeviceType.objects.prefetch_related('manufacturer', 'tags').annotate(
|
||||||
device_count=count_related(Device, 'device_type')
|
device_count=count_related(Device, 'device_type')
|
||||||
)
|
)
|
||||||
@ -283,7 +283,7 @@ class DeviceTypeViewSet(CustomFieldModelViewSet):
|
|||||||
brief_prefetch_fields = ['manufacturer']
|
brief_prefetch_fields = ['manufacturer']
|
||||||
|
|
||||||
|
|
||||||
class ModuleTypeViewSet(CustomFieldModelViewSet):
|
class ModuleTypeViewSet(NetBoxModelViewSet):
|
||||||
queryset = ModuleType.objects.prefetch_related('manufacturer', 'tags').annotate(
|
queryset = ModuleType.objects.prefetch_related('manufacturer', 'tags').annotate(
|
||||||
# module_count=count_related(Module, 'module_type')
|
# module_count=count_related(Module, 'module_type')
|
||||||
)
|
)
|
||||||
@ -360,7 +360,7 @@ class InventoryItemTemplateViewSet(NetBoxModelViewSet):
|
|||||||
# Device roles
|
# Device roles
|
||||||
#
|
#
|
||||||
|
|
||||||
class DeviceRoleViewSet(CustomFieldModelViewSet):
|
class DeviceRoleViewSet(NetBoxModelViewSet):
|
||||||
queryset = DeviceRole.objects.prefetch_related('tags').annotate(
|
queryset = DeviceRole.objects.prefetch_related('tags').annotate(
|
||||||
device_count=count_related(Device, 'device_role'),
|
device_count=count_related(Device, 'device_role'),
|
||||||
virtualmachine_count=count_related(VirtualMachine, 'role')
|
virtualmachine_count=count_related(VirtualMachine, 'role')
|
||||||
@ -373,7 +373,7 @@ class DeviceRoleViewSet(CustomFieldModelViewSet):
|
|||||||
# Platforms
|
# Platforms
|
||||||
#
|
#
|
||||||
|
|
||||||
class PlatformViewSet(CustomFieldModelViewSet):
|
class PlatformViewSet(NetBoxModelViewSet):
|
||||||
queryset = Platform.objects.prefetch_related('tags').annotate(
|
queryset = Platform.objects.prefetch_related('tags').annotate(
|
||||||
device_count=count_related(Device, 'platform'),
|
device_count=count_related(Device, 'platform'),
|
||||||
virtualmachine_count=count_related(VirtualMachine, 'platform')
|
virtualmachine_count=count_related(VirtualMachine, 'platform')
|
||||||
@ -386,7 +386,7 @@ class PlatformViewSet(CustomFieldModelViewSet):
|
|||||||
# Devices/modules
|
# Devices/modules
|
||||||
#
|
#
|
||||||
|
|
||||||
class DeviceViewSet(ConfigContextQuerySetMixin, CustomFieldModelViewSet):
|
class DeviceViewSet(ConfigContextQuerySetMixin, NetBoxModelViewSet):
|
||||||
queryset = Device.objects.prefetch_related(
|
queryset = Device.objects.prefetch_related(
|
||||||
'device_type__manufacturer', 'device_role', 'tenant', 'platform', 'site', 'location', 'rack', 'parent_bay',
|
'device_type__manufacturer', 'device_role', 'tenant', 'platform', 'site', 'location', 'rack', 'parent_bay',
|
||||||
'virtual_chassis__master', 'primary_ip4__nat_outside', 'primary_ip6__nat_outside', 'tags',
|
'virtual_chassis__master', 'primary_ip4__nat_outside', 'primary_ip6__nat_outside', 'tags',
|
||||||
@ -532,7 +532,7 @@ class DeviceViewSet(ConfigContextQuerySetMixin, CustomFieldModelViewSet):
|
|||||||
return Response(response)
|
return Response(response)
|
||||||
|
|
||||||
|
|
||||||
class ModuleViewSet(CustomFieldModelViewSet):
|
class ModuleViewSet(NetBoxModelViewSet):
|
||||||
queryset = Module.objects.prefetch_related(
|
queryset = Module.objects.prefetch_related(
|
||||||
'device', 'module_bay', 'module_type__manufacturer', 'tags',
|
'device', 'module_bay', 'module_type__manufacturer', 'tags',
|
||||||
)
|
)
|
||||||
@ -633,7 +633,7 @@ class InventoryItemViewSet(NetBoxModelViewSet):
|
|||||||
# Device component roles
|
# Device component roles
|
||||||
#
|
#
|
||||||
|
|
||||||
class InventoryItemRoleViewSet(CustomFieldModelViewSet):
|
class InventoryItemRoleViewSet(NetBoxModelViewSet):
|
||||||
queryset = InventoryItemRole.objects.prefetch_related('tags').annotate(
|
queryset = InventoryItemRole.objects.prefetch_related('tags').annotate(
|
||||||
inventoryitem_count=count_related(InventoryItem, 'role')
|
inventoryitem_count=count_related(InventoryItem, 'role')
|
||||||
)
|
)
|
||||||
@ -685,7 +685,7 @@ class PowerPanelViewSet(NetBoxModelViewSet):
|
|||||||
# Power feeds
|
# Power feeds
|
||||||
#
|
#
|
||||||
|
|
||||||
class PowerFeedViewSet(PathEndpointMixin, CustomFieldModelViewSet):
|
class PowerFeedViewSet(PathEndpointMixin, NetBoxModelViewSet):
|
||||||
queryset = PowerFeed.objects.prefetch_related(
|
queryset = PowerFeed.objects.prefetch_related(
|
||||||
'power_panel', 'rack', '_path__destination', 'cable', '_link_peer', 'tags'
|
'power_panel', 'rack', '_path__destination', 'cable', '_link_peer', 'tags'
|
||||||
)
|
)
|
||||||
|
@ -76,24 +76,6 @@ class CustomFieldViewSet(NetBoxModelViewSet):
|
|||||||
filterset_class = filtersets.CustomFieldFilterSet
|
filterset_class = filtersets.CustomFieldFilterSet
|
||||||
|
|
||||||
|
|
||||||
class CustomFieldModelViewSet(NetBoxModelViewSet):
|
|
||||||
"""
|
|
||||||
Include the applicable set of CustomFields in the ModelViewSet context.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def get_serializer_context(self):
|
|
||||||
|
|
||||||
# Gather all custom fields for the model
|
|
||||||
content_type = ContentType.objects.get_for_model(self.queryset.model)
|
|
||||||
custom_fields = content_type.custom_fields.all()
|
|
||||||
|
|
||||||
context = super().get_serializer_context()
|
|
||||||
context.update({
|
|
||||||
'custom_fields': custom_fields,
|
|
||||||
})
|
|
||||||
return context
|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Custom links
|
# Custom links
|
||||||
#
|
#
|
||||||
|
@ -1,18 +1,17 @@
|
|||||||
from django.core.exceptions import ObjectDoesNotExist, PermissionDenied
|
from django.core.exceptions import ObjectDoesNotExist, PermissionDenied
|
||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
from django_pglocks import advisory_lock
|
|
||||||
from django.shortcuts import get_object_or_404
|
from django.shortcuts import get_object_or_404
|
||||||
|
from django_pglocks import advisory_lock
|
||||||
from drf_yasg.utils import swagger_auto_schema
|
from drf_yasg.utils import swagger_auto_schema
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework.routers import APIRootView
|
from rest_framework.routers import APIRootView
|
||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView
|
||||||
|
|
||||||
|
|
||||||
from dcim.models import Site
|
from dcim.models import Site
|
||||||
from extras.api.views import CustomFieldModelViewSet
|
|
||||||
from ipam import filtersets
|
from ipam import filtersets
|
||||||
from ipam.models import *
|
from ipam.models import *
|
||||||
|
from netbox.api.viewsets import NetBoxModelViewSet
|
||||||
from netbox.api.viewsets.mixins import ObjectValidationMixin
|
from netbox.api.viewsets.mixins import ObjectValidationMixin
|
||||||
from netbox.config import get_config
|
from netbox.config import get_config
|
||||||
from utilities.constants import ADVISORY_LOCK_KEYS
|
from utilities.constants import ADVISORY_LOCK_KEYS
|
||||||
@ -32,13 +31,13 @@ class IPAMRootView(APIRootView):
|
|||||||
# Viewsets
|
# Viewsets
|
||||||
#
|
#
|
||||||
|
|
||||||
class ASNViewSet(CustomFieldModelViewSet):
|
class ASNViewSet(NetBoxModelViewSet):
|
||||||
queryset = ASN.objects.prefetch_related('tenant', 'rir').annotate(site_count=count_related(Site, 'asns'))
|
queryset = ASN.objects.prefetch_related('tenant', 'rir').annotate(site_count=count_related(Site, 'asns'))
|
||||||
serializer_class = serializers.ASNSerializer
|
serializer_class = serializers.ASNSerializer
|
||||||
filterset_class = filtersets.ASNFilterSet
|
filterset_class = filtersets.ASNFilterSet
|
||||||
|
|
||||||
|
|
||||||
class VRFViewSet(CustomFieldModelViewSet):
|
class VRFViewSet(NetBoxModelViewSet):
|
||||||
queryset = VRF.objects.prefetch_related('tenant').prefetch_related(
|
queryset = VRF.objects.prefetch_related('tenant').prefetch_related(
|
||||||
'import_targets', 'export_targets', 'tags'
|
'import_targets', 'export_targets', 'tags'
|
||||||
).annotate(
|
).annotate(
|
||||||
@ -49,13 +48,13 @@ class VRFViewSet(CustomFieldModelViewSet):
|
|||||||
filterset_class = filtersets.VRFFilterSet
|
filterset_class = filtersets.VRFFilterSet
|
||||||
|
|
||||||
|
|
||||||
class RouteTargetViewSet(CustomFieldModelViewSet):
|
class RouteTargetViewSet(NetBoxModelViewSet):
|
||||||
queryset = RouteTarget.objects.prefetch_related('tenant').prefetch_related('tags')
|
queryset = RouteTarget.objects.prefetch_related('tenant').prefetch_related('tags')
|
||||||
serializer_class = serializers.RouteTargetSerializer
|
serializer_class = serializers.RouteTargetSerializer
|
||||||
filterset_class = filtersets.RouteTargetFilterSet
|
filterset_class = filtersets.RouteTargetFilterSet
|
||||||
|
|
||||||
|
|
||||||
class RIRViewSet(CustomFieldModelViewSet):
|
class RIRViewSet(NetBoxModelViewSet):
|
||||||
queryset = RIR.objects.annotate(
|
queryset = RIR.objects.annotate(
|
||||||
aggregate_count=count_related(Aggregate, 'rir')
|
aggregate_count=count_related(Aggregate, 'rir')
|
||||||
).prefetch_related('tags')
|
).prefetch_related('tags')
|
||||||
@ -63,13 +62,13 @@ class RIRViewSet(CustomFieldModelViewSet):
|
|||||||
filterset_class = filtersets.RIRFilterSet
|
filterset_class = filtersets.RIRFilterSet
|
||||||
|
|
||||||
|
|
||||||
class AggregateViewSet(CustomFieldModelViewSet):
|
class AggregateViewSet(NetBoxModelViewSet):
|
||||||
queryset = Aggregate.objects.prefetch_related('rir').prefetch_related('tags')
|
queryset = Aggregate.objects.prefetch_related('rir').prefetch_related('tags')
|
||||||
serializer_class = serializers.AggregateSerializer
|
serializer_class = serializers.AggregateSerializer
|
||||||
filterset_class = filtersets.AggregateFilterSet
|
filterset_class = filtersets.AggregateFilterSet
|
||||||
|
|
||||||
|
|
||||||
class RoleViewSet(CustomFieldModelViewSet):
|
class RoleViewSet(NetBoxModelViewSet):
|
||||||
queryset = Role.objects.annotate(
|
queryset = Role.objects.annotate(
|
||||||
prefix_count=count_related(Prefix, 'role'),
|
prefix_count=count_related(Prefix, 'role'),
|
||||||
vlan_count=count_related(VLAN, 'role')
|
vlan_count=count_related(VLAN, 'role')
|
||||||
@ -78,7 +77,7 @@ class RoleViewSet(CustomFieldModelViewSet):
|
|||||||
filterset_class = filtersets.RoleFilterSet
|
filterset_class = filtersets.RoleFilterSet
|
||||||
|
|
||||||
|
|
||||||
class PrefixViewSet(CustomFieldModelViewSet):
|
class PrefixViewSet(NetBoxModelViewSet):
|
||||||
queryset = Prefix.objects.prefetch_related(
|
queryset = Prefix.objects.prefetch_related(
|
||||||
'site', 'vrf__tenant', 'tenant', 'vlan', 'role', 'tags'
|
'site', 'vrf__tenant', 'tenant', 'vlan', 'role', 'tags'
|
||||||
)
|
)
|
||||||
@ -93,7 +92,7 @@ class PrefixViewSet(CustomFieldModelViewSet):
|
|||||||
return super().get_serializer_class()
|
return super().get_serializer_class()
|
||||||
|
|
||||||
|
|
||||||
class IPRangeViewSet(CustomFieldModelViewSet):
|
class IPRangeViewSet(NetBoxModelViewSet):
|
||||||
queryset = IPRange.objects.prefetch_related('vrf', 'role', 'tenant', 'tags')
|
queryset = IPRange.objects.prefetch_related('vrf', 'role', 'tenant', 'tags')
|
||||||
serializer_class = serializers.IPRangeSerializer
|
serializer_class = serializers.IPRangeSerializer
|
||||||
filterset_class = filtersets.IPRangeFilterSet
|
filterset_class = filtersets.IPRangeFilterSet
|
||||||
@ -101,7 +100,7 @@ class IPRangeViewSet(CustomFieldModelViewSet):
|
|||||||
parent_model = IPRange # AvailableIPsMixin
|
parent_model = IPRange # AvailableIPsMixin
|
||||||
|
|
||||||
|
|
||||||
class IPAddressViewSet(CustomFieldModelViewSet):
|
class IPAddressViewSet(NetBoxModelViewSet):
|
||||||
queryset = IPAddress.objects.prefetch_related(
|
queryset = IPAddress.objects.prefetch_related(
|
||||||
'vrf__tenant', 'tenant', 'nat_inside', 'nat_outside', 'tags', 'assigned_object'
|
'vrf__tenant', 'tenant', 'nat_inside', 'nat_outside', 'tags', 'assigned_object'
|
||||||
)
|
)
|
||||||
@ -109,20 +108,20 @@ class IPAddressViewSet(CustomFieldModelViewSet):
|
|||||||
filterset_class = filtersets.IPAddressFilterSet
|
filterset_class = filtersets.IPAddressFilterSet
|
||||||
|
|
||||||
|
|
||||||
class FHRPGroupViewSet(CustomFieldModelViewSet):
|
class FHRPGroupViewSet(NetBoxModelViewSet):
|
||||||
queryset = FHRPGroup.objects.prefetch_related('ip_addresses', 'tags')
|
queryset = FHRPGroup.objects.prefetch_related('ip_addresses', 'tags')
|
||||||
serializer_class = serializers.FHRPGroupSerializer
|
serializer_class = serializers.FHRPGroupSerializer
|
||||||
filterset_class = filtersets.FHRPGroupFilterSet
|
filterset_class = filtersets.FHRPGroupFilterSet
|
||||||
brief_prefetch_fields = ('ip_addresses',)
|
brief_prefetch_fields = ('ip_addresses',)
|
||||||
|
|
||||||
|
|
||||||
class FHRPGroupAssignmentViewSet(CustomFieldModelViewSet):
|
class FHRPGroupAssignmentViewSet(NetBoxModelViewSet):
|
||||||
queryset = FHRPGroupAssignment.objects.prefetch_related('group', 'interface')
|
queryset = FHRPGroupAssignment.objects.prefetch_related('group', 'interface')
|
||||||
serializer_class = serializers.FHRPGroupAssignmentSerializer
|
serializer_class = serializers.FHRPGroupAssignmentSerializer
|
||||||
filterset_class = filtersets.FHRPGroupAssignmentFilterSet
|
filterset_class = filtersets.FHRPGroupAssignmentFilterSet
|
||||||
|
|
||||||
|
|
||||||
class VLANGroupViewSet(CustomFieldModelViewSet):
|
class VLANGroupViewSet(NetBoxModelViewSet):
|
||||||
queryset = VLANGroup.objects.annotate(
|
queryset = VLANGroup.objects.annotate(
|
||||||
vlan_count=count_related(VLAN, 'group')
|
vlan_count=count_related(VLAN, 'group')
|
||||||
).prefetch_related('tags')
|
).prefetch_related('tags')
|
||||||
@ -130,7 +129,7 @@ class VLANGroupViewSet(CustomFieldModelViewSet):
|
|||||||
filterset_class = filtersets.VLANGroupFilterSet
|
filterset_class = filtersets.VLANGroupFilterSet
|
||||||
|
|
||||||
|
|
||||||
class VLANViewSet(CustomFieldModelViewSet):
|
class VLANViewSet(NetBoxModelViewSet):
|
||||||
queryset = VLAN.objects.prefetch_related(
|
queryset = VLAN.objects.prefetch_related(
|
||||||
'site', 'group', 'tenant', 'role', 'tags'
|
'site', 'group', 'tenant', 'role', 'tags'
|
||||||
).annotate(
|
).annotate(
|
||||||
@ -140,13 +139,13 @@ class VLANViewSet(CustomFieldModelViewSet):
|
|||||||
filterset_class = filtersets.VLANFilterSet
|
filterset_class = filtersets.VLANFilterSet
|
||||||
|
|
||||||
|
|
||||||
class ServiceTemplateViewSet(CustomFieldModelViewSet):
|
class ServiceTemplateViewSet(NetBoxModelViewSet):
|
||||||
queryset = ServiceTemplate.objects.prefetch_related('tags')
|
queryset = ServiceTemplate.objects.prefetch_related('tags')
|
||||||
serializer_class = serializers.ServiceTemplateSerializer
|
serializer_class = serializers.ServiceTemplateSerializer
|
||||||
filterset_class = filtersets.ServiceTemplateFilterSet
|
filterset_class = filtersets.ServiceTemplateFilterSet
|
||||||
|
|
||||||
|
|
||||||
class ServiceViewSet(CustomFieldModelViewSet):
|
class ServiceViewSet(NetBoxModelViewSet):
|
||||||
queryset = Service.objects.prefetch_related(
|
queryset = Service.objects.prefetch_related(
|
||||||
'device', 'virtual_machine', 'tags', 'ipaddresses'
|
'device', 'virtual_machine', 'tags', 'ipaddresses'
|
||||||
)
|
)
|
||||||
|
@ -70,6 +70,20 @@ class NetBoxModelViewSet(BulkUpdateModelMixin, BulkDestroyModelMixin, ObjectVali
|
|||||||
logger.debug(f"Using serializer {self.serializer_class}")
|
logger.debug(f"Using serializer {self.serializer_class}")
|
||||||
return self.serializer_class
|
return self.serializer_class
|
||||||
|
|
||||||
|
def get_serializer_context(self):
|
||||||
|
"""
|
||||||
|
For models which support custom fields, populate the `custom_fields` context.
|
||||||
|
"""
|
||||||
|
context = super().get_serializer_context()
|
||||||
|
|
||||||
|
if hasattr(self.queryset.model, 'custom_fields'):
|
||||||
|
content_type = ContentType.objects.get_for_model(self.queryset.model)
|
||||||
|
context.update({
|
||||||
|
'custom_fields': content_type.custom_fields.all(),
|
||||||
|
})
|
||||||
|
|
||||||
|
return context
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
# If using brief mode, clear all prefetches from the queryset and append only brief_prefetch_fields (if any)
|
# If using brief mode, clear all prefetches from the queryset and append only brief_prefetch_fields (if any)
|
||||||
if self.brief:
|
if self.brief:
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
from rest_framework.routers import APIRootView
|
from rest_framework.routers import APIRootView
|
||||||
|
|
||||||
from circuits.models import Circuit
|
from circuits.models import Circuit
|
||||||
from dcim.models import Device, Rack, Site, Cable
|
from dcim.models import Device, Rack, Site
|
||||||
from extras.api.views import CustomFieldModelViewSet
|
|
||||||
from ipam.models import IPAddress, Prefix, VLAN, VRF
|
from ipam.models import IPAddress, Prefix, VLAN, VRF
|
||||||
|
from netbox.api.viewsets import NetBoxModelViewSet
|
||||||
from tenancy import filtersets
|
from tenancy import filtersets
|
||||||
from tenancy.models import *
|
from tenancy.models import *
|
||||||
from utilities.utils import count_related
|
from utilities.utils import count_related
|
||||||
@ -23,7 +23,7 @@ class TenancyRootView(APIRootView):
|
|||||||
# Tenants
|
# Tenants
|
||||||
#
|
#
|
||||||
|
|
||||||
class TenantGroupViewSet(CustomFieldModelViewSet):
|
class TenantGroupViewSet(NetBoxModelViewSet):
|
||||||
queryset = TenantGroup.objects.add_related_count(
|
queryset = TenantGroup.objects.add_related_count(
|
||||||
TenantGroup.objects.all(),
|
TenantGroup.objects.all(),
|
||||||
Tenant,
|
Tenant,
|
||||||
@ -35,7 +35,7 @@ class TenantGroupViewSet(CustomFieldModelViewSet):
|
|||||||
filterset_class = filtersets.TenantGroupFilterSet
|
filterset_class = filtersets.TenantGroupFilterSet
|
||||||
|
|
||||||
|
|
||||||
class TenantViewSet(CustomFieldModelViewSet):
|
class TenantViewSet(NetBoxModelViewSet):
|
||||||
queryset = Tenant.objects.prefetch_related(
|
queryset = Tenant.objects.prefetch_related(
|
||||||
'group', 'tags'
|
'group', 'tags'
|
||||||
).annotate(
|
).annotate(
|
||||||
@ -58,7 +58,7 @@ class TenantViewSet(CustomFieldModelViewSet):
|
|||||||
# Contacts
|
# Contacts
|
||||||
#
|
#
|
||||||
|
|
||||||
class ContactGroupViewSet(CustomFieldModelViewSet):
|
class ContactGroupViewSet(NetBoxModelViewSet):
|
||||||
queryset = ContactGroup.objects.add_related_count(
|
queryset = ContactGroup.objects.add_related_count(
|
||||||
ContactGroup.objects.all(),
|
ContactGroup.objects.all(),
|
||||||
Contact,
|
Contact,
|
||||||
@ -70,19 +70,19 @@ class ContactGroupViewSet(CustomFieldModelViewSet):
|
|||||||
filterset_class = filtersets.ContactGroupFilterSet
|
filterset_class = filtersets.ContactGroupFilterSet
|
||||||
|
|
||||||
|
|
||||||
class ContactRoleViewSet(CustomFieldModelViewSet):
|
class ContactRoleViewSet(NetBoxModelViewSet):
|
||||||
queryset = ContactRole.objects.prefetch_related('tags')
|
queryset = ContactRole.objects.prefetch_related('tags')
|
||||||
serializer_class = serializers.ContactRoleSerializer
|
serializer_class = serializers.ContactRoleSerializer
|
||||||
filterset_class = filtersets.ContactRoleFilterSet
|
filterset_class = filtersets.ContactRoleFilterSet
|
||||||
|
|
||||||
|
|
||||||
class ContactViewSet(CustomFieldModelViewSet):
|
class ContactViewSet(NetBoxModelViewSet):
|
||||||
queryset = Contact.objects.prefetch_related('group', 'tags')
|
queryset = Contact.objects.prefetch_related('group', 'tags')
|
||||||
serializer_class = serializers.ContactSerializer
|
serializer_class = serializers.ContactSerializer
|
||||||
filterset_class = filtersets.ContactFilterSet
|
filterset_class = filtersets.ContactFilterSet
|
||||||
|
|
||||||
|
|
||||||
class ContactAssignmentViewSet(CustomFieldModelViewSet):
|
class ContactAssignmentViewSet(NetBoxModelViewSet):
|
||||||
queryset = ContactAssignment.objects.prefetch_related('object', 'contact', 'role')
|
queryset = ContactAssignment.objects.prefetch_related('object', 'contact', 'role')
|
||||||
serializer_class = serializers.ContactAssignmentSerializer
|
serializer_class = serializers.ContactAssignmentSerializer
|
||||||
filterset_class = filtersets.ContactAssignmentFilterSet
|
filterset_class = filtersets.ContactAssignmentFilterSet
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
from rest_framework.routers import APIRootView
|
from rest_framework.routers import APIRootView
|
||||||
|
|
||||||
from dcim.models import Device
|
from dcim.models import Device
|
||||||
from extras.api.views import ConfigContextQuerySetMixin, CustomFieldModelViewSet, NetBoxModelViewSet
|
from extras.api.views import ConfigContextQuerySetMixin
|
||||||
|
from netbox.api.viewsets import NetBoxModelViewSet
|
||||||
from utilities.utils import count_related
|
from utilities.utils import count_related
|
||||||
from virtualization import filtersets
|
from virtualization import filtersets
|
||||||
from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface
|
from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface
|
||||||
@ -20,7 +21,7 @@ class VirtualizationRootView(APIRootView):
|
|||||||
# Clusters
|
# Clusters
|
||||||
#
|
#
|
||||||
|
|
||||||
class ClusterTypeViewSet(CustomFieldModelViewSet):
|
class ClusterTypeViewSet(NetBoxModelViewSet):
|
||||||
queryset = ClusterType.objects.annotate(
|
queryset = ClusterType.objects.annotate(
|
||||||
cluster_count=count_related(Cluster, 'type')
|
cluster_count=count_related(Cluster, 'type')
|
||||||
).prefetch_related('tags')
|
).prefetch_related('tags')
|
||||||
@ -28,7 +29,7 @@ class ClusterTypeViewSet(CustomFieldModelViewSet):
|
|||||||
filterset_class = filtersets.ClusterTypeFilterSet
|
filterset_class = filtersets.ClusterTypeFilterSet
|
||||||
|
|
||||||
|
|
||||||
class ClusterGroupViewSet(CustomFieldModelViewSet):
|
class ClusterGroupViewSet(NetBoxModelViewSet):
|
||||||
queryset = ClusterGroup.objects.annotate(
|
queryset = ClusterGroup.objects.annotate(
|
||||||
cluster_count=count_related(Cluster, 'group')
|
cluster_count=count_related(Cluster, 'group')
|
||||||
).prefetch_related('tags')
|
).prefetch_related('tags')
|
||||||
@ -36,7 +37,7 @@ class ClusterGroupViewSet(CustomFieldModelViewSet):
|
|||||||
filterset_class = filtersets.ClusterGroupFilterSet
|
filterset_class = filtersets.ClusterGroupFilterSet
|
||||||
|
|
||||||
|
|
||||||
class ClusterViewSet(CustomFieldModelViewSet):
|
class ClusterViewSet(NetBoxModelViewSet):
|
||||||
queryset = Cluster.objects.prefetch_related(
|
queryset = Cluster.objects.prefetch_related(
|
||||||
'type', 'group', 'tenant', 'site', 'tags'
|
'type', 'group', 'tenant', 'site', 'tags'
|
||||||
).annotate(
|
).annotate(
|
||||||
@ -51,7 +52,7 @@ class ClusterViewSet(CustomFieldModelViewSet):
|
|||||||
# Virtual machines
|
# Virtual machines
|
||||||
#
|
#
|
||||||
|
|
||||||
class VirtualMachineViewSet(ConfigContextQuerySetMixin, CustomFieldModelViewSet):
|
class VirtualMachineViewSet(ConfigContextQuerySetMixin, NetBoxModelViewSet):
|
||||||
queryset = VirtualMachine.objects.prefetch_related(
|
queryset = VirtualMachine.objects.prefetch_related(
|
||||||
'cluster__site', 'role', 'tenant', 'platform', 'primary_ip4', 'primary_ip6', 'tags'
|
'cluster__site', 'role', 'tenant', 'platform', 'primary_ip4', 'primary_ip6', 'tags'
|
||||||
)
|
)
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
from rest_framework.routers import APIRootView
|
from rest_framework.routers import APIRootView
|
||||||
|
|
||||||
from extras.api.views import CustomFieldModelViewSet
|
from netbox.api.viewsets import NetBoxModelViewSet
|
||||||
from wireless import filtersets
|
from wireless import filtersets
|
||||||
from wireless.models import *
|
from wireless.models import *
|
||||||
from . import serializers
|
from . import serializers
|
||||||
@ -14,7 +14,7 @@ class WirelessRootView(APIRootView):
|
|||||||
return 'Wireless'
|
return 'Wireless'
|
||||||
|
|
||||||
|
|
||||||
class WirelessLANGroupViewSet(CustomFieldModelViewSet):
|
class WirelessLANGroupViewSet(NetBoxModelViewSet):
|
||||||
queryset = WirelessLANGroup.objects.add_related_count(
|
queryset = WirelessLANGroup.objects.add_related_count(
|
||||||
WirelessLANGroup.objects.all(),
|
WirelessLANGroup.objects.all(),
|
||||||
WirelessLAN,
|
WirelessLAN,
|
||||||
@ -26,13 +26,13 @@ class WirelessLANGroupViewSet(CustomFieldModelViewSet):
|
|||||||
filterset_class = filtersets.WirelessLANGroupFilterSet
|
filterset_class = filtersets.WirelessLANGroupFilterSet
|
||||||
|
|
||||||
|
|
||||||
class WirelessLANViewSet(CustomFieldModelViewSet):
|
class WirelessLANViewSet(NetBoxModelViewSet):
|
||||||
queryset = WirelessLAN.objects.prefetch_related('vlan', 'tags')
|
queryset = WirelessLAN.objects.prefetch_related('vlan', 'tags')
|
||||||
serializer_class = serializers.WirelessLANSerializer
|
serializer_class = serializers.WirelessLANSerializer
|
||||||
filterset_class = filtersets.WirelessLANFilterSet
|
filterset_class = filtersets.WirelessLANFilterSet
|
||||||
|
|
||||||
|
|
||||||
class WirelessLinkViewSet(CustomFieldModelViewSet):
|
class WirelessLinkViewSet(NetBoxModelViewSet):
|
||||||
queryset = WirelessLink.objects.prefetch_related('interface_a', 'interface_b', 'tags')
|
queryset = WirelessLink.objects.prefetch_related('interface_a', 'interface_b', 'tags')
|
||||||
serializer_class = serializers.WirelessLinkSerializer
|
serializer_class = serializers.WirelessLinkSerializer
|
||||||
filterset_class = filtersets.WirelessLinkFilterSet
|
filterset_class = filtersets.WirelessLinkFilterSet
|
||||||
|
Reference in New Issue
Block a user