diff --git a/docs/release-notes/version-2.12.md b/docs/release-notes/version-2.12.md index 548868a3d..598237e76 100644 --- a/docs/release-notes/version-2.12.md +++ b/docs/release-notes/version-2.12.md @@ -6,3 +6,18 @@ * [#5532](https://github.com/netbox-community/netbox/issues/5532) - Drop support for Python 3.6 * [#5994](https://github.com/netbox-community/netbox/issues/5994) - Drop support for `display_field` argument on ObjectVar + +### REST API Changes + +* dcim.Device + * Removed the `display_name` attribute (use `display` instead) +* dcim.DeviceType + * Removed the `display_name` attribute (use `display` instead) +* dcim.Rack + * Removed the `display_name` attribute (use `display` instead) +* extras.ContentType + * Removed the `display_name` attribute (use `display` instead) +* ipam.VLAN + * Removed the `display_name` attribute (use `display` instead) +* ipam.VRF + * Removed the `display_name` attribute (use `display` instead) diff --git a/netbox/dcim/api/nested_serializers.py b/netbox/dcim/api/nested_serializers.py index 80e003efc..67ae9b046 100644 --- a/netbox/dcim/api/nested_serializers.py +++ b/netbox/dcim/api/nested_serializers.py @@ -101,7 +101,7 @@ class NestedRackSerializer(WritableNestedSerializer): class Meta: model = models.Rack - fields = ['id', 'url', 'display', 'name', 'display_name', 'device_count'] + fields = ['id', 'url', 'display', 'name', 'device_count'] class NestedRackReservationSerializer(WritableNestedSerializer): @@ -136,7 +136,7 @@ class NestedDeviceTypeSerializer(WritableNestedSerializer): class Meta: model = models.DeviceType - fields = ['id', 'url', 'display', 'manufacturer', 'model', 'slug', 'display_name', 'device_count'] + fields = ['id', 'url', 'display', 'manufacturer', 'model', 'slug', 'device_count'] class NestedConsolePortTemplateSerializer(WritableNestedSerializer): @@ -232,7 +232,7 @@ class NestedDeviceSerializer(WritableNestedSerializer): class Meta: model = models.Device - fields = ['id', 'url', 'display', 'name', 'display_name'] + fields = ['id', 'url', 'display', 'name'] class NestedConsoleServerPortSerializer(WritableNestedSerializer): diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 377449140..d2ecad608 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -172,10 +172,9 @@ class RackSerializer(PrimaryModelSerializer): class Meta: model = Rack fields = [ - 'id', 'url', 'display', 'name', 'facility_id', 'display_name', 'site', 'location', 'tenant', 'status', - 'role', 'serial', 'asset_tag', 'type', 'width', 'u_height', 'desc_units', 'outer_width', 'outer_depth', - 'outer_unit', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'device_count', - 'powerfeed_count', + 'id', 'url', 'display', 'name', 'facility_id', 'site', 'location', 'tenant', 'status', 'role', 'serial', + 'asset_tag', 'type', 'width', 'u_height', 'desc_units', 'outer_width', 'outer_depth', 'outer_unit', + 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'device_count', 'powerfeed_count', ] # Omit the UniqueTogetherValidator that would be automatically added to validate (location, facility_id). This # prevents facility_id from being interpreted as a required field. @@ -284,9 +283,9 @@ class DeviceTypeSerializer(PrimaryModelSerializer): class Meta: model = DeviceType fields = [ - 'id', 'url', 'display', 'manufacturer', 'model', 'slug', 'display_name', 'part_number', 'u_height', - 'is_full_depth', 'subdevice_role', 'front_image', 'rear_image', 'comments', 'tags', 'custom_fields', - 'created', 'last_updated', 'device_count', + 'id', 'url', 'display', 'manufacturer', 'model', 'slug', 'part_number', 'u_height', 'is_full_depth', + 'subdevice_role', 'front_image', 'rear_image', 'comments', 'tags', 'custom_fields', 'created', + 'last_updated', 'device_count', ] @@ -465,10 +464,10 @@ class DeviceSerializer(PrimaryModelSerializer): class Meta: model = Device fields = [ - 'id', 'url', 'display', 'name', 'display_name', 'device_type', 'device_role', 'tenant', 'platform', - 'serial', 'asset_tag', 'site', 'location', 'rack', 'position', 'face', 'parent_device', 'status', - 'primary_ip', 'primary_ip4', 'primary_ip6', 'cluster', 'virtual_chassis', 'vc_position', 'vc_priority', - 'comments', 'local_context_data', 'tags', 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display', 'name', 'device_type', 'device_role', 'tenant', 'platform', 'serial', 'asset_tag', + 'site', 'location', 'rack', 'position', 'face', 'parent_device', 'status', 'primary_ip', 'primary_ip4', + 'primary_ip6', 'cluster', 'virtual_chassis', 'vc_position', 'vc_priority', 'comments', 'local_context_data', + 'tags', 'custom_fields', 'created', 'last_updated', ] validators = [] @@ -501,10 +500,10 @@ class DeviceWithConfigContextSerializer(DeviceSerializer): class Meta(DeviceSerializer.Meta): fields = [ - 'id', 'url', 'display', 'name', 'display_name', 'device_type', 'device_role', 'tenant', 'platform', - 'serial', 'asset_tag', 'site', 'location', 'rack', 'position', 'face', 'parent_device', 'status', - 'primary_ip', 'primary_ip4', 'primary_ip6', 'cluster', 'virtual_chassis', 'vc_position', 'vc_priority', - 'comments', 'local_context_data', 'tags', 'custom_fields', 'config_context', 'created', 'last_updated', + 'id', 'url', 'display', 'name', 'device_type', 'device_role', 'tenant', 'platform', 'serial', 'asset_tag', + 'site', 'location', 'rack', 'position', 'face', 'parent_device', 'status', 'primary_ip', 'primary_ip4', + 'primary_ip6', 'cluster', 'virtual_chassis', 'vc_position', 'vc_priority', 'comments', 'local_context_data', + 'tags', 'custom_fields', 'config_context', 'created', 'last_updated', ] @swagger_serializer_method(serializer_or_field=serializers.DictField) diff --git a/netbox/dcim/elevations.py b/netbox/dcim/elevations.py index 8571c6684..473b9608f 100644 --- a/netbox/dcim/elevations.py +++ b/netbox/dcim/elevations.py @@ -34,10 +34,11 @@ class RackElevationSVG: @staticmethod def _get_device_description(device): - return '{} ({}) — {} ({}U) {} {}'.format( + return '{} ({}) — {} {} ({}U) {} {}'.format( device.name, device.device_role, - device.device_type.display_name, + device.device_type.manufacturer.name, + device.device_type.model, device.device_type.u_height, device.asset_tag or '', device.serial or '' diff --git a/netbox/dcim/models/devices.py b/netbox/dcim/models/devices.py index 2fe7c28e5..391d6bb4c 100644 --- a/netbox/dcim/models/devices.py +++ b/netbox/dcim/models/devices.py @@ -320,10 +320,6 @@ class DeviceType(PrimaryModel): if self.rear_image: self.rear_image.delete(save=False) - @property - def display_name(self): - return f'{self.manufacturer.name} {self.model}' - @property def is_parent_device(self): return self.subdevice_role == SubdeviceRoleChoices.ROLE_PARENT @@ -622,7 +618,13 @@ class Device(PrimaryModel, ConfigContextModel): ) def __str__(self): - return self.display_name or super().__str__() + if self.name: + return self.name + elif self.virtual_chassis: + return f'{self.virtual_chassis.name}:{self.vc_position} ({self.pk})' + elif self.device_type: + return f'{self.device_type.manufacturer} {self.device_type.model} ({self.pk})' + return super().__str__() def get_absolute_url(self): return reverse('dcim:device', args=[self.pk]) @@ -823,17 +825,6 @@ class Device(PrimaryModel, ConfigContextModel): self.comments, ) - @property - def display_name(self): - if self.name: - return self.name - elif self.virtual_chassis: - return f'{self.virtual_chassis.name}:{self.vc_position} ({self.pk})' - elif self.device_type: - return f'{self.device_type.manufacturer} {self.device_type.model} ({self.pk})' - else: - return '' # Device has not yet been created - @property def identifier(self): """ diff --git a/netbox/dcim/models/racks.py b/netbox/dcim/models/racks.py index 2869c4265..0c70a9a83 100644 --- a/netbox/dcim/models/racks.py +++ b/netbox/dcim/models/racks.py @@ -209,7 +209,9 @@ class Rack(PrimaryModel): ) def __str__(self): - return self.display_name or super().__str__() + if self.facility_id: + return f'{self.name} ({self.facility_id})' + return self.name def get_absolute_url(self): return reverse('dcim:rack', args=[self.pk]) @@ -277,12 +279,6 @@ class Rack(PrimaryModel): else: return reversed(range(1, self.u_height + 1)) - @property - def display_name(self): - if self.facility_id: - return f'{self.name} ({self.facility_id})' - return self.name - def get_status_class(self): return RackStatusChoices.CSS_CLASSES.get(self.status) diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index 24130c649..92ffd1207 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -251,7 +251,7 @@ class RackRoleTest(APIViewTestCases.APIViewTestCase): class RackTest(APIViewTestCases.APIViewTestCase): model = Rack - brief_fields = ['device_count', 'display', 'display_name', 'id', 'name', 'url'] + brief_fields = ['device_count', 'display', 'id', 'name', 'url'] bulk_update_data = { 'status': 'planned', } @@ -422,7 +422,7 @@ class ManufacturerTest(APIViewTestCases.APIViewTestCase): class DeviceTypeTest(APIViewTestCases.APIViewTestCase): model = DeviceType - brief_fields = ['device_count', 'display', 'display_name', 'id', 'manufacturer', 'model', 'slug', 'url'] + brief_fields = ['device_count', 'display', 'id', 'manufacturer', 'model', 'slug', 'url'] bulk_update_data = { 'part_number': 'ABC123', } @@ -870,7 +870,7 @@ class PlatformTest(APIViewTestCases.APIViewTestCase): class DeviceTest(APIViewTestCases.APIViewTestCase): model = Device - brief_fields = ['display', 'display_name', 'id', 'name', 'url'] + brief_fields = ['display', 'id', 'name', 'url'] bulk_update_data = { 'status': 'failed', } diff --git a/netbox/extras/api/serializers.py b/netbox/extras/api/serializers.py index 66627bfbc..536df1c75 100644 --- a/netbox/extras/api/serializers.py +++ b/netbox/extras/api/serializers.py @@ -453,12 +453,7 @@ class ObjectChangeSerializer(BaseModelSerializer): class ContentTypeSerializer(BaseModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:contenttype-detail') - display_name = serializers.SerializerMethodField() class Meta: model = ContentType - fields = ['id', 'url', 'display', 'app_label', 'model', 'display_name'] - - @swagger_serializer_method(serializer_or_field=serializers.CharField) - def get_display_name(self, obj): - return obj.app_labeled_name + fields = ['id', 'url', 'display', 'app_label', 'model'] diff --git a/netbox/ipam/api/nested_serializers.py b/netbox/ipam/api/nested_serializers.py index a5eb63911..f2aa5f19e 100644 --- a/netbox/ipam/api/nested_serializers.py +++ b/netbox/ipam/api/nested_serializers.py @@ -27,7 +27,7 @@ class NestedVRFSerializer(WritableNestedSerializer): class Meta: model = models.VRF - fields = ['id', 'url', 'display', 'name', 'rd', 'display_name', 'prefix_count'] + fields = ['id', 'url', 'display', 'name', 'rd', 'prefix_count'] # @@ -92,7 +92,7 @@ class NestedVLANSerializer(WritableNestedSerializer): class Meta: model = models.VLAN - fields = ['id', 'url', 'display', 'vid', 'name', 'display_name'] + fields = ['id', 'url', 'display', 'vid', 'name'] # diff --git a/netbox/ipam/api/serializers.py b/netbox/ipam/api/serializers.py index 931e2cc47..324c4de03 100644 --- a/netbox/ipam/api/serializers.py +++ b/netbox/ipam/api/serializers.py @@ -44,8 +44,7 @@ class VRFSerializer(PrimaryModelSerializer): model = VRF fields = [ 'id', 'url', 'display', 'name', 'rd', 'tenant', 'enforce_unique', 'description', 'import_targets', - 'export_targets', 'tags', 'display_name', 'custom_fields', 'created', 'last_updated', 'ipaddress_count', - 'prefix_count', + 'export_targets', 'tags', 'custom_fields', 'created', 'last_updated', 'ipaddress_count', 'prefix_count', ] @@ -167,7 +166,7 @@ class VLANSerializer(PrimaryModelSerializer): model = VLAN fields = [ 'id', 'url', 'display', 'site', 'group', 'vid', 'name', 'tenant', 'status', 'role', 'description', 'tags', - 'display_name', 'custom_fields', 'created', 'last_updated', 'prefix_count', + 'custom_fields', 'created', 'last_updated', 'prefix_count', ] validators = [] diff --git a/netbox/ipam/models/vlans.py b/netbox/ipam/models/vlans.py index d0f5375e2..616d11aba 100644 --- a/netbox/ipam/models/vlans.py +++ b/netbox/ipam/models/vlans.py @@ -172,7 +172,7 @@ class VLAN(PrimaryModel): verbose_name_plural = 'VLANs' def __str__(self): - return self.display_name or super().__str__() + return f'{self.name} ({self.vid})' def get_absolute_url(self): return reverse('ipam:vlan', args=[self.pk]) @@ -199,10 +199,6 @@ class VLAN(PrimaryModel): self.description, ) - @property - def display_name(self): - return f'{self.name} ({self.vid})' - def get_status_class(self): return VLANStatusChoices.CSS_CLASSES.get(self.status) diff --git a/netbox/ipam/models/vrfs.py b/netbox/ipam/models/vrfs.py index 9eb2c6ab6..f674a7f65 100644 --- a/netbox/ipam/models/vrfs.py +++ b/netbox/ipam/models/vrfs.py @@ -71,7 +71,9 @@ class VRF(PrimaryModel): verbose_name_plural = 'VRFs' def __str__(self): - return self.display_name or super().__str__() + if self.rd: + return f'{self.name} ({self.rd})' + return self.name def get_absolute_url(self): return reverse('ipam:vrf', args=[self.pk]) @@ -85,12 +87,6 @@ class VRF(PrimaryModel): self.description, ) - @property - def display_name(self): - if self.rd: - return f'{self.name} ({self.rd})' - return self.name - @extras_features('custom_fields', 'custom_links', 'export_templates', 'webhooks') class RouteTarget(PrimaryModel): diff --git a/netbox/ipam/tests/test_api.py b/netbox/ipam/tests/test_api.py index b2b4b9e8f..0de07b06b 100644 --- a/netbox/ipam/tests/test_api.py +++ b/netbox/ipam/tests/test_api.py @@ -22,7 +22,7 @@ class AppTest(APITestCase): class VRFTest(APIViewTestCases.APIViewTestCase): model = VRF - brief_fields = ['display', 'display_name', 'id', 'name', 'prefix_count', 'rd', 'url'] + brief_fields = ['display', 'id', 'name', 'prefix_count', 'rd', 'url'] create_data = [ { 'name': 'VRF 4', @@ -421,7 +421,7 @@ class VLANGroupTest(APIViewTestCases.APIViewTestCase): class VLANTest(APIViewTestCases.APIViewTestCase): model = VLAN - brief_fields = ['display', 'display_name', 'id', 'name', 'url', 'vid'] + brief_fields = ['display', 'id', 'name', 'url', 'vid'] bulk_update_data = { 'description': 'New description', } diff --git a/netbox/templates/dcim/device.html b/netbox/templates/dcim/device.html index 8d85692cc..24eacd2de 100644 --- a/netbox/templates/dcim/device.html +++ b/netbox/templates/dcim/device.html @@ -94,7 +94,7 @@