1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Add REST API endpoint for CableTermination

This commit is contained in:
jeremystretch
2022-05-16 16:16:51 -04:00
parent 1505369133
commit 9ef9443969
6 changed files with 50 additions and 12 deletions

View File

@ -1,7 +1,7 @@
import django_filters import django_filters
from django.db.models import Q from django.db.models import Q
from dcim.filtersets import CableTerminationFilterSet from dcim.filtersets import CabledObjectFilterSet
from dcim.models import Region, Site, SiteGroup from dcim.models import Region, Site, SiteGroup
from ipam.models import ASN from ipam.models import ASN
from netbox.filtersets import ChangeLoggedModelFilterSet, NetBoxModelFilterSet, OrganizationalModelFilterSet from netbox.filtersets import ChangeLoggedModelFilterSet, NetBoxModelFilterSet, OrganizationalModelFilterSet
@ -198,7 +198,7 @@ class CircuitFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilte
).distinct() ).distinct()
class CircuitTerminationFilterSet(ChangeLoggedModelFilterSet, CableTerminationFilterSet): class CircuitTerminationFilterSet(ChangeLoggedModelFilterSet, CabledObjectFilterSet):
q = django_filters.CharFilter( q = django_filters.CharFilter(
method='search', method='search',
label='Search', label='Search',

View File

@ -1061,6 +1061,26 @@ class TracedCableSerializer(serializers.ModelSerializer):
] ]
class CableTerminationSerializer(NetBoxModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:cable-detail')
termination_type = ContentTypeField(
queryset=ContentType.objects.filter(CABLE_TERMINATION_MODELS)
)
termination = serializers.SerializerMethodField(read_only=True)
class Meta:
model = CableTermination
fields = [
'id', 'url', 'display', 'cable', 'cable_end', 'termination_type', 'termination_id', 'termination'
]
@swagger_serializer_method(serializer_or_field=serializers.DictField)
def get_termination(self, obj):
serializer = get_serializer_for_model(obj.termination, prefix='Nested')
context = {'request': self.context['request']}
return serializer(obj.termination, context=context).data
class CablePathSerializer(serializers.ModelSerializer): class CablePathSerializer(serializers.ModelSerializer):
origin_type = ContentTypeField(read_only=True) origin_type = ContentTypeField(read_only=True)
origin = serializers.SerializerMethodField(read_only=True) origin = serializers.SerializerMethodField(read_only=True)

View File

@ -56,6 +56,7 @@ router.register('inventory-item-roles', views.InventoryItemRoleViewSet)
# Cables # Cables
router.register('cables', views.CableViewSet) router.register('cables', views.CableViewSet)
router.register('cable-terminations', views.CableTerminationViewSet)
# Virtual chassis # Virtual chassis
router.register('virtual-chassis', views.VirtualChassisViewSet) router.register('virtual-chassis', views.VirtualChassisViewSet)

View File

@ -646,12 +646,18 @@ class InventoryItemRoleViewSet(NetBoxModelViewSet):
# #
class CableViewSet(NetBoxModelViewSet): class CableViewSet(NetBoxModelViewSet):
metadata_class = ContentTypeMetadata
queryset = Cable.objects.prefetch_related('terminations__termination') queryset = Cable.objects.prefetch_related('terminations__termination')
serializer_class = serializers.CableSerializer serializer_class = serializers.CableSerializer
filterset_class = filtersets.CableFilterSet filterset_class = filtersets.CableFilterSet
class CableTerminationViewSet(NetBoxModelViewSet):
metadata_class = ContentTypeMetadata
queryset = CableTermination.objects.prefetch_related('cable', 'termination')
serializer_class = serializers.CableTerminationSerializer
filterset_class = filtersets.CableTerminationFilterSet
# #
# Virtual chassis # Virtual chassis
# #

View File

@ -21,6 +21,7 @@ from .models import *
__all__ = ( __all__ = (
'CableFilterSet', 'CableFilterSet',
'CabledObjectFilterSet',
'CableTerminationFilterSet', 'CableTerminationFilterSet',
'ConsoleConnectionFilterSet', 'ConsoleConnectionFilterSet',
'ConsolePortFilterSet', 'ConsolePortFilterSet',
@ -1107,7 +1108,7 @@ class ModularDeviceComponentFilterSet(DeviceComponentFilterSet):
) )
class CableTerminationFilterSet(django_filters.FilterSet): class CabledObjectFilterSet(django_filters.FilterSet):
cabled = django_filters.BooleanFilter( cabled = django_filters.BooleanFilter(
field_name='cable', field_name='cable',
lookup_expr='isnull', lookup_expr='isnull',
@ -1130,7 +1131,7 @@ class PathEndpointFilterSet(django_filters.FilterSet):
class ConsolePortFilterSet( class ConsolePortFilterSet(
ModularDeviceComponentFilterSet, ModularDeviceComponentFilterSet,
NetBoxModelFilterSet, NetBoxModelFilterSet,
CableTerminationFilterSet, CabledObjectFilterSet,
PathEndpointFilterSet PathEndpointFilterSet
): ):
type = django_filters.MultipleChoiceFilter( type = django_filters.MultipleChoiceFilter(
@ -1146,7 +1147,7 @@ class ConsolePortFilterSet(
class ConsoleServerPortFilterSet( class ConsoleServerPortFilterSet(
ModularDeviceComponentFilterSet, ModularDeviceComponentFilterSet,
NetBoxModelFilterSet, NetBoxModelFilterSet,
CableTerminationFilterSet, CabledObjectFilterSet,
PathEndpointFilterSet PathEndpointFilterSet
): ):
type = django_filters.MultipleChoiceFilter( type = django_filters.MultipleChoiceFilter(
@ -1162,7 +1163,7 @@ class ConsoleServerPortFilterSet(
class PowerPortFilterSet( class PowerPortFilterSet(
ModularDeviceComponentFilterSet, ModularDeviceComponentFilterSet,
NetBoxModelFilterSet, NetBoxModelFilterSet,
CableTerminationFilterSet, CabledObjectFilterSet,
PathEndpointFilterSet PathEndpointFilterSet
): ):
type = django_filters.MultipleChoiceFilter( type = django_filters.MultipleChoiceFilter(
@ -1178,7 +1179,7 @@ class PowerPortFilterSet(
class PowerOutletFilterSet( class PowerOutletFilterSet(
ModularDeviceComponentFilterSet, ModularDeviceComponentFilterSet,
NetBoxModelFilterSet, NetBoxModelFilterSet,
CableTerminationFilterSet, CabledObjectFilterSet,
PathEndpointFilterSet PathEndpointFilterSet
): ):
type = django_filters.MultipleChoiceFilter( type = django_filters.MultipleChoiceFilter(
@ -1198,7 +1199,7 @@ class PowerOutletFilterSet(
class InterfaceFilterSet( class InterfaceFilterSet(
ModularDeviceComponentFilterSet, ModularDeviceComponentFilterSet,
NetBoxModelFilterSet, NetBoxModelFilterSet,
CableTerminationFilterSet, CabledObjectFilterSet,
PathEndpointFilterSet PathEndpointFilterSet
): ):
# Override device and device_id filters from DeviceComponentFilterSet to match against any peer virtual chassis # Override device and device_id filters from DeviceComponentFilterSet to match against any peer virtual chassis
@ -1326,7 +1327,7 @@ class InterfaceFilterSet(
class FrontPortFilterSet( class FrontPortFilterSet(
ModularDeviceComponentFilterSet, ModularDeviceComponentFilterSet,
NetBoxModelFilterSet, NetBoxModelFilterSet,
CableTerminationFilterSet CabledObjectFilterSet
): ):
type = django_filters.MultipleChoiceFilter( type = django_filters.MultipleChoiceFilter(
choices=PortTypeChoices, choices=PortTypeChoices,
@ -1341,7 +1342,7 @@ class FrontPortFilterSet(
class RearPortFilterSet( class RearPortFilterSet(
ModularDeviceComponentFilterSet, ModularDeviceComponentFilterSet,
NetBoxModelFilterSet, NetBoxModelFilterSet,
CableTerminationFilterSet CabledObjectFilterSet
): ):
type = django_filters.MultipleChoiceFilter( type = django_filters.MultipleChoiceFilter(
choices=PortTypeChoices, choices=PortTypeChoices,
@ -1552,6 +1553,13 @@ class CableFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
return queryset return queryset
class CableTerminationFilterSet(BaseFilterSet):
class Meta:
model = CableTermination
fields = ['id', 'cable', 'cable_end', 'termination_type', 'termination_id']
class PowerPanelFilterSet(NetBoxModelFilterSet, ContactModelFilterSet): class PowerPanelFilterSet(NetBoxModelFilterSet, ContactModelFilterSet):
region_id = TreeNodeMultipleChoiceFilter( region_id = TreeNodeMultipleChoiceFilter(
queryset=Region.objects.all(), queryset=Region.objects.all(),
@ -1609,7 +1617,7 @@ class PowerPanelFilterSet(NetBoxModelFilterSet, ContactModelFilterSet):
return queryset.filter(qs_filter) return queryset.filter(qs_filter)
class PowerFeedFilterSet(NetBoxModelFilterSet, CableTerminationFilterSet, PathEndpointFilterSet): class PowerFeedFilterSet(NetBoxModelFilterSet, CabledObjectFilterSet, PathEndpointFilterSet):
region_id = TreeNodeMultipleChoiceFilter( region_id = TreeNodeMultipleChoiceFilter(
queryset=Region.objects.all(), queryset=Region.objects.all(),
field_name='power_panel__site__region', field_name='power_panel__site__region',

View File

@ -13,6 +13,7 @@ from dcim.fields import PathField
from dcim.utils import decompile_path_node, flatten_path, object_to_path_node, path_node_to_object from dcim.utils import decompile_path_node, flatten_path, object_to_path_node, path_node_to_object
from netbox.models import NetBoxModel from netbox.models import NetBoxModel
from utilities.fields import ColorField from utilities.fields import ColorField
from utilities.querysets import RestrictedQuerySet
from utilities.utils import to_meters from utilities.utils import to_meters
from wireless.models import WirelessLink from wireless.models import WirelessLink
from .devices import Device from .devices import Device
@ -222,6 +223,8 @@ class CableTermination(models.Model):
fk_field='termination_id' fk_field='termination_id'
) )
objects = RestrictedQuerySet.as_manager()
class Meta: class Meta:
ordering = ['pk'] ordering = ['pk']
constraints = ( constraints = (