Added 'cable' field to device component serializers

This commit is contained in:
Jeremy Stretch 2018-10-29 12:33:43 -04:00
parent e21b23cd98
commit 05431aa83b

View File

@ -492,18 +492,68 @@ class DeviceWithConfigContextSerializer(DeviceSerializer):
return obj.get_config_context()
#
# Cables
#
class CableSerializer(ValidatedModelSerializer):
termination_a_type = ContentTypeField()
termination_b_type = ContentTypeField()
termination_a = serializers.SerializerMethodField(read_only=True)
termination_b = serializers.SerializerMethodField(read_only=True)
status = ChoiceField(choices=CONNECTION_STATUS_CHOICES)
length_unit = ChoiceField(choices=LENGTH_UNIT_CHOICES)
class Meta:
model = Cable
fields = [
'id', 'termination_a_type', 'termination_a_id', 'termination_a', 'termination_b_type', 'termination_b_id',
'termination_b', 'type', 'status', 'label', 'color', 'length', 'length_unit',
]
def _get_termination(self, obj, side):
"""
Serialize a nested representation of a termination.
"""
if side.lower() not in ['a', 'b']:
raise ValueError("Termination side must be either A or B.")
termination = getattr(obj, 'termination_{}'.format(side.lower()))
if termination is None:
return None
serializer = get_serializer_for_model(termination, prefix='Nested')
context = {'request': self.context['request']}
data = serializer(termination, context=context).data
return data
def get_termination_a(self, obj):
return self._get_termination(obj, 'a')
def get_termination_b(self, obj):
return self._get_termination(obj, 'b')
class NestedCableSerializer(serializers.Serializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:cable-detail')
class Meta:
model = Cable
fields = ['id', 'url', 'label']
#
# Console server ports
#
class ConsoleServerPortSerializer(TaggitSerializer, ValidatedModelSerializer):
device = NestedDeviceSerializer()
cable = NestedCableSerializer()
tags = TagListSerializerField(required=False)
class Meta:
model = ConsoleServerPort
fields = ['id', 'device', 'name', 'connected_endpoint', 'tags']
read_only_fields = ['connected_endpoint']
fields = ['id', 'device', 'name', 'connected_endpoint', 'cable', 'tags']
read_only_fields = ['connected_endpoint', 'cable']
class NestedConsoleServerPortSerializer(WritableNestedSerializer):
@ -526,11 +576,13 @@ class NestedConsoleServerPortSerializer(WritableNestedSerializer):
class ConsolePortSerializer(TaggitSerializer, ValidatedModelSerializer):
device = NestedDeviceSerializer()
connected_endpoint = NestedConsoleServerPortSerializer(required=False, allow_null=True)
cable = NestedCableSerializer()
tags = TagListSerializerField(required=False)
class Meta:
model = ConsolePort
fields = ['id', 'device', 'name', 'connected_endpoint', 'connection_status', 'tags']
fields = ['id', 'device', 'name', 'connected_endpoint', 'connection_status', 'cable', 'tags']
read_only_fields = ['connected_endpoint', 'cable']
class NestedConsolePortSerializer(TaggitSerializer, ValidatedModelSerializer):
@ -552,12 +604,13 @@ class NestedConsolePortSerializer(TaggitSerializer, ValidatedModelSerializer):
class PowerOutletSerializer(TaggitSerializer, ValidatedModelSerializer):
device = NestedDeviceSerializer()
cable = NestedCableSerializer()
tags = TagListSerializerField(required=False)
class Meta:
model = PowerOutlet
fields = ['id', 'device', 'name', 'connected_endpoint', 'tags']
read_only_fields = ['connected_endpoint']
fields = ['id', 'device', 'name', 'connected_endpoint', 'cable', 'tags']
read_only_fields = ['connected_endpoint', 'cable']
class NestedPowerOutletSerializer(WritableNestedSerializer):
@ -580,11 +633,13 @@ class NestedPowerOutletSerializer(WritableNestedSerializer):
class PowerPortSerializer(TaggitSerializer, ValidatedModelSerializer):
device = NestedDeviceSerializer()
connected_endpoint = NestedPowerOutletSerializer(required=False, allow_null=True)
cable = NestedCableSerializer()
tags = TagListSerializerField(required=False)
class Meta:
model = PowerPort
fields = ['id', 'device', 'name', 'connected_endpoint', 'connection_status', 'tags']
fields = ['id', 'device', 'name', 'connected_endpoint', 'connection_status', 'cable', 'tags']
read_only_fields = ['connected_endpoint', 'cable']
class NestedPowerPortSerializer(TaggitSerializer, ValidatedModelSerializer):
@ -671,14 +726,15 @@ class InterfaceSerializer(TaggitSerializer, IsConnectedMixin, ValidatedModelSeri
required=False,
many=True
)
cable = NestedCableSerializer()
tags = TagListSerializerField(required=False)
class Meta:
model = Interface
fields = [
'id', 'device', 'name', 'form_factor', 'enabled', 'lag', 'mtu', 'mac_address', 'mgmt_only', 'description',
'is_connected', 'connected_endpoint', 'circuit_termination', 'mode', 'untagged_vlan', 'tagged_vlans',
'tags',
'is_connected', 'connected_endpoint', 'circuit_termination', 'cable', 'mode', 'untagged_vlan',
'tagged_vlans', 'tags',
]
def validate(self, data):
@ -708,11 +764,12 @@ class InterfaceSerializer(TaggitSerializer, IsConnectedMixin, ValidatedModelSeri
class RearPortSerializer(ValidatedModelSerializer):
device = NestedDeviceSerializer()
type = ChoiceField(choices=PORT_TYPE_CHOICES)
cable = NestedCableSerializer()
tags = TagListSerializerField(required=False)
class Meta:
model = RearPort
fields = ['id', 'device', 'name', 'type', 'positions', 'tags']
fields = ['id', 'device', 'name', 'type', 'positions', 'cable', 'tags']
class NestedRearPortSerializer(WritableNestedSerializer):
@ -732,11 +789,12 @@ class FrontPortSerializer(ValidatedModelSerializer):
device = NestedDeviceSerializer()
type = ChoiceField(choices=PORT_TYPE_CHOICES)
rear_port = NestedRearPortSerializer()
cable = NestedCableSerializer()
tags = TagListSerializerField(required=False)
class Meta:
model = FrontPort
fields = ['id', 'device', 'name', 'type', 'rear_port', 'rear_port_position', 'tags']
fields = ['id', 'device', 'name', 'type', 'rear_port', 'rear_port_position', 'cable', 'tags']
class NestedFrontPortSerializer(WritableNestedSerializer):
@ -808,47 +866,6 @@ class InterfaceConnectionSerializer(ValidatedModelSerializer):
return NestedInterfaceSerializer(instance=obj, context=context).data
#
# Cables
#
class CableSerializer(ValidatedModelSerializer):
termination_a_type = ContentTypeField()
termination_b_type = ContentTypeField()
termination_a = serializers.SerializerMethodField(read_only=True)
termination_b = serializers.SerializerMethodField(read_only=True)
status = ChoiceField(choices=CONNECTION_STATUS_CHOICES)
length_unit = ChoiceField(choices=LENGTH_UNIT_CHOICES)
class Meta:
model = Cable
fields = [
'id', 'termination_a_type', 'termination_a_id', 'termination_a', 'termination_b_type', 'termination_b_id',
'termination_b', 'type', 'status', 'label', 'color', 'length', 'length_unit',
]
def _get_termination(self, obj, side):
"""
Serialize a nested representation of a termination.
"""
if side.lower() not in ['a', 'b']:
raise ValueError("Termination side must be either A or B.")
termination = getattr(obj, 'termination_{}'.format(side.lower()))
if termination is None:
return None
serializer = get_serializer_for_model(termination, prefix='Nested')
context = {'request': self.context['request']}
data = serializer(termination, context=context).data
return data
def get_termination_a(self, obj):
return self._get_termination(obj, 'a')
def get_termination_b(self, obj):
return self._get_termination(obj, 'b')
#
# Virtual chassis
#