From c4fafa27ad0445ac067536986690f0ca75436658 Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Sun, 25 Aug 2024 15:27:27 -0500 Subject: [PATCH] Temporary work to swap in serializer --- netbox/dcim/api/serializers_/cables.py | 53 ++++++++++-------------- netbox/dcim/tests/test_api.py | 8 ---- netbox/netbox/api/serializers/generic.py | 2 + 3 files changed, 25 insertions(+), 38 deletions(-) diff --git a/netbox/dcim/api/serializers_/cables.py b/netbox/dcim/api/serializers_/cables.py index c5d78d924..8aa1e5b61 100644 --- a/netbox/dcim/api/serializers_/cables.py +++ b/netbox/dcim/api/serializers_/cables.py @@ -16,40 +16,10 @@ __all__ = ( 'CableSerializer', 'CableTerminationSerializer', 'CabledObjectSerializer', - 'GenericObjectTerminationSerializer', 'TracedCableSerializer', ) -class GenericObjectTerminationSerializer(GenericObjectSerializer): - id = serializers.IntegerField(required=False) - - def to_representation(self, instance): - data = super().to_representation(instance) - termination = instance.cable_terminations.first() - if termination: - data['id'] = termination.pk - - return data - - -class CableSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:cable-detail') - a_terminations = GenericObjectTerminationSerializer(many=True, required=False) - b_terminations = GenericObjectTerminationSerializer(many=True, required=False) - status = ChoiceField(choices=LinkStatusChoices, required=False) - tenant = TenantSerializer(nested=True, required=False, allow_null=True) - length_unit = ChoiceField(choices=CableLengthUnitChoices, allow_blank=True, required=False, allow_null=True) - - class Meta: - model = Cable - fields = [ - 'id', 'url', 'display', 'type', 'a_terminations', 'b_terminations', 'status', 'tenant', 'label', 'color', - 'length', 'length_unit', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', - ] - brief_fields = ('id', 'url', 'display', 'label', 'description') - - class TracedCableSerializer(serializers.ModelSerializer): """ Used only while tracing a cable path. @@ -84,6 +54,29 @@ class CableTerminationSerializer(NetBoxModelSerializer): return serializer(obj.termination, nested=True, context=context).data +class CableSerializer(NetBoxModelSerializer): + url = serializers.HyperlinkedIdentityField(view_name='dcim-api:cable-detail') + a_terminations = GenericObjectSerializer(many=True, required=False) + b_terminations = GenericObjectSerializer(many=True, required=False) + terminations = CableTerminationSerializer( + many=True, + required=False, + nested=True, + fields=('id', 'url', 'cable_end', 'termination_type', 'termination_id', 'termination') + ) + status = ChoiceField(choices=LinkStatusChoices, required=False) + tenant = TenantSerializer(nested=True, required=False, allow_null=True) + length_unit = ChoiceField(choices=CableLengthUnitChoices, allow_blank=True, required=False, allow_null=True) + + class Meta: + model = Cable + fields = [ + 'id', 'url', 'display', 'type', 'a_terminations', 'b_terminations', 'terminations', 'status', 'tenant', 'label', 'color', + 'length', 'length_unit', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', + ] + brief_fields = ('id', 'url', 'display', 'label', 'description') + + class CablePathSerializer(serializers.ModelSerializer): path = serializers.SerializerMethodField(read_only=True) diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index 435581c7e..52b850b24 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -2038,14 +2038,6 @@ class CableTest(APIViewTestCases.APIViewTestCase): }, ] - def test_cable_termination_pk_exist(self): - self.add_permissions('dcim.view_cable') - cable = Cable.objects.first() - url = reverse('dcim-api:cable-detail', kwargs={'pk': cable.pk}) - response = self.client.get(url, {}, format='json', **self.header) - self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertIsNotNone(response.data['a_terminations'][0]['id']) - class ConnectedDeviceTest(APITestCase): diff --git a/netbox/netbox/api/serializers/generic.py b/netbox/netbox/api/serializers/generic.py index b1cf40406..e62d2e05b 100644 --- a/netbox/netbox/api/serializers/generic.py +++ b/netbox/netbox/api/serializers/generic.py @@ -13,6 +13,8 @@ __all__ = ( class GenericObjectSerializer(serializers.Serializer): + id = serializers.IntegerField(required=False) + """ Minimal representation of some generic object identified by ContentType and PK. """