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

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

@@ -313,7 +313,7 @@ class ConsoleServerPortSerializer(serializers.ModelSerializer):
         fields = ['id', 'device', 'name', 'connected_console']
         fields = ['id', 'device', 'name', 'connected_console']
 
 
 
 
-class ChildConsoleServerPortSerializer(serializers.HyperlinkedModelSerializer):
+class DeviceConsoleServerPortSerializer(serializers.HyperlinkedModelSerializer):
 
 
     class Meta:
     class Meta:
         model = ConsoleServerPort
         model = ConsoleServerPort
@@ -333,7 +333,7 @@ class ConsolePortSerializer(serializers.ModelSerializer):
         fields = ['id', 'device', 'name', 'cs_port', 'connection_status']
         fields = ['id', 'device', 'name', 'cs_port', 'connection_status']
 
 
 
 
-class ChildConsolePortSerializer(serializers.HyperlinkedModelSerializer):
+class DeviceConsolePortSerializer(serializers.HyperlinkedModelSerializer):
 
 
     class Meta:
     class Meta:
         model = ConsolePort
         model = ConsolePort
@@ -352,7 +352,7 @@ class PowerOutletSerializer(serializers.ModelSerializer):
         fields = ['id', 'device', 'name', 'connected_port']
         fields = ['id', 'device', 'name', 'connected_port']
 
 
 
 
-class ChildPowerOutletSerializer(serializers.HyperlinkedModelSerializer):
+class DevicePowerOutletSerializer(serializers.HyperlinkedModelSerializer):
 
 
     class Meta:
     class Meta:
         model = PowerOutlet
         model = PowerOutlet
@@ -372,7 +372,7 @@ class PowerPortSerializer(serializers.ModelSerializer):
         fields = ['id', 'device', 'name', 'power_outlet', 'connection_status']
         fields = ['id', 'device', 'name', 'power_outlet', 'connection_status']
 
 
 
 
-class ChildPowerPortSerializer(serializers.HyperlinkedModelSerializer):
+class DevicePowerPortSerializer(serializers.HyperlinkedModelSerializer):
 
 
     class Meta:
     class Meta:
         model = PowerPort
         model = PowerPort
@@ -383,30 +383,69 @@ class ChildPowerPortSerializer(serializers.HyperlinkedModelSerializer):
 # Interfaces
 # Interfaces
 #
 #
 
 
+
 class InterfaceSerializer(serializers.ModelSerializer):
 class InterfaceSerializer(serializers.ModelSerializer):
     device = NestedDeviceSerializer()
     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:
     class Meta:
         model = Interface
         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:
     class Meta:
         model = Interface
         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:
     class Meta:
         model = Module
         model = Module
         fields = ['id', 'url', 'parent', 'name', 'manufacturer', 'part_id', 'serial', 'discovered']
         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):
 class ChildConsolePortViewSet(CreateModelMixin, ListModelMixin, WritableSerializerMixin, GenericViewSet):
-    serializer_class = serializers.ChildConsolePortSerializer
+    serializer_class = serializers.DeviceConsolePortSerializer
 
 
     def get_queryset(self):
     def get_queryset(self):
         device = get_object_or_404(Device, pk=self.kwargs['pk'])
         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):
 class ChildConsoleServerPortViewSet(CreateModelMixin, ListModelMixin, WritableSerializerMixin, GenericViewSet):
-    serializer_class = serializers.ChildConsoleServerPortSerializer
+    serializer_class = serializers.DeviceConsoleServerPortSerializer
 
 
     def get_queryset(self):
     def get_queryset(self):
         device = get_object_or_404(Device, pk=self.kwargs['pk'])
         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):
 class ChildPowerPortViewSet(CreateModelMixin, ListModelMixin, WritableSerializerMixin, GenericViewSet):
-    serializer_class = serializers.ChildPowerPortSerializer
+    serializer_class = serializers.DevicePowerPortSerializer
 
 
     def get_queryset(self):
     def get_queryset(self):
         device = get_object_or_404(Device, pk=self.kwargs['pk'])
         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):
 class ChildPowerOutletViewSet(CreateModelMixin, ListModelMixin, WritableSerializerMixin, GenericViewSet):
-    serializer_class = serializers.ChildPowerOutletSerializer
+    serializer_class = serializers.DevicePowerOutletSerializer
 
 
     def get_queryset(self):
     def get_queryset(self):
         device = get_object_or_404(Device, pk=self.kwargs['pk'])
         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,
 class InterfaceViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, WritableSerializerMixin,
                        GenericViewSet):
                        GenericViewSet):
     queryset = Interface.objects.select_related('device')
     queryset = Interface.objects.select_related('device')
-    serializer_class = serializers.InterfaceDetailSerializer
+    serializer_class = serializers.InterfaceSerializer
 
 
 
 
 class ChildInterfaceViewSet(CreateModelMixin, ListModelMixin, WritableSerializerMixin, GenericViewSet):
 class ChildInterfaceViewSet(CreateModelMixin, ListModelMixin, WritableSerializerMixin, GenericViewSet):
-    serializer_class = serializers.ChildInterfaceSerializer
+    serializer_class = serializers.DeviceInterfaceSerializer
     filter_class = filters.InterfaceFilter
     filter_class = filters.InterfaceFilter
 
 
     def get_queryset(self):
     def get_queryset(self):
@@ -380,7 +380,7 @@ class RelatedConnectionsView(APIView):
         interfaces = Interface.objects.order_naturally(device.device_type.interface_ordering).filter(device=device)\
         interfaces = Interface.objects.order_naturally(device.device_type.interface_ordering).filter(device=device)\
             .select_related('connected_as_a', 'connected_as_b', 'circuit_termination')
             .select_related('connected_as_a', 'connected_as_b', 'circuit_termination')
         for iface in interfaces:
         for iface in interfaces:
-            data = serializers.InterfaceDetailSerializer(instance=iface).data
+            data = serializers.InterfaceSerializer(instance=iface).data
             del(data['device'])
             del(data['device'])
             response['interfaces'].append(data)
             response['interfaces'].append(data)
 
 

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

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