Browse Source

Re-implemented interface/connection serializers

Jeremy Stretch 8 years ago
parent
commit
f0fef94a4f

+ 2 - 2
netbox/circuits/api/serializers.py

@@ -1,7 +1,7 @@
 from rest_framework import serializers
 
 from circuits.models import Provider, Circuit, CircuitTermination, CircuitType
-from dcim.api.serializers import NestedSiteSerializer, ChildInterfaceSerializer
+from dcim.api.serializers import NestedSiteSerializer, DeviceInterfaceSerializer
 from extras.api.serializers import CustomFieldSerializer
 from tenancy.api.serializers import NestedTenantSerializer
 
@@ -51,7 +51,7 @@ class NestedCircuitTypeSerializer(serializers.HyperlinkedModelSerializer):
 
 class CircuitTerminationSerializer(serializers.ModelSerializer):
     site = NestedSiteSerializer()
-    interface = ChildInterfaceSerializer()
+    interface = DeviceInterfaceSerializer()
 
     class Meta:
         model = CircuitTermination

+ 54 - 26
netbox/dcim/api/serializers.py

@@ -313,7 +313,7 @@ class ConsoleServerPortSerializer(serializers.ModelSerializer):
         fields = ['id', 'device', 'name', 'connected_console']
 
 
-class ChildConsoleServerPortSerializer(serializers.HyperlinkedModelSerializer):
+class DeviceConsoleServerPortSerializer(serializers.HyperlinkedModelSerializer):
 
     class Meta:
         model = ConsoleServerPort
@@ -333,7 +333,7 @@ class ConsolePortSerializer(serializers.ModelSerializer):
         fields = ['id', 'device', 'name', 'cs_port', 'connection_status']
 
 
-class ChildConsolePortSerializer(serializers.HyperlinkedModelSerializer):
+class DeviceConsolePortSerializer(serializers.HyperlinkedModelSerializer):
 
     class Meta:
         model = ConsolePort
@@ -352,7 +352,7 @@ class PowerOutletSerializer(serializers.ModelSerializer):
         fields = ['id', 'device', 'name', 'connected_port']
 
 
-class ChildPowerOutletSerializer(serializers.HyperlinkedModelSerializer):
+class DevicePowerOutletSerializer(serializers.HyperlinkedModelSerializer):
 
     class Meta:
         model = PowerOutlet
@@ -372,7 +372,7 @@ class PowerPortSerializer(serializers.ModelSerializer):
         fields = ['id', 'device', 'name', 'power_outlet', 'connection_status']
 
 
-class ChildPowerPortSerializer(serializers.HyperlinkedModelSerializer):
+class DevicePowerPortSerializer(serializers.HyperlinkedModelSerializer):
 
     class Meta:
         model = PowerPort
@@ -383,30 +383,69 @@ class ChildPowerPortSerializer(serializers.HyperlinkedModelSerializer):
 # Interfaces
 #
 
+
 class InterfaceSerializer(serializers.ModelSerializer):
     device = NestedDeviceSerializer()
-    form_factor = serializers.ReadOnlyField(source='get_form_factor_display')
+    connection = serializers.SerializerMethodField(read_only=True)
+    connected_interface = serializers.SerializerMethodField(read_only=True)
 
     class Meta:
         model = Interface
-        fields = ['id', 'device', 'name', 'form_factor', 'mac_address', 'mgmt_only', 'description', 'is_connected']
+        fields = [
+            'id', 'device', 'name', 'form_factor', 'mac_address', 'mgmt_only', 'description', 'connection',
+            'connected_interface',
+        ]
+
+    def get_connection(self, obj):
+        if obj.connection:
+            return NestedInterfaceConnectionSerializer(obj.connection, context=self.context).data
+        return None
 
+    def get_connected_interface(self, obj):
+        if obj.connected_interface:
+            return PeerInterfaceSerializer(obj.connected_interface, context=self.context).data
+        return None
 
-class ChildInterfaceSerializer(serializers.HyperlinkedModelSerializer):
+
+class PeerInterfaceSerializer(serializers.HyperlinkedModelSerializer):
+    device = NestedDeviceSerializer()
 
     class Meta:
         model = Interface
-        fields = ['id', 'url', 'name', 'form_factor', 'mac_address', 'mgmt_only', 'description', 'is_connected']
+        fields = ['id', 'url', 'device', 'name', 'form_factor', 'mac_address', 'mgmt_only', 'description']
 
 
-# TODO: Remove this
-class InterfaceDetailSerializer(InterfaceSerializer):
+class DeviceInterfaceSerializer(serializers.HyperlinkedModelSerializer):
+    connection = serializers.SerializerMethodField()
 
-    class Meta(InterfaceSerializer.Meta):
-        fields = [
-            'id', 'device', 'name', 'form_factor', 'mac_address', 'mgmt_only', 'description', 'is_connected',
-            'connected_interface',
-        ]
+    class Meta:
+        model = Interface
+        fields = ['id', 'url', 'name', 'form_factor', 'mac_address', 'mgmt_only', 'description', 'connection']
+
+    def get_connection(self, obj):
+        if obj.connection:
+            return NestedInterfaceConnectionSerializer(obj.connection, context=self.context).data
+        return None
+
+
+#
+# Interface connections
+#
+
+class InterfaceConnectionSerializer(serializers.ModelSerializer):
+    interface_a = PeerInterfaceSerializer()
+    interface_b = PeerInterfaceSerializer()
+
+    class Meta:
+        model = InterfaceConnection
+        fields = ['id', 'interface_a', 'interface_b', 'connection_status']
+
+
+class NestedInterfaceConnectionSerializer(serializers.HyperlinkedModelSerializer):
+
+    class Meta:
+        model = InterfaceConnection
+        fields = ['id', 'url', 'connection_status']
 
 
 #
@@ -447,14 +486,3 @@ class ChildModuleSerializer(serializers.HyperlinkedModelSerializer):
     class Meta:
         model = Module
         fields = ['id', 'url', 'parent', 'name', 'manufacturer', 'part_id', 'serial', 'discovered']
-
-
-#
-# Interface connections
-#
-
-class InterfaceConnectionSerializer(serializers.ModelSerializer):
-
-    class Meta:
-        model = InterfaceConnection
-        fields = ['id', 'interface_a', 'interface_b', 'connection_status']

+ 7 - 7
netbox/dcim/api/views.py

@@ -151,7 +151,7 @@ class ConsolePortViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin
 
 
 class ChildConsolePortViewSet(CreateModelMixin, ListModelMixin, WritableSerializerMixin, GenericViewSet):
-    serializer_class = serializers.ChildConsolePortSerializer
+    serializer_class = serializers.DeviceConsolePortSerializer
 
     def get_queryset(self):
         device = get_object_or_404(Device, pk=self.kwargs['pk'])
@@ -169,7 +169,7 @@ class ConsoleServerPortViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyMode
 
 
 class ChildConsoleServerPortViewSet(CreateModelMixin, ListModelMixin, WritableSerializerMixin, GenericViewSet):
-    serializer_class = serializers.ChildConsoleServerPortSerializer
+    serializer_class = serializers.DeviceConsoleServerPortSerializer
 
     def get_queryset(self):
         device = get_object_or_404(Device, pk=self.kwargs['pk'])
@@ -187,7 +187,7 @@ class PowerPortViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin,
 
 
 class ChildPowerPortViewSet(CreateModelMixin, ListModelMixin, WritableSerializerMixin, GenericViewSet):
-    serializer_class = serializers.ChildPowerPortSerializer
+    serializer_class = serializers.DevicePowerPortSerializer
 
     def get_queryset(self):
         device = get_object_or_404(Device, pk=self.kwargs['pk'])
@@ -205,7 +205,7 @@ class PowerOutletViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin
 
 
 class ChildPowerOutletViewSet(CreateModelMixin, ListModelMixin, WritableSerializerMixin, GenericViewSet):
-    serializer_class = serializers.ChildPowerOutletSerializer
+    serializer_class = serializers.DevicePowerOutletSerializer
 
     def get_queryset(self):
         device = get_object_or_404(Device, pk=self.kwargs['pk'])
@@ -219,11 +219,11 @@ class ChildPowerOutletViewSet(CreateModelMixin, ListModelMixin, WritableSerializ
 class InterfaceViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, WritableSerializerMixin,
                        GenericViewSet):
     queryset = Interface.objects.select_related('device')
-    serializer_class = serializers.InterfaceDetailSerializer
+    serializer_class = serializers.InterfaceSerializer
 
 
 class ChildInterfaceViewSet(CreateModelMixin, ListModelMixin, WritableSerializerMixin, GenericViewSet):
-    serializer_class = serializers.ChildInterfaceSerializer
+    serializer_class = serializers.DeviceInterfaceSerializer
     filter_class = filters.InterfaceFilter
 
     def get_queryset(self):
@@ -380,7 +380,7 @@ class RelatedConnectionsView(APIView):
         interfaces = Interface.objects.order_naturally(device.device_type.interface_ordering).filter(device=device)\
             .select_related('connected_as_a', 'connected_as_b', 'circuit_termination')
         for iface in interfaces:
-            data = serializers.InterfaceDetailSerializer(instance=iface).data
+            data = serializers.InterfaceSerializer(instance=iface).data
             del(data['device'])
             response['interfaces'].append(data)
 

+ 2 - 2
netbox/ipam/api/serializers.py

@@ -1,6 +1,6 @@
 from rest_framework import serializers
 
-from dcim.api.serializers import NestedDeviceSerializer, ChildInterfaceSerializer, NestedSiteSerializer
+from dcim.api.serializers import NestedDeviceSerializer, DeviceInterfaceSerializer, NestedSiteSerializer
 from extras.api.serializers import CustomFieldSerializer
 from ipam.models import Aggregate, IPAddress, Prefix, RIR, Role, Service, VLAN, VLANGroup, VRF
 from tenancy.api.serializers import NestedTenantSerializer
@@ -158,7 +158,7 @@ class NestedPrefixSerializer(serializers.HyperlinkedModelSerializer):
 class IPAddressSerializer(CustomFieldSerializer, serializers.ModelSerializer):
     vrf = NestedVRFSerializer()
     tenant = NestedTenantSerializer()
-    interface = ChildInterfaceSerializer()
+    interface = DeviceInterfaceSerializer()
 
     class Meta:
         model = IPAddress