diff --git a/CHANGELOG.md b/CHANGELOG.md index 452b093cb..55857f1f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,12 +42,13 @@ NetBox now supports modeling physical cables for console, power, and interface c ## Changes From v2.5-beta2 +* [#2616](https://github.com/digitalocean/netbox/issues/2616) - Convert Rack `outer_unit` and Cable `length_unit` to integer-based choice fields * [#2622](https://github.com/digitalocean/netbox/issues/2622) - Enable filtering cables by multiple types/colors * [#2624](https://github.com/digitalocean/netbox/issues/2624) - Delete associated content type and permissions when removing InterfaceConnection model -* [#2616](https://github.com/digitalocean/netbox/issues/2616) - Convert Rack `outer_unit` and Cable `length_unit` to integer-based choice fields +* [#2626](https://github.com/digitalocean/netbox/issues/2626) - Remove extraneous permissions generated from proxy models * [#2632](https://github.com/digitalocean/netbox/issues/2632) - Change representation of null values from `0` to `null` * [#2639](https://github.com/digitalocean/netbox/issues/2639) - Fix preservation of length/dimensions unit for racks and cables -* [#2626](https://github.com/digitalocean/netbox/issues/2626) - Remove extraneous permissions generated from proxy models +* [#2648](https://github.com/digitalocean/netbox/issues/2648) - Include the `connection_status` field in nested represenations of connectable device components ## API Changes diff --git a/netbox/dcim/api/nested_serializers.py b/netbox/dcim/api/nested_serializers.py index b8dd403b5..4d7478595 100644 --- a/netbox/dcim/api/nested_serializers.py +++ b/netbox/dcim/api/nested_serializers.py @@ -1,11 +1,12 @@ from rest_framework import serializers +from dcim.constants import CONNECTION_STATUS_CHOICES from dcim.models import ( Cable, ConsolePort, ConsoleServerPort, Device, DeviceBay, DeviceType, DeviceRole, FrontPort, FrontPortTemplate, Interface, Manufacturer, Platform, PowerOutlet, PowerPort, Rack, RackGroup, RackRole, RearPort, RearPortTemplate, Region, Site, VirtualChassis, ) -from utilities.api import WritableNestedSerializer +from utilities.api import ChoiceField, WritableNestedSerializer __all__ = [ 'NestedCableSerializer', @@ -149,46 +150,51 @@ class NestedDeviceSerializer(WritableNestedSerializer): class NestedConsoleServerPortSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleserverport-detail') device = NestedDeviceSerializer(read_only=True) + connection_status = ChoiceField(choices=CONNECTION_STATUS_CHOICES, read_only=True) class Meta: model = ConsoleServerPort - fields = ['id', 'url', 'device', 'name', 'cable'] + fields = ['id', 'url', 'device', 'name', 'cable', 'connection_status'] class NestedConsolePortSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleport-detail') device = NestedDeviceSerializer(read_only=True) + connection_status = ChoiceField(choices=CONNECTION_STATUS_CHOICES, read_only=True) class Meta: model = ConsolePort - fields = ['id', 'url', 'device', 'name', 'cable'] + fields = ['id', 'url', 'device', 'name', 'cable', 'connection_status'] class NestedPowerOutletSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:poweroutlet-detail') device = NestedDeviceSerializer(read_only=True) + connection_status = ChoiceField(choices=CONNECTION_STATUS_CHOICES, read_only=True) class Meta: model = PowerOutlet - fields = ['id', 'url', 'device', 'name', 'cable'] + fields = ['id', 'url', 'device', 'name', 'cable', 'connection_status'] class NestedPowerPortSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerport-detail') device = NestedDeviceSerializer(read_only=True) + connection_status = ChoiceField(choices=CONNECTION_STATUS_CHOICES, read_only=True) class Meta: model = PowerPort - fields = ['id', 'url', 'device', 'name', 'cable'] + fields = ['id', 'url', 'device', 'name', 'cable', 'connection_status'] class NestedInterfaceSerializer(WritableNestedSerializer): device = NestedDeviceSerializer(read_only=True) url = serializers.HyperlinkedIdentityField(view_name='dcim-api:interface-detail') + connection_status = ChoiceField(choices=CONNECTION_STATUS_CHOICES, read_only=True) class Meta: model = Interface - fields = ['id', 'url', 'device', 'name', 'cable'] + fields = ['id', 'url', 'device', 'name', 'cable', 'connection_status'] class NestedRearPortSerializer(WritableNestedSerializer): diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index b66a46725..980c57e86 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -1951,7 +1951,7 @@ class ConsolePortTest(APITestCase): self.assertEqual( sorted(response.data['results'][0]), - ['cable', 'device', 'id', 'name', 'url'] + ['cable', 'connection_status', 'device', 'id', 'name', 'url'] ) def test_create_consoleport(self): @@ -2064,7 +2064,7 @@ class ConsoleServerPortTest(APITestCase): self.assertEqual( sorted(response.data['results'][0]), - ['cable', 'device', 'id', 'name', 'url'] + ['cable', 'connection_status', 'device', 'id', 'name', 'url'] ) def test_create_consoleserverport(self): @@ -2175,7 +2175,7 @@ class PowerPortTest(APITestCase): self.assertEqual( sorted(response.data['results'][0]), - ['cable', 'device', 'id', 'name', 'url'] + ['cable', 'connection_status', 'device', 'id', 'name', 'url'] ) def test_create_powerport(self): @@ -2288,7 +2288,7 @@ class PowerOutletTest(APITestCase): self.assertEqual( sorted(response.data['results'][0]), - ['cable', 'device', 'id', 'name', 'url'] + ['cable', 'connection_status', 'device', 'id', 'name', 'url'] ) def test_create_poweroutlet(self): @@ -2425,7 +2425,7 @@ class InterfaceTest(APITestCase): self.assertEqual( sorted(response.data['results'][0]), - ['cable', 'device', 'id', 'name', 'url'] + ['cable', 'connection_status', 'device', 'id', 'name', 'url'] ) def test_create_interface(self):