From 1c9e11e65db405dcad8921b74a8bbabbdac6d3b8 Mon Sep 17 00:00:00 2001 From: Arthur Date: Tue, 4 Jun 2024 14:02:00 -0700 Subject: [PATCH 01/16] 15156 add display_url to REST API --- docs/plugins/development/rest-api.md | 6 + netbox/circuits/api/nested_serializers.py | 18 ++- netbox/circuits/api/serializers_/circuits.py | 24 ++-- netbox/circuits/api/serializers_/providers.py | 13 +- netbox/core/api/nested_serializers.py | 9 +- netbox/core/api/serializers_/data.py | 10 +- netbox/core/api/serializers_/jobs.py | 3 +- netbox/dcim/api/nested_serializers.py | 126 ++++++++++++------ netbox/dcim/api/serializers_/cables.py | 14 +- .../api/serializers_/device_components.py | 57 ++++---- netbox/dcim/api/serializers_/devices.py | 41 +++--- .../api/serializers_/devicetype_components.py | 52 +++++--- netbox/dcim/api/serializers_/devicetypes.py | 20 +-- netbox/dcim/api/serializers_/manufacturers.py | 5 +- netbox/dcim/api/serializers_/platforms.py | 5 +- netbox/dcim/api/serializers_/power.py | 14 +- netbox/dcim/api/serializers_/racks.py | 19 +-- netbox/dcim/api/serializers_/roles.py | 10 +- netbox/dcim/api/serializers_/sites.py | 24 ++-- .../dcim/api/serializers_/virtualchassis.py | 5 +- netbox/extras/api/nested_serializers.py | 43 ++++-- netbox/extras/api/serializers_/attachments.py | 5 +- netbox/extras/api/serializers_/bookmarks.py | 3 +- .../extras/api/serializers_/change_logging.py | 5 +- .../extras/api/serializers_/configcontexts.py | 9 +- .../api/serializers_/configtemplates.py | 5 +- .../extras/api/serializers_/customfields.py | 14 +- netbox/extras/api/serializers_/customlinks.py | 5 +- netbox/extras/api/serializers_/events.py | 10 +- .../api/serializers_/exporttemplates.py | 3 +- netbox/extras/api/serializers_/journaling.py | 5 +- netbox/extras/api/serializers_/objecttypes.py | 3 +- .../extras/api/serializers_/savedfilters.py | 5 +- netbox/extras/api/serializers_/scripts.py | 3 +- netbox/extras/api/serializers_/tags.py | 5 +- netbox/ipam/api/nested_serializers.py | 50 ++++--- netbox/ipam/api/serializers_/asns.py | 15 ++- netbox/ipam/api/serializers_/fhrpgroups.py | 10 +- netbox/ipam/api/serializers_/ip.py | 24 ++-- netbox/ipam/api/serializers_/roles.py | 5 +- netbox/ipam/api/serializers_/services.py | 10 +- netbox/ipam/api/serializers_/vlans.py | 11 +- netbox/ipam/api/serializers_/vrfs.py | 8 +- netbox/netbox/api/serializers/nested.py | 3 +- netbox/tenancy/api/nested_serializers.py | 18 ++- netbox/tenancy/api/serializers_/contacts.py | 19 ++- netbox/tenancy/api/serializers_/tenants.py | 13 +- netbox/users/api/nested_serializers.py | 14 +- netbox/users/api/serializers_/permissions.py | 5 +- netbox/users/api/serializers_/tokens.py | 9 +- netbox/users/api/serializers_/users.py | 8 +- .../virtualization/api/nested_serializers.py | 18 ++- .../api/serializers_/clusters.py | 16 ++- .../api/serializers_/virtualmachines.py | 25 ++-- netbox/vpn/api/nested_serializers.py | 44 ++++-- netbox/vpn/api/serializers_/crypto.py | 35 +++-- netbox/vpn/api/serializers_/l2vpn.py | 8 +- netbox/vpn/api/serializers_/tunnels.py | 20 ++- netbox/wireless/api/nested_serializers.py | 9 +- .../wireless/api/serializers_/wirelesslans.py | 11 +- .../api/serializers_/wirelesslinks.py | 6 +- 61 files changed, 646 insertions(+), 366 deletions(-) diff --git a/docs/plugins/development/rest-api.md b/docs/plugins/development/rest-api.md index ea195dafc0c..1563ae1c5f2 100644 --- a/docs/plugins/development/rest-api.md +++ b/docs/plugins/development/rest-api.md @@ -39,6 +39,9 @@ class MyModelSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField( view_name='plugins-api:myplugin-api:mymodel-detail' ) + display_url = serializers.HyperlinkedIdentityField( + view_name='plugins:myplugin:mymodel-detail' + ) class Meta: model = MyModel @@ -66,6 +69,9 @@ class NestedMyModelSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField( view_name='plugins-api:myplugin-api:mymodel-detail' ) + display_url = serializers.HyperlinkedIdentityField( + view_name='plugins:myplugin:mymodel-detail' + ) class Meta: model = MyModel diff --git a/netbox/circuits/api/nested_serializers.py b/netbox/circuits/api/nested_serializers.py index 36254dc8b50..37e91105b48 100644 --- a/netbox/circuits/api/nested_serializers.py +++ b/netbox/circuits/api/nested_serializers.py @@ -21,10 +21,11 @@ class NestedProviderNetworkSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:providernetwork-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='circuits:providernetwork-detail') class Meta: model = ProviderNetwork - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] # @@ -36,11 +37,12 @@ class Meta: ) class NestedProviderSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:provider-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='circuits:provider-detail') circuit_count = RelatedObjectCountField('circuits') class Meta: model = Provider - fields = ['id', 'url', 'display', 'name', 'slug', 'circuit_count'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'circuit_count'] # @@ -49,10 +51,11 @@ class Meta: class NestedProviderAccountSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:provideraccount-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='circuits:provideraccount-detail') class Meta: model = ProviderAccount - fields = ['id', 'url', 'display', 'name', 'account'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'account'] # @@ -64,25 +67,28 @@ class Meta: ) class NestedCircuitTypeSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittype-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='circuits:circuittype-detail') circuit_count = RelatedObjectCountField('circuits') class Meta: model = CircuitType - fields = ['id', 'url', 'display', 'name', 'slug', 'circuit_count'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'circuit_count'] class NestedCircuitSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuit-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='circuits:circuit-detail') class Meta: model = Circuit - fields = ['id', 'url', 'display', 'cid'] + fields = ['id', 'url', 'display_url', 'display', 'cid'] class NestedCircuitTerminationSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittermination-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='circuits:circuittermination-detail') circuit = NestedCircuitSerializer() class Meta: model = CircuitTermination - fields = ['id', 'url', 'display', 'circuit', 'term_side', 'cable', '_occupied'] + fields = ['id', 'url', 'display_url', 'display', 'circuit', 'term_side', 'cable', '_occupied'] diff --git a/netbox/circuits/api/serializers_/circuits.py b/netbox/circuits/api/serializers_/circuits.py index a0d0e5e134b..d431416a5df 100644 --- a/netbox/circuits/api/serializers_/circuits.py +++ b/netbox/circuits/api/serializers_/circuits.py @@ -19,6 +19,7 @@ class CircuitTypeSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittype-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='circuits:circuittype-detail') # Related object counts circuit_count = RelatedObjectCountField('circuits') @@ -26,27 +27,29 @@ class CircuitTypeSerializer(NetBoxModelSerializer): class Meta: model = CircuitType fields = [ - 'id', 'url', 'display', 'name', 'slug', 'color', 'description', 'tags', 'custom_fields', 'created', - 'last_updated', 'circuit_count', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'color', 'description', 'tags', 'custom_fields', + 'created', 'last_updated', 'circuit_count', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'circuit_count') class CircuitCircuitTerminationSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittermination-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='circuits:circuittermination-detail') site = SiteSerializer(nested=True, allow_null=True) provider_network = ProviderNetworkSerializer(nested=True, allow_null=True) class Meta: model = CircuitTermination fields = [ - 'id', 'url', 'display', 'site', 'provider_network', 'port_speed', 'upstream_speed', 'xconnect_id', - 'description', + 'id', 'url', 'display_url', 'display', 'site', 'provider_network', 'port_speed', 'upstream_speed', + 'xconnect_id', 'description', ] class CircuitSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuit-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='circuits:circuit-detail') provider = ProviderSerializer(nested=True) provider_account = ProviderAccountSerializer(nested=True, required=False, allow_null=True, default=None) status = ChoiceField(choices=CircuitStatusChoices, required=False) @@ -58,15 +61,16 @@ class CircuitSerializer(NetBoxModelSerializer): class Meta: model = Circuit fields = [ - 'id', 'url', 'display', 'cid', 'provider', 'provider_account', 'type', 'status', 'tenant', 'install_date', - 'termination_date', 'commit_rate', 'description', 'termination_a', 'termination_z', 'comments', 'tags', - 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'cid', 'provider', 'provider_account', 'type', 'status', 'tenant', + 'install_date', 'termination_date', 'commit_rate', 'description', 'termination_a', 'termination_z', + 'comments', 'tags', 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'cid', 'description') class CircuitTerminationSerializer(NetBoxModelSerializer, CabledObjectSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittermination-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='circuits:circuittermination-detail') circuit = CircuitSerializer(nested=True) site = SiteSerializer(nested=True, required=False, allow_null=True) provider_network = ProviderNetworkSerializer(nested=True, required=False, allow_null=True) @@ -74,8 +78,8 @@ class CircuitTerminationSerializer(NetBoxModelSerializer, CabledObjectSerializer class Meta: model = CircuitTermination fields = [ - 'id', 'url', 'display', 'circuit', 'term_side', 'site', 'provider_network', 'port_speed', 'upstream_speed', - 'xconnect_id', 'pp_info', 'description', 'mark_connected', 'cable', 'cable_end', 'link_peers', - 'link_peers_type', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied', + 'id', 'url', 'display_url', 'display', 'circuit', 'term_side', 'site', 'provider_network', 'port_speed', + 'upstream_speed', 'xconnect_id', 'pp_info', 'description', 'mark_connected', 'cable', 'cable_end', + 'link_peers', 'link_peers_type', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied', ] brief_fields = ('id', 'url', 'display', 'circuit', 'term_side', 'description', 'cable', '_occupied') diff --git a/netbox/circuits/api/serializers_/providers.py b/netbox/circuits/api/serializers_/providers.py index fa448978777..6e9eee1f01b 100644 --- a/netbox/circuits/api/serializers_/providers.py +++ b/netbox/circuits/api/serializers_/providers.py @@ -16,6 +16,7 @@ class ProviderSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:provider-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='circuits:provider-detail') accounts = SerializedPKRelatedField( queryset=ProviderAccount.objects.all(), serializer=NestedProviderAccountSerializer, @@ -36,34 +37,36 @@ class ProviderSerializer(NetBoxModelSerializer): class Meta: model = Provider fields = [ - 'id', 'url', 'display', 'name', 'slug', 'accounts', 'description', 'comments', 'asns', 'tags', - 'custom_fields', 'created', 'last_updated', 'circuit_count', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'accounts', 'description', 'comments', + 'asns', 'tags', 'custom_fields', 'created', 'last_updated', 'circuit_count', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'circuit_count') class ProviderAccountSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:provideraccount-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='circuits:provideraccount-detail') provider = ProviderSerializer(nested=True) name = serializers.CharField(allow_blank=True, max_length=100, required=False, default='') class Meta: model = ProviderAccount fields = [ - 'id', 'url', 'display', 'provider', 'name', 'account', 'description', 'comments', 'tags', 'custom_fields', - 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'provider', 'name', 'account', 'description', 'comments', 'tags', + 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'account', 'description') class ProviderNetworkSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:providernetwork-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='circuits:providernetwork-detail') provider = ProviderSerializer(nested=True) class Meta: model = ProviderNetwork fields = [ - 'id', 'url', 'display', 'provider', 'name', 'service_id', 'description', 'comments', 'tags', + 'id', 'url', 'display_url', 'display', 'provider', 'name', 'service_id', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') diff --git a/netbox/core/api/nested_serializers.py b/netbox/core/api/nested_serializers.py index efb748ee048..28a8b1e70a2 100644 --- a/netbox/core/api/nested_serializers.py +++ b/netbox/core/api/nested_serializers.py @@ -15,22 +15,25 @@ class NestedDataSourceSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='core-api:datasource-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='core:datasource-detail') class Meta: model = DataSource - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedDataFileSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='core-api:datafile-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='core:datafile-detail') class Meta: model = DataFile - fields = ['id', 'url', 'display', 'path'] + fields = ['id', 'url', 'display_url', 'display', 'path'] class NestedJobSerializer(serializers.ModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='core-api:job-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='core:job-detail') status = ChoiceField(choices=JobStatusChoices) user = UserSerializer( nested=True, @@ -39,4 +42,4 @@ class NestedJobSerializer(serializers.ModelSerializer): class Meta: model = Job - fields = ['url', 'created', 'completed', 'user', 'status'] + fields = ['url', 'display_url', 'created', 'completed', 'user', 'status'] diff --git a/netbox/core/api/serializers_/data.py b/netbox/core/api/serializers_/data.py index e60d8d95ba7..0832a06e111 100644 --- a/netbox/core/api/serializers_/data.py +++ b/netbox/core/api/serializers_/data.py @@ -16,6 +16,9 @@ class DataSourceSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField( view_name='core-api:datasource-detail' ) + display_url = serializers.HyperlinkedIdentityField( + view_name='core:datasource-detail' + ) type = ChoiceField( choices=get_data_backend_choices() ) @@ -30,7 +33,7 @@ class DataSourceSerializer(NetBoxModelSerializer): class Meta: model = DataSource fields = [ - 'id', 'url', 'display', 'name', 'type', 'source_url', 'enabled', 'status', 'description', 'comments', + 'id', 'url', 'display_url', 'display', 'name', 'type', 'source_url', 'enabled', 'status', 'description', 'comments', 'parameters', 'ignore_rules', 'custom_fields', 'created', 'last_updated', 'file_count', ] brief_fields = ('id', 'url', 'display', 'name', 'description') @@ -40,6 +43,9 @@ class DataFileSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField( view_name='core-api:datafile-detail' ) + display_url = serializers.HyperlinkedIdentityField( + view_name='core:datafile-detail' + ) source = DataSourceSerializer( nested=True, read_only=True @@ -48,6 +54,6 @@ class DataFileSerializer(NetBoxModelSerializer): class Meta: model = DataFile fields = [ - 'id', 'url', 'display', 'source', 'path', 'last_updated', 'size', 'hash', + 'id', 'url', 'display_url', 'display', 'source', 'path', 'last_updated', 'size', 'hash', ] brief_fields = ('id', 'url', 'display', 'path') diff --git a/netbox/core/api/serializers_/jobs.py b/netbox/core/api/serializers_/jobs.py index 84afa3627e7..2edf6094924 100644 --- a/netbox/core/api/serializers_/jobs.py +++ b/netbox/core/api/serializers_/jobs.py @@ -13,6 +13,7 @@ class JobSerializer(BaseModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='core-api:job-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='core:job-detail') user = UserSerializer( nested=True, read_only=True @@ -25,7 +26,7 @@ class JobSerializer(BaseModelSerializer): class Meta: model = Job fields = [ - 'id', 'url', 'display', 'object_type', 'object_id', 'name', 'status', 'created', 'scheduled', 'interval', + 'id', 'url', 'display_url', 'display', 'object_type', 'object_id', 'name', 'status', 'created', 'scheduled', 'interval', 'started', 'completed', 'user', 'data', 'error', 'job_id', ] brief_fields = ('url', 'created', 'completed', 'user', 'status') diff --git a/netbox/dcim/api/nested_serializers.py b/netbox/dcim/api/nested_serializers.py index bcb141a7114..a59316be8df 100644 --- a/netbox/dcim/api/nested_serializers.py +++ b/netbox/dcim/api/nested_serializers.py @@ -58,12 +58,13 @@ ) class NestedRegionSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:region-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:region-detail') site_count = serializers.IntegerField(read_only=True) _depth = serializers.IntegerField(source='level', read_only=True) class Meta: model = models.Region - fields = ['id', 'url', 'display', 'name', 'slug', 'site_count', '_depth'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'site_count', '_depth'] @extend_schema_serializer( @@ -71,20 +72,22 @@ class Meta: ) class NestedSiteGroupSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:sitegroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:sitegroup-detail') site_count = serializers.IntegerField(read_only=True) _depth = serializers.IntegerField(source='level', read_only=True) class Meta: model = models.SiteGroup - fields = ['id', 'url', 'display', 'name', 'slug', 'site_count', '_depth'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'site_count', '_depth'] class NestedSiteSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:site-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:site-detail') class Meta: model = models.Site - fields = ['id', 'url', 'display', 'name', 'slug'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug'] # @@ -96,12 +99,13 @@ class Meta: ) class NestedLocationSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:location-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:location-detail') rack_count = serializers.IntegerField(read_only=True) _depth = serializers.IntegerField(source='level', read_only=True) class Meta: model = models.Location - fields = ['id', 'url', 'display', 'name', 'slug', 'rack_count', '_depth'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'rack_count', '_depth'] @extend_schema_serializer( @@ -109,11 +113,12 @@ class Meta: ) class NestedRackRoleSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackrole-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rackrole-detail') rack_count = RelatedObjectCountField('racks') class Meta: model = models.RackRole - fields = ['id', 'url', 'display', 'name', 'slug', 'rack_count'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'rack_count'] @extend_schema_serializer( @@ -121,20 +126,22 @@ class Meta: ) class NestedRackSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rack-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rack-detail') device_count = RelatedObjectCountField('devices') class Meta: model = models.Rack - fields = ['id', 'url', 'display', 'name', 'device_count'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'device_count'] class NestedRackReservationSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackreservation-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rackreservation-detail') user = serializers.SerializerMethodField(read_only=True) class Meta: model = models.RackReservation - fields = ['id', 'url', 'display', 'user', 'units'] + fields = ['id', 'url', 'display_url', 'display', 'user', 'units'] def get_user(self, obj): return obj.user.username @@ -149,11 +156,12 @@ def get_user(self, obj): ) class NestedManufacturerSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:manufacturer-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:manufacturer-detail') devicetype_count = RelatedObjectCountField('device_types') class Meta: model = models.Manufacturer - fields = ['id', 'url', 'display', 'name', 'slug', 'devicetype_count'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'devicetype_count'] @extend_schema_serializer( @@ -161,21 +169,23 @@ class Meta: ) class NestedDeviceTypeSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicetype-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:devicetype-detail') manufacturer = NestedManufacturerSerializer(read_only=True) device_count = RelatedObjectCountField('instances') class Meta: model = models.DeviceType - fields = ['id', 'url', 'display', 'manufacturer', 'model', 'slug', 'device_count'] + fields = ['id', 'url', 'display_url', 'display', 'manufacturer', 'model', 'slug', 'device_count'] class NestedModuleTypeSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:moduletype-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:moduletype-detail') manufacturer = NestedManufacturerSerializer(read_only=True) class Meta: model = models.ModuleType - fields = ['id', 'url', 'display', 'manufacturer', 'model'] + fields = ['id', 'url', 'display_url', 'display', 'manufacturer', 'model'] # @@ -184,83 +194,93 @@ class Meta: class NestedConsolePortTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleporttemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:consoleporttemplate-detail') class Meta: model = models.ConsolePortTemplate - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedConsoleServerPortTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleserverporttemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:consoleserverporttemplate-detail') class Meta: model = models.ConsoleServerPortTemplate - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedPowerPortTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerporttemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:powerporttemplate-detail') class Meta: model = models.PowerPortTemplate - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedPowerOutletTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:poweroutlettemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:poweroutlettemplate-detail') class Meta: model = models.PowerOutletTemplate - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedInterfaceTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:interfacetemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:interfacetemplate-detail') class Meta: model = models.InterfaceTemplate - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedRearPortTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearporttemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rearporttemplate-detail') class Meta: model = models.RearPortTemplate - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedFrontPortTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:frontporttemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:frontporttemplate-detail') class Meta: model = models.FrontPortTemplate - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedModuleBayTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:modulebaytemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:modulebaytemplate-detail') class Meta: model = models.ModuleBayTemplate - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedDeviceBayTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicebaytemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:devicebaytemplate-detail') class Meta: model = models.DeviceBayTemplate - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedInventoryItemTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitemtemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:inventoryitemtemplate-detail') _depth = serializers.IntegerField(source='level', read_only=True) class Meta: model = models.InventoryItemTemplate - fields = ['id', 'url', 'display', 'name', '_depth'] + fields = ['id', 'url', 'display_url', 'display', 'name', '_depth'] # @@ -272,12 +292,13 @@ class Meta: ) class NestedDeviceRoleSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicerole-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:devicerole-detail') device_count = RelatedObjectCountField('devices') virtualmachine_count = RelatedObjectCountField('virtual_machines') class Meta: model = models.DeviceRole - fields = ['id', 'url', 'display', 'name', 'slug', 'device_count', 'virtualmachine_count'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'device_count', 'virtualmachine_count'] @extend_schema_serializer( @@ -285,145 +306,160 @@ class Meta: ) class NestedPlatformSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:platform-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:platform-detail') device_count = RelatedObjectCountField('devices') virtualmachine_count = RelatedObjectCountField('virtual_machines') class Meta: model = models.Platform - fields = ['id', 'url', 'display', 'name', 'slug', 'device_count', 'virtualmachine_count'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'device_count', 'virtualmachine_count'] class NestedDeviceSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:device-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:device-detail') class Meta: model = models.Device - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class ModuleNestedModuleBaySerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:modulebay-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:modulebay-detail') class Meta: model = models.ModuleBay - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class ModuleBayNestedModuleSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:module-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:module-detail') class Meta: model = models.Module - fields = ['id', 'url', 'display', 'serial'] + fields = ['id', 'url', 'display_url', 'display', 'serial'] class NestedModuleSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:module-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:module-detail') device = NestedDeviceSerializer(read_only=True) module_bay = ModuleNestedModuleBaySerializer(read_only=True) module_type = NestedModuleTypeSerializer(read_only=True) class Meta: model = models.Module - fields = ['id', 'url', 'display', 'device', 'module_bay', 'module_type'] + fields = ['id', 'url', 'display_url', 'display', 'device', 'module_bay', 'module_type'] class NestedConsoleServerPortSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleserverport-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:consoleserverport-detail') device = NestedDeviceSerializer(read_only=True) _occupied = serializers.BooleanField(required=False, read_only=True) class Meta: model = models.ConsoleServerPort - fields = ['id', 'url', 'display', 'device', 'name', 'cable', '_occupied'] + fields = ['id', 'url', 'display_url', 'display', 'device', 'name', 'cable', '_occupied'] class NestedConsolePortSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleport-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:consoleport-detail') device = NestedDeviceSerializer(read_only=True) _occupied = serializers.BooleanField(required=False, read_only=True) class Meta: model = models.ConsolePort - fields = ['id', 'url', 'display', 'device', 'name', 'cable', '_occupied'] + fields = ['id', 'url', 'display_url', 'display', 'device', 'name', 'cable', '_occupied'] class NestedPowerOutletSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:poweroutlet-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:poweroutlet-detail') device = NestedDeviceSerializer(read_only=True) _occupied = serializers.BooleanField(required=False, read_only=True) class Meta: model = models.PowerOutlet - fields = ['id', 'url', 'display', 'device', 'name', 'cable', '_occupied'] + fields = ['id', 'url', 'display_url', 'display', 'device', 'name', 'cable', '_occupied'] class NestedPowerPortSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerport-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:powerport-detail') device = NestedDeviceSerializer(read_only=True) _occupied = serializers.BooleanField(required=False, read_only=True) class Meta: model = models.PowerPort - fields = ['id', 'url', 'display', 'device', 'name', 'cable', '_occupied'] + fields = ['id', 'url', 'display_url', 'display', 'device', 'name', 'cable', '_occupied'] class NestedInterfaceSerializer(WritableNestedSerializer): device = NestedDeviceSerializer(read_only=True) url = serializers.HyperlinkedIdentityField(view_name='dcim-api:interface-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:interface-detail') _occupied = serializers.BooleanField(required=False, read_only=True) class Meta: model = models.Interface - fields = ['id', 'url', 'display', 'device', 'name', 'cable', '_occupied'] + fields = ['id', 'url', 'display_url', 'display', 'device', 'name', 'cable', '_occupied'] class NestedRearPortSerializer(WritableNestedSerializer): device = NestedDeviceSerializer(read_only=True) url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearport-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rearport-detail') _occupied = serializers.BooleanField(required=False, read_only=True) class Meta: model = models.RearPort - fields = ['id', 'url', 'display', 'device', 'name', 'cable', '_occupied'] + fields = ['id', 'url', 'display_url', 'display', 'device', 'name', 'cable', '_occupied'] class NestedFrontPortSerializer(WritableNestedSerializer): device = NestedDeviceSerializer(read_only=True) url = serializers.HyperlinkedIdentityField(view_name='dcim-api:frontport-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:frontport-detail') _occupied = serializers.BooleanField(required=False, read_only=True) class Meta: model = models.FrontPort - fields = ['id', 'url', 'display', 'device', 'name', 'cable', '_occupied'] + fields = ['id', 'url', 'display_url', 'display', 'device', 'name', 'cable', '_occupied'] class NestedModuleBaySerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:modulebay-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:modulebay-detail') installed_module = ModuleBayNestedModuleSerializer(required=False, allow_null=True) class Meta: model = models.ModuleBay - fields = ['id', 'url', 'display', 'installed_module', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'installed_module', 'name'] class NestedDeviceBaySerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicebay-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:devicebay-detail') device = NestedDeviceSerializer(read_only=True) class Meta: model = models.DeviceBay - fields = ['id', 'url', 'display', 'device', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'device', 'name'] class NestedInventoryItemSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitem-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:inventoryitem-detail') device = NestedDeviceSerializer(read_only=True) _depth = serializers.IntegerField(source='level', read_only=True) class Meta: model = models.InventoryItem - fields = ['id', 'url', 'display', 'device', 'name', '_depth'] + fields = ['id', 'url', 'display_url', 'display', 'device', 'name', '_depth'] @extend_schema_serializer( @@ -431,11 +467,12 @@ class Meta: ) class NestedInventoryItemRoleSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitemrole-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:inventoryitemrole-detail') inventoryitem_count = RelatedObjectCountField('inventory_items') class Meta: model = models.InventoryItemRole - fields = ['id', 'url', 'display', 'name', 'slug', 'inventoryitem_count'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'inventoryitem_count'] # @@ -444,10 +481,11 @@ class Meta: class NestedCableSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:cable-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:cable-detail') class Meta: model = models.Cable - fields = ['id', 'url', 'display', 'label'] + fields = ['id', 'url', 'display_url', 'display', 'label'] # @@ -459,12 +497,13 @@ class Meta: ) class NestedVirtualChassisSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:virtualchassis-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:virtualchassis-detail') master = NestedDeviceSerializer() member_count = serializers.IntegerField(read_only=True) class Meta: model = models.VirtualChassis - fields = ['id', 'url', 'display', 'name', 'master', 'member_count'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'master', 'member_count'] # @@ -476,26 +515,29 @@ class Meta: ) class NestedPowerPanelSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerpanel-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:powerpanel-detail') powerfeed_count = RelatedObjectCountField('powerfeeds') class Meta: model = models.PowerPanel - fields = ['id', 'url', 'display', 'name', 'powerfeed_count'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'powerfeed_count'] class NestedPowerFeedSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerfeed-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:powerfeed-detail') _occupied = serializers.BooleanField(required=False, read_only=True) class Meta: model = models.PowerFeed - fields = ['id', 'url', 'display', 'name', 'cable', '_occupied'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'cable', '_occupied'] class NestedVirtualDeviceContextSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:virtualdevicecontext-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:virtualdevicecontext-detail') device = NestedDeviceSerializer() class Meta: model = models.VirtualDeviceContext - fields = ['id', 'url', 'display', 'name', 'identifier', 'device'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'identifier', 'device'] diff --git a/netbox/dcim/api/serializers_/cables.py b/netbox/dcim/api/serializers_/cables.py index 94a125d0c56..bd408aa66d1 100644 --- a/netbox/dcim/api/serializers_/cables.py +++ b/netbox/dcim/api/serializers_/cables.py @@ -22,6 +22,7 @@ class CableSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:cable-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:cable-detail') a_terminations = GenericObjectSerializer(many=True, required=False) b_terminations = GenericObjectSerializer(many=True, required=False) status = ChoiceField(choices=LinkStatusChoices, required=False) @@ -31,8 +32,9 @@ class CableSerializer(NetBoxModelSerializer): 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', + 'id', 'url', 'display_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') @@ -42,16 +44,18 @@ class TracedCableSerializer(serializers.ModelSerializer): Used only while tracing a cable path. """ url = serializers.HyperlinkedIdentityField(view_name='dcim-api:cable-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:cable-detail') class Meta: model = Cable fields = [ - 'id', 'url', 'type', 'status', 'label', 'color', 'length', 'length_unit', 'description', + 'id', 'url', 'display_url', 'type', 'status', 'label', 'color', 'length', 'length_unit', 'description', ] class CableTerminationSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:cabletermination-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:cabletermination-detail') termination_type = ContentTypeField( queryset=ContentType.objects.filter(CABLE_TERMINATION_MODELS) ) @@ -60,8 +64,8 @@ class CableTerminationSerializer(NetBoxModelSerializer): class Meta: model = CableTermination fields = [ - 'id', 'url', 'display', 'cable', 'cable_end', 'termination_type', 'termination_id', 'termination', - 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'cable', 'cable_end', 'termination_type', 'termination_id', + 'termination', 'created', 'last_updated', ] @extend_schema_field(serializers.JSONField(allow_null=True)) diff --git a/netbox/dcim/api/serializers_/device_components.py b/netbox/dcim/api/serializers_/device_components.py index fd32d95d0c6..11d2a362a11 100644 --- a/netbox/dcim/api/serializers_/device_components.py +++ b/netbox/dcim/api/serializers_/device_components.py @@ -42,6 +42,7 @@ class ConsoleServerPortSerializer(NetBoxModelSerializer, CabledObjectSerializer, ConnectedEndpointsSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleserverport-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:consoleserverport-detail') device = DeviceSerializer(nested=True) module = ModuleSerializer( nested=True, @@ -63,7 +64,7 @@ class ConsoleServerPortSerializer(NetBoxModelSerializer, CabledObjectSerializer, class Meta: model = ConsoleServerPort fields = [ - 'id', 'url', 'display', 'device', 'module', 'name', 'label', 'type', 'speed', 'description', + 'id', 'url', 'display_url', 'display', 'device', 'module', 'name', 'label', 'type', 'speed', 'description', 'mark_connected', 'cable', 'cable_end', 'link_peers', 'link_peers_type', 'connected_endpoints', 'connected_endpoints_type', 'connected_endpoints_reachable', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied', @@ -73,6 +74,7 @@ class Meta: class ConsolePortSerializer(NetBoxModelSerializer, CabledObjectSerializer, ConnectedEndpointsSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleport-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:consoleport-detail') device = DeviceSerializer(nested=True) module = ModuleSerializer( nested=True, @@ -94,7 +96,7 @@ class ConsolePortSerializer(NetBoxModelSerializer, CabledObjectSerializer, Conne class Meta: model = ConsolePort fields = [ - 'id', 'url', 'display', 'device', 'module', 'name', 'label', 'type', 'speed', 'description', + 'id', 'url', 'display_url', 'display', 'device', 'module', 'name', 'label', 'type', 'speed', 'description', 'mark_connected', 'cable', 'cable_end', 'link_peers', 'link_peers_type', 'connected_endpoints', 'connected_endpoints_type', 'connected_endpoints_reachable', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied', @@ -104,6 +106,7 @@ class Meta: class PowerPortSerializer(NetBoxModelSerializer, CabledObjectSerializer, ConnectedEndpointsSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerport-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:powerport-detail') device = DeviceSerializer(nested=True) module = ModuleSerializer( nested=True, @@ -121,8 +124,8 @@ class PowerPortSerializer(NetBoxModelSerializer, CabledObjectSerializer, Connect class Meta: model = PowerPort fields = [ - 'id', 'url', 'display', 'device', 'module', 'name', 'label', 'type', 'maximum_draw', 'allocated_draw', - 'description', 'mark_connected', 'cable', 'cable_end', 'link_peers', 'link_peers_type', + 'id', 'url', 'display_url', 'display', 'device', 'module', 'name', 'label', 'type', 'maximum_draw', + 'allocated_draw', 'description', 'mark_connected', 'cable', 'cable_end', 'link_peers', 'link_peers_type', 'connected_endpoints', 'connected_endpoints_type', 'connected_endpoints_reachable', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied', ] @@ -131,6 +134,7 @@ class Meta: class PowerOutletSerializer(NetBoxModelSerializer, CabledObjectSerializer, ConnectedEndpointsSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:poweroutlet-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:poweroutlet-detail') device = DeviceSerializer(nested=True) module = ModuleSerializer( nested=True, @@ -159,8 +163,8 @@ class PowerOutletSerializer(NetBoxModelSerializer, CabledObjectSerializer, Conne class Meta: model = PowerOutlet fields = [ - 'id', 'url', 'display', 'device', 'module', 'name', 'label', 'type', 'power_port', 'feed_leg', - 'description', 'mark_connected', 'cable', 'cable_end', 'link_peers', 'link_peers_type', + 'id', 'url', 'display_url', 'display', 'device', 'module', 'name', 'label', 'type', 'power_port', + 'feed_leg', 'description', 'mark_connected', 'cable', 'cable_end', 'link_peers', 'link_peers_type', 'connected_endpoints', 'connected_endpoints_type', 'connected_endpoints_reachable', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied', ] @@ -169,6 +173,7 @@ class Meta: class InterfaceSerializer(NetBoxModelSerializer, CabledObjectSerializer, ConnectedEndpointsSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:interface-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:interface-detail') device = DeviceSerializer(nested=True) vdcs = SerializedPKRelatedField( queryset=VirtualDeviceContext.objects.all(), @@ -224,11 +229,11 @@ class InterfaceSerializer(NetBoxModelSerializer, CabledObjectSerializer, Connect class Meta: model = Interface fields = [ - 'id', 'url', 'display', 'device', 'vdcs', 'module', 'name', 'label', 'type', 'enabled', 'parent', 'bridge', - 'lag', 'mtu', 'mac_address', 'speed', 'duplex', 'wwn', 'mgmt_only', 'description', 'mode', 'rf_role', - 'rf_channel', 'poe_mode', 'poe_type', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', - 'untagged_vlan', 'tagged_vlans', 'mark_connected', 'cable', 'cable_end', 'wireless_link', 'link_peers', - 'link_peers_type', 'wireless_lans', 'vrf', 'l2vpn_termination', 'connected_endpoints', + 'id', 'url', 'display_url', 'display', 'device', 'vdcs', 'module', 'name', 'label', 'type', 'enabled', + 'parent', 'bridge', 'lag', 'mtu', 'mac_address', 'speed', 'duplex', 'wwn', 'mgmt_only', 'description', + 'mode', 'rf_role', 'rf_channel', 'poe_mode', 'poe_type', 'rf_channel_frequency', 'rf_channel_width', + 'tx_power', 'untagged_vlan', 'tagged_vlans', 'mark_connected', 'cable', 'cable_end', 'wireless_link', + 'link_peers', 'link_peers_type', 'wireless_lans', 'vrf', 'l2vpn_termination', 'connected_endpoints', 'connected_endpoints_type', 'connected_endpoints_reachable', 'tags', 'custom_fields', 'created', 'last_updated', 'count_ipaddresses', 'count_fhrp_groups', '_occupied', ] @@ -251,6 +256,7 @@ def validate(self, data): class RearPortSerializer(NetBoxModelSerializer, CabledObjectSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearport-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rearport-detail') device = DeviceSerializer(nested=True) module = ModuleSerializer( nested=True, @@ -263,9 +269,9 @@ class RearPortSerializer(NetBoxModelSerializer, CabledObjectSerializer): class Meta: model = RearPort fields = [ - 'id', 'url', 'display', 'device', 'module', 'name', 'label', 'type', 'color', 'positions', 'description', - 'mark_connected', 'cable', 'cable_end', 'link_peers', 'link_peers_type', 'tags', 'custom_fields', 'created', - 'last_updated', '_occupied', + 'id', 'url', 'display_url', 'display', 'device', 'module', 'name', 'label', 'type', 'color', 'positions', + 'description', 'mark_connected', 'cable', 'cable_end', 'link_peers', 'link_peers_type', 'tags', + 'custom_fields', 'created', 'last_updated', '_occupied', ] brief_fields = ('id', 'url', 'display', 'device', 'name', 'description', 'cable', '_occupied') @@ -275,14 +281,16 @@ class FrontPortRearPortSerializer(WritableNestedSerializer): NestedRearPortSerializer but with parent device omitted (since front and rear ports must belong to same device) """ url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearport-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rearport-detail') class Meta: model = RearPort - fields = ['id', 'url', 'display', 'name', 'label', 'description'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'label', 'description'] class FrontPortSerializer(NetBoxModelSerializer, CabledObjectSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:frontport-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:frontport-detail') device = DeviceSerializer(nested=True) module = ModuleSerializer( nested=True, @@ -296,7 +304,7 @@ class FrontPortSerializer(NetBoxModelSerializer, CabledObjectSerializer): class Meta: model = FrontPort fields = [ - 'id', 'url', 'display', 'device', 'module', 'name', 'label', 'type', 'color', 'rear_port', + 'id', 'url', 'display_url', 'display', 'device', 'module', 'name', 'label', 'type', 'color', 'rear_port', 'rear_port_position', 'description', 'mark_connected', 'cable', 'cable_end', 'link_peers', 'link_peers_type', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied', ] @@ -305,6 +313,7 @@ class Meta: class ModuleBaySerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:modulebay-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:modulebay-detail') device = DeviceSerializer(nested=True) installed_module = ModuleSerializer( nested=True, @@ -316,28 +325,30 @@ class ModuleBaySerializer(NetBoxModelSerializer): class Meta: model = ModuleBay fields = [ - 'id', 'url', 'display', 'device', 'name', 'installed_module', 'label', 'position', 'description', 'tags', - 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'device', 'name', 'installed_module', 'label', 'position', + 'description', 'tags', 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'installed_module', 'name', 'description') class DeviceBaySerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicebay-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:devicebay-detail') device = DeviceSerializer(nested=True) installed_device = DeviceSerializer(nested=True, required=False, allow_null=True) class Meta: model = DeviceBay fields = [ - 'id', 'url', 'display', 'device', 'name', 'label', 'description', 'installed_device', 'tags', - 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'device', 'name', 'label', 'description', 'installed_device', + 'tags', 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'device', 'name', 'description') class InventoryItemSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitem-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:inventoryitem-detail') device = DeviceSerializer(nested=True) parent = serializers.PrimaryKeyRelatedField(queryset=InventoryItem.objects.all(), allow_null=True, default=None) role = InventoryItemRoleSerializer(nested=True, required=False, allow_null=True) @@ -353,9 +364,9 @@ class InventoryItemSerializer(NetBoxModelSerializer): class Meta: model = InventoryItem fields = [ - 'id', 'url', 'display', 'device', 'parent', 'name', 'label', 'role', 'manufacturer', 'part_id', 'serial', - 'asset_tag', 'discovered', 'description', 'component_type', 'component_id', 'component', 'tags', - 'custom_fields', 'created', 'last_updated', '_depth', + 'id', 'url', 'display_url', 'display', 'device', 'parent', 'name', 'label', 'role', 'manufacturer', + 'part_id', 'serial', 'asset_tag', 'discovered', 'description', 'component_type', 'component_id', + 'component', 'tags', 'custom_fields', 'created', 'last_updated', '_depth', ] brief_fields = ('id', 'url', 'display', 'device', 'name', 'description', '_depth') diff --git a/netbox/dcim/api/serializers_/devices.py b/netbox/dcim/api/serializers_/devices.py index edfac3072da..c3e46fbbda8 100644 --- a/netbox/dcim/api/serializers_/devices.py +++ b/netbox/dcim/api/serializers_/devices.py @@ -30,6 +30,7 @@ class DeviceSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:device-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:device-detail') device_type = DeviceTypeSerializer(nested=True) role = DeviceRoleSerializer(nested=True) tenant = TenantSerializer( @@ -78,13 +79,13 @@ class DeviceSerializer(NetBoxModelSerializer): class Meta: model = Device fields = [ - 'id', 'url', 'display', 'name', 'device_type', 'role', 'tenant', 'platform', 'serial', 'asset_tag', 'site', - 'location', 'rack', 'position', 'face', 'latitude', 'longitude', 'parent_device', 'status', 'airflow', - 'primary_ip', 'primary_ip4', 'primary_ip6', 'oob_ip', 'cluster', 'virtual_chassis', 'vc_position', - 'vc_priority', 'description', 'comments', 'config_template', 'local_context_data', 'tags', 'custom_fields', - 'created', 'last_updated', 'console_port_count', 'console_server_port_count', 'power_port_count', - 'power_outlet_count', 'interface_count', 'front_port_count', 'rear_port_count', 'device_bay_count', - 'module_bay_count', 'inventory_item_count', + 'id', 'url', 'display_url', 'display', 'name', 'device_type', 'role', 'tenant', 'platform', 'serial', + 'asset_tag', 'site', 'location', 'rack', 'position', 'face', 'latitude', 'longitude', 'parent_device', + 'status', 'airflow', 'primary_ip', 'primary_ip4', 'primary_ip6', 'oob_ip', 'cluster', 'virtual_chassis', + 'vc_position', 'vc_priority', 'description', 'comments', 'config_template', 'local_context_data', 'tags', + 'custom_fields', 'created', 'last_updated', 'console_port_count', 'console_server_port_count', + 'power_port_count', 'power_outlet_count', 'interface_count', 'front_port_count', 'rear_port_count', + 'device_bay_count', 'module_bay_count', 'inventory_item_count', ] brief_fields = ('id', 'url', 'display', 'name', 'description') @@ -105,13 +106,13 @@ class DeviceWithConfigContextSerializer(DeviceSerializer): class Meta(DeviceSerializer.Meta): fields = [ - 'id', 'url', 'display', 'name', 'device_type', 'role', 'tenant', 'platform', 'serial', 'asset_tag', 'site', - 'location', 'rack', 'position', 'face', 'latitude', 'longitude', 'parent_device', 'status', 'airflow', - 'primary_ip', 'primary_ip4', 'primary_ip6', 'oob_ip', 'cluster', 'virtual_chassis', 'vc_position', - 'vc_priority', 'description', 'comments', 'config_template', 'config_context', 'local_context_data', 'tags', - 'custom_fields', 'created', 'last_updated', 'console_port_count', 'console_server_port_count', - 'power_port_count', 'power_outlet_count', 'interface_count', 'front_port_count', 'rear_port_count', - 'device_bay_count', 'module_bay_count', 'inventory_item_count', + 'id', 'url', 'display_url', 'display', 'name', 'device_type', 'role', 'tenant', 'platform', 'serial', + 'asset_tag', 'site', 'location', 'rack', 'position', 'face', 'latitude', 'longitude', 'parent_device', + 'status', 'airflow', 'primary_ip', 'primary_ip4', 'primary_ip6', 'oob_ip', 'cluster', 'virtual_chassis', + 'vc_position', 'vc_priority', 'description', 'comments', 'config_template', 'config_context', + 'local_context_data', 'tags', 'custom_fields', 'created', 'last_updated', 'console_port_count', + 'console_server_port_count', 'power_port_count', 'power_outlet_count', 'interface_count', + 'front_port_count', 'rear_port_count', 'device_bay_count', 'module_bay_count', 'inventory_item_count', ] @extend_schema_field(serializers.JSONField(allow_null=True)) @@ -121,6 +122,7 @@ def get_config_context(self, obj): class VirtualDeviceContextSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:virtualdevicecontext-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:virtualdevicecontext-detail') device = DeviceSerializer(nested=True) identifier = serializers.IntegerField(allow_null=True, max_value=32767, min_value=0, required=False, default=None) tenant = TenantSerializer(nested=True, required=False, allow_null=True, default=None) @@ -135,15 +137,16 @@ class VirtualDeviceContextSerializer(NetBoxModelSerializer): class Meta: model = VirtualDeviceContext fields = [ - 'id', 'url', 'display', 'name', 'device', 'identifier', 'tenant', 'primary_ip', 'primary_ip4', - 'primary_ip6', 'status', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', - 'interface_count', + 'id', 'url', 'display_url', 'display', 'name', 'device', 'identifier', 'tenant', 'primary_ip', + 'primary_ip4', 'primary_ip6', 'status', 'description', 'comments', 'tags', 'custom_fields', + 'created', 'last_updated', 'interface_count', ] brief_fields = ('id', 'url', 'display', 'name', 'identifier', 'device', 'description') class ModuleSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:module-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:module-detail') device = DeviceSerializer(nested=True) module_bay = NestedModuleBaySerializer() module_type = ModuleTypeSerializer(nested=True) @@ -152,7 +155,7 @@ class ModuleSerializer(NetBoxModelSerializer): class Meta: model = Module fields = [ - 'id', 'url', 'display', 'device', 'module_bay', 'module_type', 'status', 'serial', 'asset_tag', - 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'device', 'module_bay', 'module_type', 'status', 'serial', + 'asset_tag', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'device', 'module_bay', 'module_type', 'description') diff --git a/netbox/dcim/api/serializers_/devicetype_components.py b/netbox/dcim/api/serializers_/devicetype_components.py index ca737ce38f8..72fe8862214 100644 --- a/netbox/dcim/api/serializers_/devicetype_components.py +++ b/netbox/dcim/api/serializers_/devicetype_components.py @@ -33,6 +33,7 @@ class ConsolePortTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleporttemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:consoleporttemplate-detail') device_type = DeviceTypeSerializer( nested=True, required=False, @@ -54,14 +55,15 @@ class ConsolePortTemplateSerializer(ValidatedModelSerializer): class Meta: model = ConsolePortTemplate fields = [ - 'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'description', 'created', - 'last_updated', + 'id', 'url', 'display_url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', + 'description', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') class ConsoleServerPortTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleserverporttemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:consoleserverporttemplate-detail') device_type = DeviceTypeSerializer( nested=True, required=False, @@ -83,14 +85,15 @@ class ConsoleServerPortTemplateSerializer(ValidatedModelSerializer): class Meta: model = ConsoleServerPortTemplate fields = [ - 'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'description', 'created', - 'last_updated', + 'id', 'url', 'display_url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', + 'description', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') class PowerPortTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerporttemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:powerporttemplate-detail') device_type = DeviceTypeSerializer( nested=True, required=False, @@ -113,14 +116,15 @@ class PowerPortTemplateSerializer(ValidatedModelSerializer): class Meta: model = PowerPortTemplate fields = [ - 'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'maximum_draw', - 'allocated_draw', 'description', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', + 'maximum_draw', 'allocated_draw', 'description', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') class PowerOutletTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:poweroutlettemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:poweroutlettemplate-detail') device_type = DeviceTypeSerializer( nested=True, required=False, @@ -154,14 +158,15 @@ class PowerOutletTemplateSerializer(ValidatedModelSerializer): class Meta: model = PowerOutletTemplate fields = [ - 'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'power_port', 'feed_leg', - 'description', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', + 'power_port', 'feed_leg', 'description', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') class InterfaceTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:interfacetemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:interfacetemplate-detail') device_type = DeviceTypeSerializer( nested=True, required=False, @@ -201,14 +206,15 @@ class InterfaceTemplateSerializer(ValidatedModelSerializer): class Meta: model = InterfaceTemplate fields = [ - 'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'enabled', 'mgmt_only', - 'description', 'bridge', 'poe_mode', 'poe_type', 'rf_role', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'enabled', + 'mgmt_only', 'description', 'bridge', 'poe_mode', 'poe_type', 'rf_role', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') class RearPortTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearporttemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rearporttemplate-detail') device_type = DeviceTypeSerializer( required=False, nested=True, @@ -226,14 +232,15 @@ class RearPortTemplateSerializer(ValidatedModelSerializer): class Meta: model = RearPortTemplate fields = [ - 'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'color', 'positions', - 'description', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'color', + 'positions', 'description', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') class FrontPortTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:frontporttemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:frontporttemplate-detail') device_type = DeviceTypeSerializer( nested=True, required=False, @@ -252,14 +259,15 @@ class FrontPortTemplateSerializer(ValidatedModelSerializer): class Meta: model = FrontPortTemplate fields = [ - 'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'color', 'rear_port', - 'rear_port_position', 'description', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'color', + 'rear_port', 'rear_port_position', 'description', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') class ModuleBayTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:modulebaytemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:modulebaytemplate-detail') device_type = DeviceTypeSerializer( nested=True ) @@ -267,26 +275,31 @@ class ModuleBayTemplateSerializer(ValidatedModelSerializer): class Meta: model = ModuleBayTemplate fields = [ - 'id', 'url', 'display', 'device_type', 'name', 'label', 'position', 'description', 'created', - 'last_updated', + 'id', 'url', 'display_url', 'display', 'device_type', 'name', 'label', 'position', 'description', + 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') class DeviceBayTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicebaytemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:devicebaytemplate-detail') device_type = DeviceTypeSerializer( nested=True ) class Meta: model = DeviceBayTemplate - fields = ['id', 'url', 'display', 'device_type', 'name', 'label', 'description', 'created', 'last_updated'] + fields = [ + 'id', 'url', 'display_url', 'display', 'device_type', 'name', 'label', 'description', + 'created', 'last_updated' + ] brief_fields = ('id', 'url', 'display', 'name', 'description') class InventoryItemTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitemtemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:inventoryitemtemplate-detail') device_type = DeviceTypeSerializer( nested=True ) @@ -313,8 +326,9 @@ class InventoryItemTemplateSerializer(ValidatedModelSerializer): class Meta: model = InventoryItemTemplate fields = [ - 'id', 'url', 'display', 'device_type', 'parent', 'name', 'label', 'role', 'manufacturer', 'part_id', - 'description', 'component_type', 'component_id', 'component', 'created', 'last_updated', '_depth', + 'id', 'url', 'display_url', 'display', 'device_type', 'parent', 'name', 'label', 'role', 'manufacturer', + 'part_id', 'description', 'component_type', 'component_id', 'component', 'created', 'last_updated', + '_depth', ] brief_fields = ('id', 'url', 'display', 'name', 'description', '_depth') diff --git a/netbox/dcim/api/serializers_/devicetypes.py b/netbox/dcim/api/serializers_/devicetypes.py index a5830fa90a4..1b685b3681e 100644 --- a/netbox/dcim/api/serializers_/devicetypes.py +++ b/netbox/dcim/api/serializers_/devicetypes.py @@ -18,6 +18,7 @@ class DeviceTypeSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicetype-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:devicetype-detail') manufacturer = ManufacturerSerializer(nested=True) default_platform = PlatformSerializer(nested=True, required=False, allow_null=True) u_height = serializers.DecimalField( @@ -51,26 +52,27 @@ class DeviceTypeSerializer(NetBoxModelSerializer): class Meta: model = DeviceType fields = [ - 'id', 'url', 'display', 'manufacturer', 'default_platform', 'model', 'slug', 'part_number', 'u_height', - 'exclude_from_utilization', 'is_full_depth', 'subdevice_role', 'airflow', 'weight', 'weight_unit', - 'front_image', 'rear_image', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', - 'device_count', 'console_port_template_count', 'console_server_port_template_count', - 'power_port_template_count', 'power_outlet_template_count', 'interface_template_count', - 'front_port_template_count', 'rear_port_template_count', 'device_bay_template_count', - 'module_bay_template_count', 'inventory_item_template_count', + 'id', 'url', 'display_url', 'display', 'manufacturer', 'default_platform', 'model', 'slug', 'part_number', + 'u_height', 'exclude_from_utilization', 'is_full_depth', 'subdevice_role', 'airflow', 'weight', + 'weight_unit', 'front_image', 'rear_image', 'description', 'comments', 'tags', 'custom_fields', + 'created', 'last_updated', 'device_count', 'console_port_template_count', + 'console_server_port_template_count', 'power_port_template_count', 'power_outlet_template_count', + 'interface_template_count', 'front_port_template_count', 'rear_port_template_count', + 'device_bay_template_count', 'module_bay_template_count', 'inventory_item_template_count', ] brief_fields = ('id', 'url', 'display', 'manufacturer', 'model', 'slug', 'description', 'device_count') class ModuleTypeSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:moduletype-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:moduletype-detail') manufacturer = ManufacturerSerializer(nested=True) weight_unit = ChoiceField(choices=WeightUnitChoices, allow_blank=True, required=False, allow_null=True) class Meta: model = ModuleType fields = [ - 'id', 'url', 'display', 'manufacturer', 'model', 'part_number', 'weight', 'weight_unit', 'description', - 'comments', 'tags', 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'manufacturer', 'model', 'part_number', 'weight', 'weight_unit', + 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'manufacturer', 'model', 'description') diff --git a/netbox/dcim/api/serializers_/manufacturers.py b/netbox/dcim/api/serializers_/manufacturers.py index fd50fe97d77..814c0517700 100644 --- a/netbox/dcim/api/serializers_/manufacturers.py +++ b/netbox/dcim/api/serializers_/manufacturers.py @@ -11,6 +11,7 @@ class ManufacturerSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:manufacturer-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:manufacturer-detail') # Related object counts devicetype_count = RelatedObjectCountField('device_types') @@ -20,7 +21,7 @@ class ManufacturerSerializer(NetBoxModelSerializer): class Meta: model = Manufacturer fields = [ - 'id', 'url', 'display', 'name', 'slug', 'description', 'tags', 'custom_fields', 'created', 'last_updated', - 'devicetype_count', 'inventoryitem_count', 'platform_count', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'description', 'tags', 'custom_fields', + 'created', 'last_updated', 'devicetype_count', 'inventoryitem_count', 'platform_count', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'devicetype_count') diff --git a/netbox/dcim/api/serializers_/platforms.py b/netbox/dcim/api/serializers_/platforms.py index 7365404eb4b..3de1e88f735 100644 --- a/netbox/dcim/api/serializers_/platforms.py +++ b/netbox/dcim/api/serializers_/platforms.py @@ -13,6 +13,7 @@ class PlatformSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:platform-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:platform-detail') manufacturer = ManufacturerSerializer(nested=True, required=False, allow_null=True) config_template = ConfigTemplateSerializer(nested=True, required=False, allow_null=True, default=None) @@ -23,7 +24,7 @@ class PlatformSerializer(NetBoxModelSerializer): class Meta: model = Platform fields = [ - 'id', 'url', 'display', 'name', 'slug', 'manufacturer', 'config_template', 'description', 'tags', - 'custom_fields', 'created', 'last_updated', 'device_count', 'virtualmachine_count', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'manufacturer', 'config_template', 'description', + 'tags', 'custom_fields', 'created', 'last_updated', 'device_count', 'virtualmachine_count', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'device_count', 'virtualmachine_count') diff --git a/netbox/dcim/api/serializers_/power.py b/netbox/dcim/api/serializers_/power.py index dddd54906e4..a83dda0e4b7 100644 --- a/netbox/dcim/api/serializers_/power.py +++ b/netbox/dcim/api/serializers_/power.py @@ -18,6 +18,7 @@ class PowerPanelSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerpanel-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:powerpanel-detail') site = SiteSerializer(nested=True) location = LocationSerializer( nested=True, @@ -32,14 +33,15 @@ class PowerPanelSerializer(NetBoxModelSerializer): class Meta: model = PowerPanel fields = [ - 'id', 'url', 'display', 'site', 'location', 'name', 'description', 'comments', 'tags', 'custom_fields', - 'powerfeed_count', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'site', 'location', 'name', 'description', 'comments', 'tags', + 'custom_fields', 'powerfeed_count', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description', 'powerfeed_count') class PowerFeedSerializer(NetBoxModelSerializer, CabledObjectSerializer, ConnectedEndpointsSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerfeed-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:powerfeed-detail') power_panel = PowerPanelSerializer(nested=True) rack = RackSerializer( nested=True, @@ -72,9 +74,9 @@ class PowerFeedSerializer(NetBoxModelSerializer, CabledObjectSerializer, Connect class Meta: model = PowerFeed fields = [ - 'id', 'url', 'display', 'power_panel', 'rack', 'name', 'status', 'type', 'supply', 'phase', 'voltage', - 'amperage', 'max_utilization', 'mark_connected', 'cable', 'cable_end', 'link_peers', 'link_peers_type', - 'connected_endpoints', 'connected_endpoints_type', 'connected_endpoints_reachable', 'description', - 'tenant', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied', + 'id', 'url', 'display_url', 'display', 'power_panel', 'rack', 'name', 'status', 'type', 'supply', + 'phase', 'voltage', 'amperage', 'max_utilization', 'mark_connected', 'cable', 'cable_end', 'link_peers', + 'link_peers_type', 'connected_endpoints', 'connected_endpoints_type', 'connected_endpoints_reachable', + 'description', 'tenant', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied', ] brief_fields = ('id', 'url', 'display', 'name', 'description', 'cable', '_occupied') diff --git a/netbox/dcim/api/serializers_/racks.py b/netbox/dcim/api/serializers_/racks.py index a6754cba004..2483208d175 100644 --- a/netbox/dcim/api/serializers_/racks.py +++ b/netbox/dcim/api/serializers_/racks.py @@ -21,6 +21,7 @@ class RackRoleSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackrole-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rackrole-detail') # Related object counts rack_count = RelatedObjectCountField('racks') @@ -28,14 +29,15 @@ class RackRoleSerializer(NetBoxModelSerializer): class Meta: model = RackRole fields = [ - 'id', 'url', 'display', 'name', 'slug', 'color', 'description', 'tags', 'custom_fields', 'created', - 'last_updated', 'rack_count', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'color', 'description', 'tags', 'custom_fields', + 'created', 'last_updated', 'rack_count', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'rack_count') class RackSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rack-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rack-detail') site = SiteSerializer(nested=True) location = LocationSerializer(nested=True, required=False, allow_null=True, default=None) tenant = TenantSerializer(nested=True, required=False, allow_null=True) @@ -55,16 +57,17 @@ class RackSerializer(NetBoxModelSerializer): class Meta: model = Rack fields = [ - 'id', 'url', 'display', 'name', 'facility_id', 'site', 'location', 'tenant', 'status', 'role', 'serial', - 'asset_tag', 'type', 'width', 'u_height', 'starting_unit', 'weight', 'max_weight', 'weight_unit', - 'desc_units', 'outer_width', 'outer_depth', 'outer_unit', 'mounting_depth', 'description', 'comments', - 'tags', 'custom_fields', 'created', 'last_updated', 'device_count', 'powerfeed_count', + 'id', 'url', 'display_url', 'display', 'name', 'facility_id', 'site', 'location', 'tenant', 'status', + 'role', 'serial', 'asset_tag', 'type', 'width', 'u_height', 'starting_unit', 'weight', 'max_weight', + 'weight_unit', 'desc_units', 'outer_width', 'outer_depth', 'outer_unit', 'mounting_depth', 'description', + 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'device_count', 'powerfeed_count', ] brief_fields = ('id', 'url', 'display', 'name', 'description', 'device_count') class RackReservationSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackreservation-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rackreservation-detail') rack = RackSerializer(nested=True) user = UserSerializer(nested=True) tenant = TenantSerializer(nested=True, required=False, allow_null=True) @@ -72,8 +75,8 @@ class RackReservationSerializer(NetBoxModelSerializer): class Meta: model = RackReservation fields = [ - 'id', 'url', 'display', 'rack', 'units', 'created', 'last_updated', 'user', 'tenant', 'description', - 'comments', 'tags', 'custom_fields', + 'id', 'url', 'display_url', 'display', 'rack', 'units', 'created', 'last_updated', 'user', 'tenant', + 'description', 'comments', 'tags', 'custom_fields', ] brief_fields = ('id', 'url', 'display', 'user', 'description', 'units') diff --git a/netbox/dcim/api/serializers_/roles.py b/netbox/dcim/api/serializers_/roles.py index 41f8f377d83..fbb2799a60e 100644 --- a/netbox/dcim/api/serializers_/roles.py +++ b/netbox/dcim/api/serializers_/roles.py @@ -13,6 +13,7 @@ class DeviceRoleSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicerole-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:devicerole-detail') config_template = ConfigTemplateSerializer(nested=True, required=False, allow_null=True, default=None) # Related object counts @@ -22,14 +23,15 @@ class DeviceRoleSerializer(NetBoxModelSerializer): class Meta: model = DeviceRole fields = [ - 'id', 'url', 'display', 'name', 'slug', 'color', 'vm_role', 'config_template', 'description', 'tags', - 'custom_fields', 'created', 'last_updated', 'device_count', 'virtualmachine_count', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'color', 'vm_role', 'config_template', + 'description', 'tags', 'custom_fields', 'created', 'last_updated', 'device_count', 'virtualmachine_count', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'device_count', 'virtualmachine_count') class InventoryItemRoleSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitemrole-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:inventoryitemrole-detail') # Related object counts inventoryitem_count = RelatedObjectCountField('inventory_items') @@ -37,7 +39,7 @@ class InventoryItemRoleSerializer(NetBoxModelSerializer): class Meta: model = InventoryItemRole fields = [ - 'id', 'url', 'display', 'name', 'slug', 'color', 'description', 'tags', 'custom_fields', 'created', - 'last_updated', 'inventoryitem_count', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'color', 'description', 'tags', 'custom_fields', + 'created', 'last_updated', 'inventoryitem_count', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'inventoryitem_count') diff --git a/netbox/dcim/api/serializers_/sites.py b/netbox/dcim/api/serializers_/sites.py index 60e1477e571..4e23b1a097a 100644 --- a/netbox/dcim/api/serializers_/sites.py +++ b/netbox/dcim/api/serializers_/sites.py @@ -20,34 +20,37 @@ class RegionSerializer(NestedGroupModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:region-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:region-detail') parent = NestedRegionSerializer(required=False, allow_null=True, default=None) site_count = serializers.IntegerField(read_only=True, default=0) class Meta: model = Region fields = [ - 'id', 'url', 'display', 'name', 'slug', 'parent', 'description', 'tags', 'custom_fields', 'created', - 'last_updated', 'site_count', '_depth', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'parent', 'description', 'tags', 'custom_fields', + 'created', 'last_updated', 'site_count', '_depth', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'site_count', '_depth') class SiteGroupSerializer(NestedGroupModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:sitegroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:sitegroup-detail') parent = NestedSiteGroupSerializer(required=False, allow_null=True, default=None) site_count = serializers.IntegerField(read_only=True, default=0) class Meta: model = SiteGroup fields = [ - 'id', 'url', 'display', 'name', 'slug', 'parent', 'description', 'tags', 'custom_fields', 'created', - 'last_updated', 'site_count', '_depth', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'parent', 'description', 'tags', 'custom_fields', + 'created', 'last_updated', 'site_count', '_depth', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'site_count', '_depth') class SiteSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:site-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:site-detail') status = ChoiceField(choices=SiteStatusChoices, required=False) region = RegionSerializer(nested=True, required=False, allow_null=True) group = SiteGroupSerializer(nested=True, required=False, allow_null=True) @@ -72,16 +75,17 @@ class SiteSerializer(NetBoxModelSerializer): class Meta: model = Site fields = [ - 'id', 'url', 'display', 'name', 'slug', 'status', 'region', 'group', 'tenant', 'facility', 'time_zone', - 'description', 'physical_address', 'shipping_address', 'latitude', 'longitude', 'comments', 'asns', 'tags', - 'custom_fields', 'created', 'last_updated', 'circuit_count', 'device_count', 'prefix_count', 'rack_count', - 'virtualmachine_count', 'vlan_count', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'status', 'region', 'group', 'tenant', 'facility', + 'time_zone', 'description', 'physical_address', 'shipping_address', 'latitude', 'longitude', + 'comments', 'asns', 'tags', 'custom_fields', 'created', 'last_updated', 'circuit_count', 'device_count', + 'prefix_count', 'rack_count', 'virtualmachine_count', 'vlan_count', ] brief_fields = ('id', 'url', 'display', 'name', 'description', 'slug') class LocationSerializer(NestedGroupModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:location-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:location-detail') site = SiteSerializer(nested=True) parent = NestedLocationSerializer(required=False, allow_null=True, default=None) status = ChoiceField(choices=LocationStatusChoices, required=False) @@ -92,7 +96,7 @@ class LocationSerializer(NestedGroupModelSerializer): class Meta: model = Location fields = [ - 'id', 'url', 'display', 'name', 'slug', 'site', 'parent', 'status', 'tenant', 'facility', 'description', - 'tags', 'custom_fields', 'created', 'last_updated', 'rack_count', 'device_count', '_depth', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'site', 'parent', 'status', 'tenant', 'facility', + 'description', 'tags', 'custom_fields', 'created', 'last_updated', 'rack_count', 'device_count', '_depth', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'rack_count', '_depth') diff --git a/netbox/dcim/api/serializers_/virtualchassis.py b/netbox/dcim/api/serializers_/virtualchassis.py index 5a5917119cf..a033bc0abf8 100644 --- a/netbox/dcim/api/serializers_/virtualchassis.py +++ b/netbox/dcim/api/serializers_/virtualchassis.py @@ -11,6 +11,7 @@ class VirtualChassisSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:virtualchassis-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:virtualchassis-detail') master = NestedDeviceSerializer(required=False, allow_null=True, default=None) members = NestedDeviceSerializer(many=True, read_only=True) @@ -20,7 +21,7 @@ class VirtualChassisSerializer(NetBoxModelSerializer): class Meta: model = VirtualChassis fields = [ - 'id', 'url', 'display', 'name', 'domain', 'master', 'description', 'comments', 'tags', 'custom_fields', - 'created', 'last_updated', 'member_count', 'members', + 'id', 'url', 'display_url', 'display', 'name', 'domain', 'master', 'description', 'comments', 'tags', + 'custom_fields', 'created', 'last_updated', 'member_count', 'members', ] brief_fields = ('id', 'url', 'display', 'name', 'master', 'description', 'member_count') diff --git a/netbox/extras/api/nested_serializers.py b/netbox/extras/api/nested_serializers.py index 4bada494f8b..17901c73cd9 100644 --- a/netbox/extras/api/nested_serializers.py +++ b/netbox/extras/api/nested_serializers.py @@ -23,98 +23,110 @@ class NestedEventRuleSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:eventrule-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:eventrule-detail') class Meta: model = models.EventRule - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedWebhookSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:webhook-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:webhook-detail') class Meta: model = models.Webhook - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedCustomFieldSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:customfield-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:customfield-detail') class Meta: model = models.CustomField - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedCustomFieldChoiceSetSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:customfieldchoiceset-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:customfieldchoiceset-detail') class Meta: model = models.CustomFieldChoiceSet - fields = ['id', 'url', 'display', 'name', 'choices_count'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'choices_count'] class NestedCustomLinkSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:customlink-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:customlink-detail') class Meta: model = models.CustomLink - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedConfigContextSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:configcontext-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:configcontext-detail') class Meta: model = models.ConfigContext - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedConfigTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:configtemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:configtemplate-detail') class Meta: model = models.ConfigTemplate - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedExportTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:exporttemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:exporttemplate-detail') class Meta: model = models.ExportTemplate - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedSavedFilterSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:savedfilter-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:savedfilter-detail') class Meta: model = models.SavedFilter - fields = ['id', 'url', 'display', 'name', 'slug'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug'] class NestedBookmarkSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:bookmark-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:bookmark-detail') class Meta: model = models.Bookmark - fields = ['id', 'url', 'display', 'object_id', 'object_type'] + fields = ['id', 'url', 'display_url', 'display', 'object_id', 'object_type'] class NestedImageAttachmentSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:imageattachment-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:imageattachment-detail') class Meta: model = models.ImageAttachment - fields = ['id', 'url', 'display', 'name', 'image'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'image'] class NestedJournalEntrySerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:journalentry-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:journalentry-detail') class Meta: model = models.JournalEntry - fields = ['id', 'url', 'display', 'created'] + fields = ['id', 'url', 'display_url', 'display', 'created'] class NestedScriptSerializer(WritableNestedSerializer): @@ -123,12 +135,17 @@ class NestedScriptSerializer(WritableNestedSerializer): lookup_field='full_name', lookup_url_kwarg='pk' ) + display_url = serializers.HyperlinkedIdentityField( + view_name='extras:script-detail', + lookup_field='full_name', + lookup_url_kwarg='pk' + ) name = serializers.CharField(read_only=True) display = serializers.SerializerMethodField(read_only=True) class Meta: model = models.Script - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] def get_display(self, obj): return f'{obj.name} ({obj.module})' diff --git a/netbox/extras/api/serializers_/attachments.py b/netbox/extras/api/serializers_/attachments.py index bcf3a24ecbf..adb8d6f1ed6 100644 --- a/netbox/extras/api/serializers_/attachments.py +++ b/netbox/extras/api/serializers_/attachments.py @@ -15,6 +15,7 @@ class ImageAttachmentSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:imageattachment-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:imageattachment-detail') object_type = ContentTypeField( queryset=ObjectType.objects.all() ) @@ -23,8 +24,8 @@ class ImageAttachmentSerializer(ValidatedModelSerializer): class Meta: model = ImageAttachment fields = [ - 'id', 'url', 'display', 'object_type', 'object_id', 'parent', 'name', 'image', 'image_height', - 'image_width', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'object_type', 'object_id', 'parent', 'name', 'image', + 'image_height', 'image_width', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'image') diff --git a/netbox/extras/api/serializers_/bookmarks.py b/netbox/extras/api/serializers_/bookmarks.py index 7a2d4d6aa72..0b85a68cd33 100644 --- a/netbox/extras/api/serializers_/bookmarks.py +++ b/netbox/extras/api/serializers_/bookmarks.py @@ -15,6 +15,7 @@ class BookmarkSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:bookmark-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:bookmark-detail') object_type = ContentTypeField( queryset=ObjectType.objects.with_feature('bookmarks'), ) @@ -24,7 +25,7 @@ class BookmarkSerializer(ValidatedModelSerializer): class Meta: model = Bookmark fields = [ - 'id', 'url', 'display', 'object_type', 'object_id', 'object', 'user', 'created', + 'id', 'url', 'display_url', 'display', 'object_type', 'object_id', 'object', 'user', 'created', ] brief_fields = ('id', 'url', 'display', 'object_id', 'object_type') diff --git a/netbox/extras/api/serializers_/change_logging.py b/netbox/extras/api/serializers_/change_logging.py index 46fb901fffd..e312a866ae7 100644 --- a/netbox/extras/api/serializers_/change_logging.py +++ b/netbox/extras/api/serializers_/change_logging.py @@ -16,6 +16,7 @@ class ObjectChangeSerializer(BaseModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:objectchange-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:objectchange-detail') user = UserSerializer( nested=True, read_only=True @@ -44,8 +45,8 @@ class ObjectChangeSerializer(BaseModelSerializer): class Meta: model = ObjectChange fields = [ - 'id', 'url', 'display', 'time', 'user', 'user_name', 'request_id', 'action', 'changed_object_type', - 'changed_object_id', 'changed_object', 'prechange_data', 'postchange_data', + 'id', 'url', 'display_url', 'display', 'time', 'user', 'user_name', 'request_id', 'action', + 'changed_object_type', 'changed_object_id', 'changed_object', 'prechange_data', 'postchange_data', ] @extend_schema_field(serializers.JSONField(allow_null=True)) diff --git a/netbox/extras/api/serializers_/configcontexts.py b/netbox/extras/api/serializers_/configcontexts.py index e9688f25494..7473301406b 100644 --- a/netbox/extras/api/serializers_/configcontexts.py +++ b/netbox/extras/api/serializers_/configcontexts.py @@ -21,6 +21,7 @@ class ConfigContextSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:configcontext-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:configcontext-detail') regions = SerializedPKRelatedField( queryset=Region.objects.all(), serializer=RegionSerializer, @@ -123,9 +124,9 @@ class ConfigContextSerializer(ValidatedModelSerializer): class Meta: model = ConfigContext fields = [ - 'id', 'url', 'display', 'name', 'weight', 'description', 'is_active', 'regions', 'site_groups', 'sites', - 'locations', 'device_types', 'roles', 'platforms', 'cluster_types', 'cluster_groups', 'clusters', - 'tenant_groups', 'tenants', 'tags', 'data_source', 'data_path', 'data_file', 'data_synced', 'data', - 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'name', 'weight', 'description', 'is_active', 'regions', + 'site_groups', 'sites', 'locations', 'device_types', 'roles', 'platforms', 'cluster_types', + 'cluster_groups', 'clusters', 'tenant_groups', 'tenants', 'tags', 'data_source', 'data_path', + 'data_file', 'data_synced', 'data', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') diff --git a/netbox/extras/api/serializers_/configtemplates.py b/netbox/extras/api/serializers_/configtemplates.py index 935214478ed..fd8ef8c0280 100644 --- a/netbox/extras/api/serializers_/configtemplates.py +++ b/netbox/extras/api/serializers_/configtemplates.py @@ -12,6 +12,7 @@ class ConfigTemplateSerializer(TaggableModelSerializer, ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:configtemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:configtemplate-detail') data_source = DataSourceSerializer( nested=True, required=False @@ -24,7 +25,7 @@ class ConfigTemplateSerializer(TaggableModelSerializer, ValidatedModelSerializer class Meta: model = ConfigTemplate fields = [ - 'id', 'url', 'display', 'name', 'description', 'environment_params', 'template_code', 'data_source', - 'data_path', 'data_file', 'data_synced', 'tags', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'name', 'description', 'environment_params', 'template_code', + 'data_source', 'data_path', 'data_file', 'data_synced', 'tags', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') diff --git a/netbox/extras/api/serializers_/customfields.py b/netbox/extras/api/serializers_/customfields.py index 082047e94a4..a765faf4be9 100644 --- a/netbox/extras/api/serializers_/customfields.py +++ b/netbox/extras/api/serializers_/customfields.py @@ -17,6 +17,7 @@ class CustomFieldChoiceSetSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:customfieldchoiceset-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:customfieldchoiceset-detail') base_choices = ChoiceField( choices=CustomFieldChoiceSetBaseChoices, required=False @@ -31,14 +32,15 @@ class CustomFieldChoiceSetSerializer(ValidatedModelSerializer): class Meta: model = CustomFieldChoiceSet fields = [ - 'id', 'url', 'display', 'name', 'description', 'base_choices', 'extra_choices', 'order_alphabetically', - 'choices_count', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'name', 'description', 'base_choices', 'extra_choices', + 'order_alphabetically', 'choices_count', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description', 'choices_count') class CustomFieldSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:customfield-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:customfield-detail') object_types = ContentTypeField( queryset=ObjectType.objects.with_feature('custom_fields'), many=True @@ -62,10 +64,10 @@ class CustomFieldSerializer(ValidatedModelSerializer): class Meta: model = CustomField fields = [ - 'id', 'url', 'display', 'object_types', 'type', 'related_object_type', 'data_type', 'name', 'label', - 'group_name', 'description', 'required', 'search_weight', 'filter_logic', 'ui_visible', 'ui_editable', - 'is_cloneable', 'default', 'weight', 'validation_minimum', 'validation_maximum', 'validation_regex', - 'choice_set', 'comments', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'object_types', 'type', 'related_object_type', 'data_type', + 'name', 'label', 'group_name', 'description', 'required', 'search_weight', 'filter_logic', 'ui_visible', + 'ui_editable', 'is_cloneable', 'default', 'weight', 'validation_minimum', 'validation_maximum', + 'validation_regex', 'choice_set', 'comments', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') diff --git a/netbox/extras/api/serializers_/customlinks.py b/netbox/extras/api/serializers_/customlinks.py index 8635ea2a08b..9ee321f6570 100644 --- a/netbox/extras/api/serializers_/customlinks.py +++ b/netbox/extras/api/serializers_/customlinks.py @@ -12,6 +12,7 @@ class CustomLinkSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:customlink-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:customlink-detail') object_types = ContentTypeField( queryset=ObjectType.objects.with_feature('custom_links'), many=True @@ -20,7 +21,7 @@ class CustomLinkSerializer(ValidatedModelSerializer): class Meta: model = CustomLink fields = [ - 'id', 'url', 'display', 'object_types', 'name', 'enabled', 'link_text', 'link_url', 'weight', 'group_name', - 'button_class', 'new_window', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'object_types', 'name', 'enabled', 'link_text', 'link_url', + 'weight', 'group_name', 'button_class', 'new_window', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name') diff --git a/netbox/extras/api/serializers_/events.py b/netbox/extras/api/serializers_/events.py index 469da3e8ca5..7fd2cf3e148 100644 --- a/netbox/extras/api/serializers_/events.py +++ b/netbox/extras/api/serializers_/events.py @@ -22,6 +22,7 @@ class EventRuleSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:eventrule-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:eventrule-detail') object_types = ContentTypeField( queryset=ObjectType.objects.with_feature('event_rules'), many=True @@ -35,7 +36,7 @@ class EventRuleSerializer(NetBoxModelSerializer): class Meta: model = EventRule fields = [ - 'id', 'url', 'display', 'object_types', 'name', 'type_create', 'type_update', 'type_delete', + 'id', 'url', 'display_url', 'display', 'object_types', 'name', 'type_create', 'type_update', 'type_delete', 'type_job_start', 'type_job_end', 'enabled', 'conditions', 'action_type', 'action_object_type', 'action_object_id', 'action_object', 'description', 'custom_fields', 'tags', 'created', 'last_updated', ] @@ -59,12 +60,13 @@ def get_action_object(self, instance): class WebhookSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:webhook-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:webhook-detail') class Meta: model = Webhook fields = [ - 'id', 'url', 'display', 'name', 'description', 'payload_url', 'http_method', 'http_content_type', - 'additional_headers', 'body_template', 'secret', 'ssl_verification', 'ca_file_path', 'custom_fields', - 'tags', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'name', 'description', 'payload_url', 'http_method', + 'http_content_type', 'additional_headers', 'body_template', 'secret', 'ssl_verification', 'ca_file_path', + 'custom_fields', 'tags', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') diff --git a/netbox/extras/api/serializers_/exporttemplates.py b/netbox/extras/api/serializers_/exporttemplates.py index 43cc061a727..e5b7b47374b 100644 --- a/netbox/extras/api/serializers_/exporttemplates.py +++ b/netbox/extras/api/serializers_/exporttemplates.py @@ -13,6 +13,7 @@ class ExportTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:exporttemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:exporttemplate-detail') object_types = ContentTypeField( queryset=ObjectType.objects.with_feature('export_templates'), many=True @@ -29,7 +30,7 @@ class ExportTemplateSerializer(ValidatedModelSerializer): class Meta: model = ExportTemplate fields = [ - 'id', 'url', 'display', 'object_types', 'name', 'description', 'template_code', 'mime_type', + 'id', 'url', 'display_url', 'display', 'object_types', 'name', 'description', 'template_code', 'mime_type', 'file_extension', 'as_attachment', 'data_source', 'data_path', 'data_file', 'data_synced', 'created', 'last_updated', ] diff --git a/netbox/extras/api/serializers_/journaling.py b/netbox/extras/api/serializers_/journaling.py index 1a44e7e2e74..2a31dccc334 100644 --- a/netbox/extras/api/serializers_/journaling.py +++ b/netbox/extras/api/serializers_/journaling.py @@ -17,6 +17,7 @@ class JournalEntrySerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:journalentry-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:journalentry-detail') assigned_object_type = ContentTypeField( queryset=ObjectType.objects.all() ) @@ -35,8 +36,8 @@ class JournalEntrySerializer(NetBoxModelSerializer): class Meta: model = JournalEntry fields = [ - 'id', 'url', 'display', 'assigned_object_type', 'assigned_object_id', 'assigned_object', 'created', - 'created_by', 'kind', 'comments', 'tags', 'custom_fields', 'last_updated', + 'id', 'url', 'display_url', 'display', 'assigned_object_type', 'assigned_object_id', 'assigned_object', + 'created', 'created_by', 'kind', 'comments', 'tags', 'custom_fields', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'created') diff --git a/netbox/extras/api/serializers_/objecttypes.py b/netbox/extras/api/serializers_/objecttypes.py index 8e480665234..7587901cd64 100644 --- a/netbox/extras/api/serializers_/objecttypes.py +++ b/netbox/extras/api/serializers_/objecttypes.py @@ -10,7 +10,8 @@ class ObjectTypeSerializer(BaseModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:objecttype-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:objecttype-detail') class Meta: model = ObjectType - fields = ['id', 'url', 'display', 'app_label', 'model'] + fields = ['id', 'url', 'display_url', 'display', 'app_label', 'model'] diff --git a/netbox/extras/api/serializers_/savedfilters.py b/netbox/extras/api/serializers_/savedfilters.py index 9e26f0c3059..7358a76d6b0 100644 --- a/netbox/extras/api/serializers_/savedfilters.py +++ b/netbox/extras/api/serializers_/savedfilters.py @@ -12,6 +12,7 @@ class SavedFilterSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:savedfilter-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:savedfilter-detail') object_types = ContentTypeField( queryset=ObjectType.objects.all(), many=True @@ -20,7 +21,7 @@ class SavedFilterSerializer(ValidatedModelSerializer): class Meta: model = SavedFilter fields = [ - 'id', 'url', 'display', 'object_types', 'name', 'slug', 'description', 'user', 'weight', 'enabled', - 'shared', 'parameters', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'object_types', 'name', 'slug', 'description', 'user', 'weight', + 'enabled', 'shared', 'parameters', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description') diff --git a/netbox/extras/api/serializers_/scripts.py b/netbox/extras/api/serializers_/scripts.py index b2a8ef29d64..f5f9947b3bc 100644 --- a/netbox/extras/api/serializers_/scripts.py +++ b/netbox/extras/api/serializers_/scripts.py @@ -15,6 +15,7 @@ class ScriptSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:script-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:script-detail') description = serializers.SerializerMethodField(read_only=True) vars = serializers.SerializerMethodField(read_only=True) result = JobSerializer(nested=True, read_only=True) @@ -22,7 +23,7 @@ class ScriptSerializer(ValidatedModelSerializer): class Meta: model = Script fields = [ - 'id', 'url', 'module', 'name', 'description', 'vars', 'result', 'display', 'is_executable', + 'id', 'url', 'display_url', 'module', 'name', 'description', 'vars', 'result', 'display', 'is_executable', ] brief_fields = ('id', 'url', 'display', 'name', 'description') diff --git a/netbox/extras/api/serializers_/tags.py b/netbox/extras/api/serializers_/tags.py index 9d91ba5e1e3..21a02f7fa3d 100644 --- a/netbox/extras/api/serializers_/tags.py +++ b/netbox/extras/api/serializers_/tags.py @@ -12,6 +12,7 @@ class TagSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:tag-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:tag-detail') object_types = ContentTypeField( queryset=ObjectType.objects.with_feature('tags'), many=True, @@ -24,7 +25,7 @@ class TagSerializer(ValidatedModelSerializer): class Meta: model = Tag fields = [ - 'id', 'url', 'display', 'name', 'slug', 'color', 'description', 'object_types', 'tagged_items', 'created', - 'last_updated', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'color', 'description', 'object_types', + 'tagged_items', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'color', 'description') diff --git a/netbox/ipam/api/nested_serializers.py b/netbox/ipam/api/nested_serializers.py index 4d4a77bef90..d3526e439fc 100644 --- a/netbox/ipam/api/nested_serializers.py +++ b/netbox/ipam/api/nested_serializers.py @@ -32,10 +32,11 @@ class NestedASNRangeSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:asnrange-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:asnrange-detail') class Meta: model = models.ASNRange - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] # @@ -44,10 +45,11 @@ class Meta: class NestedASNSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:asn-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:asn-detail') class Meta: model = models.ASN - fields = ['id', 'url', 'display', 'asn'] + fields = ['id', 'url', 'display_url', 'display', 'asn'] # @@ -59,11 +61,12 @@ class Meta: ) class NestedVRFSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vrf-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:vrf-detail') prefix_count = RelatedObjectCountField('prefixes') class Meta: model = models.VRF - fields = ['id', 'url', 'display', 'name', 'rd', 'prefix_count'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'rd', 'prefix_count'] # @@ -72,10 +75,11 @@ class Meta: class NestedRouteTargetSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:routetarget-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:routetarget-detail') class Meta: model = models.RouteTarget - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] # @@ -87,20 +91,22 @@ class Meta: ) class NestedRIRSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:rir-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:rir-detail') aggregate_count = RelatedObjectCountField('aggregates') class Meta: model = models.RIR - fields = ['id', 'url', 'display', 'name', 'slug', 'aggregate_count'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'aggregate_count'] class NestedAggregateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:aggregate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:aggregate-detail') family = serializers.IntegerField(read_only=True) class Meta: model = models.Aggregate - fields = ['id', 'url', 'display', 'family', 'prefix'] + fields = ['id', 'url', 'display_url', 'display', 'family', 'prefix'] # @@ -109,19 +115,21 @@ class Meta: class NestedFHRPGroupSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:fhrpgroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:fhrpgroup-detail') class Meta: model = models.FHRPGroup - fields = ['id', 'url', 'display', 'protocol', 'group_id'] + fields = ['id', 'url', 'display_url', 'display', 'protocol', 'group_id'] class NestedFHRPGroupAssignmentSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:fhrpgroupassignment-detail') + url = serializers.HyperlinkedIdentityField(view_name='ipam-api:fhrpgroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:fhrpgroup-detail') group = NestedFHRPGroupSerializer() class Meta: model = models.FHRPGroupAssignment - fields = ['id', 'url', 'display', 'group', 'interface_type', 'interface_id', 'priority'] + fields = ['id', 'url', 'display_url', 'display', 'group', 'interface_type', 'interface_id', 'priority'] # @@ -133,12 +141,13 @@ class Meta: ) class NestedRoleSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:role-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:role-detail') prefix_count = RelatedObjectCountField('prefixes') vlan_count = RelatedObjectCountField('vlans') class Meta: model = models.Role - fields = ['id', 'url', 'display', 'name', 'slug', 'prefix_count', 'vlan_count'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'prefix_count', 'vlan_count'] @extend_schema_serializer( @@ -146,19 +155,21 @@ class Meta: ) class NestedVLANGroupSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vlangroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:vlangroup-detail') vlan_count = RelatedObjectCountField('vlans') class Meta: model = models.VLANGroup - fields = ['id', 'url', 'display', 'name', 'slug', 'vlan_count'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'vlan_count'] class NestedVLANSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vlan-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:vlan-detail') class Meta: model = models.VLAN - fields = ['id', 'url', 'display', 'vid', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'vid', 'name'] # @@ -167,12 +178,13 @@ class Meta: class NestedPrefixSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:prefix-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:prefix-detail') family = serializers.IntegerField(read_only=True) _depth = serializers.IntegerField(read_only=True) class Meta: model = models.Prefix - fields = ['id', 'url', 'display', 'family', 'prefix', '_depth'] + fields = ['id', 'url', 'display_url', 'display', 'family', 'prefix', '_depth'] # @@ -181,13 +193,14 @@ class Meta: class NestedIPRangeSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:iprange-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:iprange-detail') family = serializers.IntegerField(read_only=True) start_address = IPAddressField() end_address = IPAddressField() class Meta: model = models.IPRange - fields = ['id', 'url', 'display', 'family', 'start_address', 'end_address'] + fields = ['id', 'url', 'display_url', 'display', 'family', 'start_address', 'end_address'] # @@ -196,12 +209,13 @@ class Meta: class NestedIPAddressSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:ipaddress-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:ipaddress-detail') family = serializers.IntegerField(read_only=True) address = IPAddressField() class Meta: model = models.IPAddress - fields = ['id', 'url', 'display', 'family', 'address'] + fields = ['id', 'url', 'display_url', 'display', 'family', 'address'] # @@ -210,15 +224,17 @@ class Meta: class NestedServiceTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:servicetemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:servicetemplate-detail') class Meta: model = models.ServiceTemplate - fields = ['id', 'url', 'display', 'name', 'protocol', 'ports'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'protocol', 'ports'] class NestedServiceSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:service-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:service-detail') class Meta: model = models.Service - fields = ['id', 'url', 'display', 'name', 'protocol', 'ports'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'protocol', 'ports'] diff --git a/netbox/ipam/api/serializers_/asns.py b/netbox/ipam/api/serializers_/asns.py index 9a8ab5b00f2..615b93bf83b 100644 --- a/netbox/ipam/api/serializers_/asns.py +++ b/netbox/ipam/api/serializers_/asns.py @@ -15,6 +15,7 @@ class RIRSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:rir-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:rir-detail') # Related object counts aggregate_count = RelatedObjectCountField('aggregates') @@ -22,14 +23,15 @@ class RIRSerializer(NetBoxModelSerializer): class Meta: model = RIR fields = [ - 'id', 'url', 'display', 'name', 'slug', 'is_private', 'description', 'tags', 'custom_fields', 'created', - 'last_updated', 'aggregate_count', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'is_private', 'description', 'tags', + 'custom_fields', 'created', 'last_updated', 'aggregate_count', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'aggregate_count') class ASNRangeSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:asnrange-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:asnrange-detail') rir = RIRSerializer(nested=True) tenant = TenantSerializer(nested=True, required=False, allow_null=True) asn_count = serializers.IntegerField(read_only=True) @@ -37,14 +39,15 @@ class ASNRangeSerializer(NetBoxModelSerializer): class Meta: model = ASNRange fields = [ - 'id', 'url', 'display', 'name', 'slug', 'rir', 'start', 'end', 'tenant', 'description', 'tags', - 'custom_fields', 'created', 'last_updated', 'asn_count', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'rir', 'start', 'end', 'tenant', 'description', + 'tags', 'custom_fields', 'created', 'last_updated', 'asn_count', ] brief_fields = ('id', 'url', 'display', 'name', 'description') class ASNSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:asn-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:asn-detail') rir = RIRSerializer(nested=True, required=False, allow_null=True) tenant = TenantSerializer(nested=True, required=False, allow_null=True) @@ -55,8 +58,8 @@ class ASNSerializer(NetBoxModelSerializer): class Meta: model = ASN fields = [ - 'id', 'url', 'display', 'asn', 'rir', 'tenant', 'description', 'comments', 'tags', 'custom_fields', - 'created', 'last_updated', 'site_count', 'provider_count', + 'id', 'url', 'display_url', 'display', 'asn', 'rir', 'tenant', 'description', 'comments', 'tags', + 'custom_fields', 'created', 'last_updated', 'site_count', 'provider_count', ] brief_fields = ('id', 'url', 'display', 'asn', 'description') diff --git a/netbox/ipam/api/serializers_/fhrpgroups.py b/netbox/ipam/api/serializers_/fhrpgroups.py index 9bf1d4548d0..f2da9767c49 100644 --- a/netbox/ipam/api/serializers_/fhrpgroups.py +++ b/netbox/ipam/api/serializers_/fhrpgroups.py @@ -16,19 +16,21 @@ class FHRPGroupSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:fhrpgroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:fhrpgroup-detail') ip_addresses = IPAddressSerializer(nested=True, many=True, read_only=True) class Meta: model = FHRPGroup fields = [ - 'id', 'name', 'url', 'display', 'protocol', 'group_id', 'auth_type', 'auth_key', 'description', 'comments', - 'tags', 'custom_fields', 'created', 'last_updated', 'ip_addresses', + 'id', 'name', 'url', 'display_url', 'display', 'protocol', 'group_id', 'auth_type', 'auth_key', + 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'ip_addresses', ] brief_fields = ('id', 'url', 'display', 'protocol', 'group_id', 'description') class FHRPGroupAssignmentSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:fhrpgroupassignment-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:fhrpgroupassignment-detail') group = FHRPGroupSerializer(nested=True) interface_type = ContentTypeField( queryset=ContentType.objects.all() @@ -38,8 +40,8 @@ class FHRPGroupAssignmentSerializer(NetBoxModelSerializer): class Meta: model = FHRPGroupAssignment fields = [ - 'id', 'url', 'display', 'group', 'interface_type', 'interface_id', 'interface', 'priority', 'created', - 'last_updated', + 'id', 'url', 'display_url', 'display', 'group', 'interface_type', 'interface_id', 'interface', + 'priority', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'group', 'interface_type', 'interface_id', 'priority') diff --git a/netbox/ipam/api/serializers_/ip.py b/netbox/ipam/api/serializers_/ip.py index 7c53d68cafe..ab53d3619da 100644 --- a/netbox/ipam/api/serializers_/ip.py +++ b/netbox/ipam/api/serializers_/ip.py @@ -30,6 +30,7 @@ class AggregateSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:aggregate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:aggregate-detail') family = ChoiceField(choices=IPAddressFamilyChoices, read_only=True) rir = RIRSerializer(nested=True) tenant = TenantSerializer(nested=True, required=False, allow_null=True) @@ -38,14 +39,15 @@ class AggregateSerializer(NetBoxModelSerializer): class Meta: model = Aggregate fields = [ - 'id', 'url', 'display', 'family', 'prefix', 'rir', 'tenant', 'date_added', 'description', 'comments', - 'tags', 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'family', 'prefix', 'rir', 'tenant', 'date_added', 'description', + 'comments', 'tags', 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'family', 'prefix', 'description') class PrefixSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:prefix-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:prefix-detail') family = ChoiceField(choices=IPAddressFamilyChoices, read_only=True) site = SiteSerializer(nested=True, required=False, allow_null=True) vrf = VRFSerializer(nested=True, required=False, allow_null=True) @@ -60,9 +62,9 @@ class PrefixSerializer(NetBoxModelSerializer): class Meta: model = Prefix fields = [ - 'id', 'url', 'display', 'family', 'prefix', 'site', 'vrf', 'tenant', 'vlan', 'status', 'role', 'is_pool', - 'mark_utilized', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'children', - '_depth', + 'id', 'url', 'display_url', 'display', 'family', 'prefix', 'site', 'vrf', 'tenant', 'vlan', 'status', + 'role', 'is_pool', 'mark_utilized', 'description', 'comments', 'tags', 'custom_fields', + 'created', 'last_updated', 'children', '_depth', ] brief_fields = ('id', 'url', 'display', 'family', 'prefix', 'description', '_depth') @@ -120,6 +122,7 @@ def to_representation(self, instance): class IPRangeSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:iprange-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:iprange-detail') family = ChoiceField(choices=IPAddressFamilyChoices, read_only=True) start_address = IPAddressField() end_address = IPAddressField() @@ -131,8 +134,8 @@ class IPRangeSerializer(NetBoxModelSerializer): class Meta: model = IPRange fields = [ - 'id', 'url', 'display', 'family', 'start_address', 'end_address', 'size', 'vrf', 'tenant', 'status', 'role', - 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'family', 'start_address', 'end_address', 'size', 'vrf', 'tenant', + 'status', 'role', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'mark_utilized', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'family', 'start_address', 'end_address', 'description') @@ -144,6 +147,7 @@ class Meta: class IPAddressSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:ipaddress-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:ipaddress-detail') family = ChoiceField(choices=IPAddressFamilyChoices, read_only=True) address = IPAddressField() vrf = VRFSerializer(nested=True, required=False, allow_null=True) @@ -162,9 +166,9 @@ class IPAddressSerializer(NetBoxModelSerializer): class Meta: model = IPAddress fields = [ - 'id', 'url', 'display', 'family', 'address', 'vrf', 'tenant', 'status', 'role', 'assigned_object_type', - 'assigned_object_id', 'assigned_object', 'nat_inside', 'nat_outside', 'dns_name', 'description', 'comments', - 'tags', 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'family', 'address', 'vrf', 'tenant', 'status', 'role', + 'assigned_object_type', 'assigned_object_id', 'assigned_object', 'nat_inside', 'nat_outside', + 'dns_name', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'family', 'address', 'description') diff --git a/netbox/ipam/api/serializers_/roles.py b/netbox/ipam/api/serializers_/roles.py index 8208b8074e6..26026b87bd6 100644 --- a/netbox/ipam/api/serializers_/roles.py +++ b/netbox/ipam/api/serializers_/roles.py @@ -11,6 +11,7 @@ class RoleSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:role-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:role-detail') # Related object counts prefix_count = RelatedObjectCountField('prefixes') @@ -19,7 +20,7 @@ class RoleSerializer(NetBoxModelSerializer): class Meta: model = Role fields = [ - 'id', 'url', 'display', 'name', 'slug', 'weight', 'description', 'tags', 'custom_fields', 'created', - 'last_updated', 'prefix_count', 'vlan_count', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'weight', 'description', 'tags', 'custom_fields', + 'created', 'last_updated', 'prefix_count', 'vlan_count', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'prefix_count', 'vlan_count') diff --git a/netbox/ipam/api/serializers_/services.py b/netbox/ipam/api/serializers_/services.py index 407739667dd..10ba32250d5 100644 --- a/netbox/ipam/api/serializers_/services.py +++ b/netbox/ipam/api/serializers_/services.py @@ -16,19 +16,21 @@ class ServiceTemplateSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:servicetemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:servicetemplate-detail') protocol = ChoiceField(choices=ServiceProtocolChoices, required=False) class Meta: model = ServiceTemplate fields = [ - 'id', 'url', 'display', 'name', 'protocol', 'ports', 'description', 'comments', 'tags', 'custom_fields', - 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'name', 'protocol', 'ports', 'description', 'comments', 'tags', + 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'protocol', 'ports', 'description') class ServiceSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:service-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:service-detail') device = DeviceSerializer(nested=True, required=False, allow_null=True) virtual_machine = VirtualMachineSerializer(nested=True, required=False, allow_null=True) protocol = ChoiceField(choices=ServiceProtocolChoices, required=False) @@ -43,7 +45,7 @@ class ServiceSerializer(NetBoxModelSerializer): class Meta: model = Service fields = [ - 'id', 'url', 'display', 'device', 'virtual_machine', 'name', 'protocol', 'ports', 'ipaddresses', - 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'device', 'virtual_machine', 'name', 'protocol', 'ports', + 'ipaddresses', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'protocol', 'ports', 'description') diff --git a/netbox/ipam/api/serializers_/vlans.py b/netbox/ipam/api/serializers_/vlans.py index f35d294cf37..5deba3dae47 100644 --- a/netbox/ipam/api/serializers_/vlans.py +++ b/netbox/ipam/api/serializers_/vlans.py @@ -23,6 +23,7 @@ class VLANGroupSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vlangroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:vlangroup-detail') scope_type = ContentTypeField( queryset=ContentType.objects.filter( model__in=VLANGROUP_SCOPE_TYPES @@ -41,8 +42,8 @@ class VLANGroupSerializer(NetBoxModelSerializer): class Meta: model = VLANGroup fields = [ - 'id', 'url', 'display', 'name', 'slug', 'scope_type', 'scope_id', 'scope', 'min_vid', 'max_vid', - 'description', 'tags', 'custom_fields', 'created', 'last_updated', 'vlan_count', 'utilization' + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'scope_type', 'scope_id', 'scope', 'min_vid', + 'max_vid', 'description', 'tags', 'custom_fields', 'created', 'last_updated', 'vlan_count', 'utilization' ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'vlan_count') validators = [] @@ -58,6 +59,7 @@ def get_scope(self, obj): class VLANSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vlan-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:vlan-detail') site = SiteSerializer(nested=True, required=False, allow_null=True) group = VLANGroupSerializer(nested=True, required=False, allow_null=True, default=None) tenant = TenantSerializer(nested=True, required=False, allow_null=True) @@ -71,8 +73,9 @@ class VLANSerializer(NetBoxModelSerializer): class Meta: model = VLAN fields = [ - 'id', 'url', 'display', 'site', 'group', 'vid', 'name', 'tenant', 'status', 'role', 'description', - 'comments', 'l2vpn_termination', 'tags', 'custom_fields', 'created', 'last_updated', 'prefix_count', + 'id', 'url', 'display_url', 'display', 'site', 'group', 'vid', 'name', 'tenant', 'status', 'role', + 'description', 'comments', 'l2vpn_termination', 'tags', 'custom_fields', 'created', 'last_updated', + 'prefix_count', ] brief_fields = ('id', 'url', 'display', 'vid', 'name', 'description') diff --git a/netbox/ipam/api/serializers_/vrfs.py b/netbox/ipam/api/serializers_/vrfs.py index fdb5f98abf6..6c38782615b 100644 --- a/netbox/ipam/api/serializers_/vrfs.py +++ b/netbox/ipam/api/serializers_/vrfs.py @@ -13,19 +13,21 @@ class RouteTargetSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:routetarget-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:routetarget-detail') tenant = TenantSerializer(nested=True, required=False, allow_null=True) class Meta: model = RouteTarget fields = [ - 'id', 'url', 'display', 'name', 'tenant', 'description', 'comments', 'tags', 'custom_fields', 'created', - 'last_updated', + 'id', 'url', 'display_url', 'display', 'name', 'tenant', 'description', 'comments', 'tags', + 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') class VRFSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vrf-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:vrf-detail') tenant = TenantSerializer(nested=True, required=False, allow_null=True) import_targets = SerializedPKRelatedField( queryset=RouteTarget.objects.all(), @@ -47,7 +49,7 @@ class VRFSerializer(NetBoxModelSerializer): class Meta: model = VRF fields = [ - 'id', 'url', 'display', 'name', 'rd', 'tenant', 'enforce_unique', 'description', 'comments', + 'id', 'url', 'display_url', 'display', 'name', 'rd', 'tenant', 'enforce_unique', 'description', 'comments', 'import_targets', 'export_targets', 'tags', 'custom_fields', 'created', 'last_updated', 'ipaddress_count', 'prefix_count', ] diff --git a/netbox/netbox/api/serializers/nested.py b/netbox/netbox/api/serializers/nested.py index e43fd7428c9..c39701e95d9 100644 --- a/netbox/netbox/api/serializers/nested.py +++ b/netbox/netbox/api/serializers/nested.py @@ -24,7 +24,8 @@ def to_internal_value(self, data): # Declared here for use by PrimaryModelSerializer, but should be imported from extras.api.nested_serializers class NestedTagSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:tag-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:tag-detail') class Meta: model = Tag - fields = ['id', 'url', 'display', 'name', 'slug', 'color'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'color'] diff --git a/netbox/tenancy/api/nested_serializers.py b/netbox/tenancy/api/nested_serializers.py index d2d76d96caf..4125dd154bd 100644 --- a/netbox/tenancy/api/nested_serializers.py +++ b/netbox/tenancy/api/nested_serializers.py @@ -23,20 +23,22 @@ ) class NestedTenantGroupSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:tenantgroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:tenantgroup-detail') tenant_count = serializers.IntegerField(read_only=True) _depth = serializers.IntegerField(source='level', read_only=True) class Meta: model = TenantGroup - fields = ['id', 'url', 'display', 'name', 'slug', 'tenant_count', '_depth'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'tenant_count', '_depth'] class NestedTenantSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:tenant-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:tenant-detail') class Meta: model = Tenant - fields = ['id', 'url', 'display', 'name', 'slug'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug'] # @@ -48,35 +50,39 @@ class Meta: ) class NestedContactGroupSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:contactgroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:contactgroup-detail') contact_count = serializers.IntegerField(read_only=True) _depth = serializers.IntegerField(source='level', read_only=True) class Meta: model = ContactGroup - fields = ['id', 'url', 'display', 'name', 'slug', 'contact_count', '_depth'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'contact_count', '_depth'] class NestedContactRoleSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:contactrole-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:contactrole-detail') class Meta: model = ContactRole - fields = ['id', 'url', 'display', 'name', 'slug'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug'] class NestedContactSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:contact-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:contact-detail') class Meta: model = Contact - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedContactAssignmentSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:contactassignment-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:contactassignment-detail') contact = NestedContactSerializer() role = NestedContactRoleSerializer class Meta: model = ContactAssignment - fields = ['id', 'url', 'display', 'contact', 'role', 'priority'] + fields = ['id', 'url', 'display_url', 'display', 'contact', 'role', 'priority'] diff --git a/netbox/tenancy/api/serializers_/contacts.py b/netbox/tenancy/api/serializers_/contacts.py index 85747995830..d315abff678 100644 --- a/netbox/tenancy/api/serializers_/contacts.py +++ b/netbox/tenancy/api/serializers_/contacts.py @@ -20,44 +20,49 @@ class ContactGroupSerializer(NestedGroupModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:contactgroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:contactgroup-detail') parent = NestedContactGroupSerializer(required=False, allow_null=True, default=None) contact_count = serializers.IntegerField(read_only=True, default=0) class Meta: model = ContactGroup fields = [ - 'id', 'url', 'display', 'name', 'slug', 'parent', 'description', 'tags', 'custom_fields', 'created', - 'last_updated', 'contact_count', '_depth', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'parent', 'description', 'tags', 'custom_fields', + 'created', 'last_updated', 'contact_count', '_depth', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'contact_count', '_depth') class ContactRoleSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:contactrole-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:contactrole-detail') class Meta: model = ContactRole fields = [ - 'id', 'url', 'display', 'name', 'slug', 'description', 'tags', 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'description', 'tags', 'custom_fields', + 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description') class ContactSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:contact-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:contact-detail') group = ContactGroupSerializer(nested=True, required=False, allow_null=True, default=None) class Meta: model = Contact fields = [ - 'id', 'url', 'display', 'group', 'name', 'title', 'phone', 'email', 'address', 'link', 'description', - 'comments', 'tags', 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'group', 'name', 'title', 'phone', 'email', 'address', 'link', + 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') class ContactAssignmentSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:contactassignment-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:contactassignment-detail') object_type = ContentTypeField( queryset=ContentType.objects.all() ) @@ -69,8 +74,8 @@ class ContactAssignmentSerializer(NetBoxModelSerializer): class Meta: model = ContactAssignment fields = [ - 'id', 'url', 'display', 'object_type', 'object_id', 'object', 'contact', 'role', 'priority', 'tags', - 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'object_type', 'object_id', 'object', 'contact', 'role', 'priority', + 'tags', 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'contact', 'role', 'priority') diff --git a/netbox/tenancy/api/serializers_/tenants.py b/netbox/tenancy/api/serializers_/tenants.py index 3ff489be19d..5beaa807d3a 100644 --- a/netbox/tenancy/api/serializers_/tenants.py +++ b/netbox/tenancy/api/serializers_/tenants.py @@ -13,20 +13,22 @@ class TenantGroupSerializer(NestedGroupModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:tenantgroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:tenantgroup-detail') parent = NestedTenantGroupSerializer(required=False, allow_null=True) tenant_count = serializers.IntegerField(read_only=True, default=0) class Meta: model = TenantGroup fields = [ - 'id', 'url', 'display', 'name', 'slug', 'parent', 'description', 'tags', 'custom_fields', 'created', - 'last_updated', 'tenant_count', '_depth', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'parent', 'description', 'tags', 'custom_fields', + 'created', 'last_updated', 'tenant_count', '_depth', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'tenant_count', '_depth') class TenantSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:tenant-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:tenant-detail') group = TenantGroupSerializer(nested=True, required=False, allow_null=True, default=None) # Related object counts @@ -44,8 +46,9 @@ class TenantSerializer(NetBoxModelSerializer): class Meta: model = Tenant fields = [ - 'id', 'url', 'display', 'name', 'slug', 'group', 'description', 'comments', 'tags', 'custom_fields', - 'created', 'last_updated', 'circuit_count', 'device_count', 'ipaddress_count', 'prefix_count', 'rack_count', - 'site_count', 'virtualmachine_count', 'vlan_count', 'vrf_count', 'cluster_count', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'group', 'description', 'comments', 'tags', + 'custom_fields', 'created', 'last_updated', 'circuit_count', 'device_count', 'ipaddress_count', + 'prefix_count', 'rack_count', 'site_count', 'virtualmachine_count', 'vlan_count', 'vrf_count', + 'cluster_count', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description') diff --git a/netbox/users/api/nested_serializers.py b/netbox/users/api/nested_serializers.py index 2ab5d3aa5d3..d6f9dbb5cb2 100644 --- a/netbox/users/api/nested_serializers.py +++ b/netbox/users/api/nested_serializers.py @@ -18,18 +18,20 @@ class NestedGroupSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='users-api:group-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='users:group-detail') class Meta: model = Group - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedUserSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='users-api:user-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='users:user-detail') class Meta: model = get_user_model() - fields = ['id', 'url', 'display', 'username'] + fields = ['id', 'url', 'display_url', 'display', 'username'] @extend_schema_field(OpenApiTypes.STR) def get_display(self, obj): @@ -40,14 +42,16 @@ def get_display(self, obj): class NestedTokenSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='users-api:token-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='users:token-detail') class Meta: model = Token - fields = ['id', 'url', 'display', 'key', 'write_enabled'] + fields = ['id', 'url', 'display_url', 'display', 'key', 'write_enabled'] class NestedObjectPermissionSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='users-api:objectpermission-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='users:objectpermission-detail') object_types = ContentTypeField( queryset=ObjectType.objects.all(), many=True @@ -57,7 +61,9 @@ class NestedObjectPermissionSerializer(WritableNestedSerializer): class Meta: model = ObjectPermission - fields = ['id', 'url', 'display', 'name', 'enabled', 'object_types', 'groups', 'users', 'actions'] + fields = [ + 'id', 'url', 'display_url', 'display', 'name', 'enabled', 'object_types', 'groups', 'users', 'actions' + ] @extend_schema_field(serializers.ListField) def get_groups(self, obj): diff --git a/netbox/users/api/serializers_/permissions.py b/netbox/users/api/serializers_/permissions.py index 6d958152598..8534fb8f16e 100644 --- a/netbox/users/api/serializers_/permissions.py +++ b/netbox/users/api/serializers_/permissions.py @@ -13,6 +13,7 @@ class ObjectPermissionSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='users-api:objectpermission-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='users:objectpermission-detail') object_types = ContentTypeField( queryset=ObjectType.objects.all(), many=True @@ -35,8 +36,8 @@ class ObjectPermissionSerializer(ValidatedModelSerializer): class Meta: model = ObjectPermission fields = ( - 'id', 'url', 'display', 'name', 'description', 'enabled', 'object_types', 'actions', 'constraints', - 'groups', 'users', + 'id', 'url', 'display_url', 'display', 'name', 'description', 'enabled', 'object_types', 'actions', + 'constraints', 'groups', 'users', ) brief_fields = ( 'id', 'url', 'display', 'name', 'description', 'enabled', 'object_types', 'actions', diff --git a/netbox/users/api/serializers_/tokens.py b/netbox/users/api/serializers_/tokens.py index 65e1e711101..b0c3ffd893d 100644 --- a/netbox/users/api/serializers_/tokens.py +++ b/netbox/users/api/serializers_/tokens.py @@ -16,6 +16,7 @@ class TokenSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='users-api:token-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='users:token-detail') key = serializers.CharField( min_length=40, max_length=40, @@ -34,8 +35,8 @@ class TokenSerializer(ValidatedModelSerializer): class Meta: model = Token fields = ( - 'id', 'url', 'display', 'user', 'created', 'expires', 'last_used', 'key', 'write_enabled', 'description', - 'allowed_ips', + 'id', 'url', 'display_url', 'display', 'user', 'created', 'expires', 'last_used', 'key', 'write_enabled', + 'description', 'allowed_ips', ) brief_fields = ('id', 'url', 'display', 'key', 'write_enabled', 'description') @@ -76,8 +77,8 @@ class TokenProvisionSerializer(TokenSerializer): class Meta: model = Token fields = ( - 'id', 'url', 'display', 'user', 'created', 'expires', 'last_used', 'key', 'write_enabled', 'description', - 'allowed_ips', 'username', 'password', + 'id', 'url', 'display_url', 'display', 'user', 'created', 'expires', 'last_used', 'key', 'write_enabled', + 'description', 'allowed_ips', 'username', 'password', ) def validate(self, data): diff --git a/netbox/users/api/serializers_/users.py b/netbox/users/api/serializers_/users.py index 2273b2d5a68..13541207b60 100644 --- a/netbox/users/api/serializers_/users.py +++ b/netbox/users/api/serializers_/users.py @@ -16,6 +16,7 @@ class GroupSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='users-api:group-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='users:group-detail') user_count = serializers.IntegerField(read_only=True) permissions = SerializedPKRelatedField( source='object_permissions', @@ -28,12 +29,13 @@ class GroupSerializer(ValidatedModelSerializer): class Meta: model = Group - fields = ('id', 'url', 'display', 'name', 'description', 'permissions', 'user_count') + fields = ('id', 'url', 'display_url', 'display', 'name', 'description', 'permissions', 'user_count') brief_fields = ('id', 'url', 'display', 'name', 'description') class UserSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='users-api:user-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='users:user-detail') groups = SerializedPKRelatedField( queryset=Group.objects.all(), serializer=GroupSerializer, @@ -53,8 +55,8 @@ class UserSerializer(ValidatedModelSerializer): class Meta: model = get_user_model() fields = ( - 'id', 'url', 'display', 'username', 'password', 'first_name', 'last_name', 'email', 'is_staff', 'is_active', - 'date_joined', 'last_login', 'groups', 'permissions', + 'id', 'url', 'display_url', 'display', 'username', 'password', 'first_name', 'last_name', 'email', + 'is_staff', 'is_active', 'date_joined', 'last_login', 'groups', 'permissions', ) brief_fields = ('id', 'url', 'display', 'username') extra_kwargs = { diff --git a/netbox/virtualization/api/nested_serializers.py b/netbox/virtualization/api/nested_serializers.py index 0c7a1091803..accba4b8a59 100644 --- a/netbox/virtualization/api/nested_serializers.py +++ b/netbox/virtualization/api/nested_serializers.py @@ -24,11 +24,12 @@ ) class NestedClusterTypeSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustertype-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:clustertype-detail') cluster_count = RelatedObjectCountField('clusters') class Meta: model = ClusterType - fields = ['id', 'url', 'display', 'name', 'slug', 'cluster_count'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'cluster_count'] @extend_schema_serializer( @@ -36,11 +37,12 @@ class Meta: ) class NestedClusterGroupSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustergroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:clustergroup-detail') cluster_count = RelatedObjectCountField('clusters') class Meta: model = ClusterGroup - fields = ['id', 'url', 'display', 'name', 'slug', 'cluster_count'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'cluster_count'] @extend_schema_serializer( @@ -48,11 +50,12 @@ class Meta: ) class NestedClusterSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:cluster-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:cluster-detail') virtualmachine_count = RelatedObjectCountField('virtual_machines') class Meta: model = Cluster - fields = ['id', 'url', 'display', 'name', 'virtualmachine_count'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'virtualmachine_count'] # @@ -61,25 +64,28 @@ class Meta: class NestedVirtualMachineSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:virtualmachine-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:virtualmachine-detail') class Meta: model = VirtualMachine - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedVMInterfaceSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:vminterface-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:vminterface-detail') virtual_machine = NestedVirtualMachineSerializer(read_only=True) class Meta: model = VMInterface - fields = ['id', 'url', 'display', 'virtual_machine', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'virtual_machine', 'name'] class NestedVirtualDiskSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:virtualdisk-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:virtualdisk-detail') virtual_machine = NestedVirtualMachineSerializer(read_only=True) class Meta: model = VirtualDisk - fields = ['id', 'url', 'display', 'virtual_machine', 'name', 'size'] + fields = ['id', 'url', 'display_url', 'display', 'virtual_machine', 'name', 'size'] diff --git a/netbox/virtualization/api/serializers_/clusters.py b/netbox/virtualization/api/serializers_/clusters.py index 5765ff614bb..c5a25698429 100644 --- a/netbox/virtualization/api/serializers_/clusters.py +++ b/netbox/virtualization/api/serializers_/clusters.py @@ -16,6 +16,7 @@ class ClusterTypeSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustertype-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:clustertype-detail') # Related object counts cluster_count = RelatedObjectCountField('clusters') @@ -23,14 +24,15 @@ class ClusterTypeSerializer(NetBoxModelSerializer): class Meta: model = ClusterType fields = [ - 'id', 'url', 'display', 'name', 'slug', 'description', 'tags', 'custom_fields', 'created', 'last_updated', - 'cluster_count', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'description', 'tags', 'custom_fields', + 'created', 'last_updated', 'cluster_count', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'cluster_count') class ClusterGroupSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustergroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:clustergroup-detail') # Related object counts cluster_count = RelatedObjectCountField('clusters') @@ -38,14 +40,15 @@ class ClusterGroupSerializer(NetBoxModelSerializer): class Meta: model = ClusterGroup fields = [ - 'id', 'url', 'display', 'name', 'slug', 'description', 'tags', 'custom_fields', 'created', 'last_updated', - 'cluster_count', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'description', 'tags', 'custom_fields', + 'created', 'last_updated', 'cluster_count', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'cluster_count') class ClusterSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:cluster-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:cluster-detail') type = ClusterTypeSerializer(nested=True) group = ClusterGroupSerializer(nested=True, required=False, allow_null=True, default=None) status = ChoiceField(choices=ClusterStatusChoices, required=False) @@ -59,7 +62,8 @@ class ClusterSerializer(NetBoxModelSerializer): class Meta: model = Cluster fields = [ - 'id', 'url', 'display', 'name', 'type', 'group', 'status', 'tenant', 'site', 'description', 'comments', - 'tags', 'custom_fields', 'created', 'last_updated', 'device_count', 'virtualmachine_count', + 'id', 'url', 'display_url', 'display', 'name', 'type', 'group', 'status', 'tenant', 'site', + 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'device_count', + 'virtualmachine_count', ] brief_fields = ('id', 'url', 'display', 'name', 'description', 'virtualmachine_count') diff --git a/netbox/virtualization/api/serializers_/virtualmachines.py b/netbox/virtualization/api/serializers_/virtualmachines.py index 53146e44ab3..6af0b3442ff 100644 --- a/netbox/virtualization/api/serializers_/virtualmachines.py +++ b/netbox/virtualization/api/serializers_/virtualmachines.py @@ -30,6 +30,7 @@ class VirtualMachineSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:virtualmachine-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:virtualmachine-detail') status = ChoiceField(choices=VirtualMachineStatusChoices, required=False) site = SiteSerializer(nested=True, required=False, allow_null=True, default=None) cluster = ClusterSerializer(nested=True, required=False, allow_null=True, default=None) @@ -49,9 +50,9 @@ class VirtualMachineSerializer(NetBoxModelSerializer): class Meta: model = VirtualMachine fields = [ - 'id', 'url', 'display', 'name', 'status', 'site', 'cluster', 'device', 'role', 'tenant', 'platform', - 'primary_ip', 'primary_ip4', 'primary_ip6', 'vcpus', 'memory', 'disk', 'description', 'comments', - 'config_template', 'local_context_data', 'tags', 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'name', 'status', 'site', 'cluster', 'device', 'role', 'tenant', + 'platform', 'primary_ip', 'primary_ip4', 'primary_ip6', 'vcpus', 'memory', 'disk', 'description', + 'comments', 'config_template', 'local_context_data', 'tags', 'custom_fields', 'created', 'last_updated', 'interface_count', 'virtual_disk_count', ] brief_fields = ('id', 'url', 'display', 'name', 'description') @@ -62,9 +63,9 @@ class VirtualMachineWithConfigContextSerializer(VirtualMachineSerializer): class Meta(VirtualMachineSerializer.Meta): fields = [ - 'id', 'url', 'display', 'name', 'status', 'site', 'cluster', 'device', 'role', 'tenant', 'platform', - 'primary_ip', 'primary_ip4', 'primary_ip6', 'vcpus', 'memory', 'disk', 'description', 'comments', - 'config_template', 'local_context_data', 'tags', 'custom_fields', 'config_context', 'created', + 'id', 'url', 'display_url', 'display', 'name', 'status', 'site', 'cluster', 'device', 'role', 'tenant', + 'platform', 'primary_ip', 'primary_ip4', 'primary_ip6', 'vcpus', 'memory', 'disk', 'description', + 'comments', 'config_template', 'local_context_data', 'tags', 'custom_fields', 'config_context', 'created', 'last_updated', 'interface_count', 'virtual_disk_count', ] @@ -79,6 +80,7 @@ def get_config_context(self, obj): class VMInterfaceSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:vminterface-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:vminterface-detail') virtual_machine = VirtualMachineSerializer(nested=True) parent = NestedVMInterfaceSerializer(required=False, allow_null=True) bridge = NestedVMInterfaceSerializer(required=False, allow_null=True) @@ -104,9 +106,9 @@ class VMInterfaceSerializer(NetBoxModelSerializer): class Meta: model = VMInterface fields = [ - 'id', 'url', 'display', 'virtual_machine', 'name', 'enabled', 'parent', 'bridge', 'mtu', 'mac_address', - 'description', 'mode', 'untagged_vlan', 'tagged_vlans', 'vrf', 'l2vpn_termination', 'tags', 'custom_fields', - 'created', 'last_updated', 'count_ipaddresses', 'count_fhrp_groups', + 'id', 'url', 'display_url', 'display', 'virtual_machine', 'name', 'enabled', 'parent', 'bridge', 'mtu', + 'mac_address', 'description', 'mode', 'untagged_vlan', 'tagged_vlans', 'vrf', 'l2vpn_termination', + 'tags', 'custom_fields', 'created', 'last_updated', 'count_ipaddresses', 'count_fhrp_groups', ] brief_fields = ('id', 'url', 'display', 'virtual_machine', 'name', 'description') @@ -130,12 +132,13 @@ def validate(self, data): class VirtualDiskSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:virtualdisk-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:virtualdisk-detail') virtual_machine = VirtualMachineSerializer(nested=True) class Meta: model = VirtualDisk fields = [ - 'id', 'url', 'display', 'virtual_machine', 'name', 'description', 'size', 'tags', 'custom_fields', - 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'virtual_machine', 'name', 'description', 'size', 'tags', + 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'virtual_machine', 'name', 'description', 'size') diff --git a/netbox/vpn/api/nested_serializers.py b/netbox/vpn/api/nested_serializers.py index c91dcb40abf..385bbe2a5a5 100644 --- a/netbox/vpn/api/nested_serializers.py +++ b/netbox/vpn/api/nested_serializers.py @@ -24,81 +24,103 @@ ) class NestedTunnelGroupSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='vpn-api:tunnelgroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='vpn:tunnelgroup-detail') tunnel_count = RelatedObjectCountField('tunnels') class Meta: model = models.TunnelGroup - fields = ['id', 'url', 'display', 'name', 'slug', 'tunnel_count'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'tunnel_count'] class NestedTunnelSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField( view_name='vpn-api:tunnel-detail' ) + display_url = serializers.HyperlinkedIdentityField( + view_name='vpn:tunnel-detail' + ) class Meta: model = models.Tunnel - fields = ('id', 'url', 'display', 'name') + fields = ('id', 'url', 'display_url', 'display', 'name') class NestedTunnelTerminationSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField( view_name='vpn-api:tunneltermination-detail' ) + display_url = serializers.HyperlinkedIdentityField( + view_name='vpn:tunneltermination-detail' + ) class Meta: model = models.TunnelTermination - fields = ('id', 'url', 'display') + fields = ('id', 'url', 'display_url', 'display') class NestedIKEProposalSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField( view_name='vpn-api:ikeproposal-detail' ) + display_url = serializers.HyperlinkedIdentityField( + view_name='vpn:ikeproposal-detail' + ) class Meta: model = models.IKEProposal - fields = ('id', 'url', 'display', 'name') + fields = ('id', 'url', 'display_url', 'display', 'name') class NestedIKEPolicySerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField( view_name='vpn-api:ikepolicy-detail' ) + display_url = serializers.HyperlinkedIdentityField( + view_name='vpn:ikepolicy-detail' + ) class Meta: model = models.IKEPolicy - fields = ('id', 'url', 'display', 'name') + fields = ('id', 'url', 'display_url', 'display', 'name') class NestedIPSecProposalSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField( view_name='vpn-api:ipsecproposal-detail' ) + display_url = serializers.HyperlinkedIdentityField( + view_name='vpn:ipsecproposal-detail' + ) class Meta: model = models.IPSecProposal - fields = ('id', 'url', 'display', 'name') + fields = ('id', 'url', 'display_url', 'display', 'name') class NestedIPSecPolicySerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField( view_name='vpn-api:ipsecpolicy-detail' ) + display_url = serializers.HyperlinkedIdentityField( + view_name='vpn:ipsecpolicy-detail' + ) class Meta: model = models.IPSecPolicy - fields = ('id', 'url', 'display', 'name') + fields = ('id', 'url', 'display_url', 'display', 'name') class NestedIPSecProfileSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField( view_name='vpn-api:ipsecprofile-detail' ) + display_url = serializers.HyperlinkedIdentityField( + view_name='vpn:ipsecprofile-detail' + ) class Meta: model = models.IPSecProfile - fields = ('id', 'url', 'display', 'name') + fields = ('id', 'url', 'display_url', 'display', 'name') # @@ -107,20 +129,22 @@ class Meta: class NestedL2VPNSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='vpn-api:l2vpn-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='vpn:l2vpn-detail') class Meta: model = models.L2VPN fields = [ - 'id', 'url', 'display', 'identifier', 'name', 'slug', 'type' + 'id', 'url', 'display', 'display_url', 'identifier', 'name', 'slug', 'type' ] class NestedL2VPNTerminationSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='vpn-api:l2vpntermination-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='vpn:l2vpntermination-detail') l2vpn = NestedL2VPNSerializer() class Meta: model = models.L2VPNTermination fields = [ - 'id', 'url', 'display', 'l2vpn' + 'id', 'url', 'display_url', 'display', 'l2vpn' ] diff --git a/netbox/vpn/api/serializers_/crypto.py b/netbox/vpn/api/serializers_/crypto.py index 3ee30b754eb..0f625f8a0e9 100644 --- a/netbox/vpn/api/serializers_/crypto.py +++ b/netbox/vpn/api/serializers_/crypto.py @@ -18,6 +18,9 @@ class IKEProposalSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField( view_name='vpn-api:ikeproposal-detail' ) + display_url = serializers.HyperlinkedIdentityField( + view_name='vpn:ikeproposal-detail' + ) authentication_method = ChoiceField( choices=AuthenticationMethodChoices ) @@ -34,9 +37,9 @@ class IKEProposalSerializer(NetBoxModelSerializer): class Meta: model = IKEProposal fields = ( - 'id', 'url', 'display', 'name', 'description', 'authentication_method', 'encryption_algorithm', - 'authentication_algorithm', 'group', 'sa_lifetime', 'comments', 'tags', 'custom_fields', 'created', - 'last_updated', + 'id', 'url', 'display_url', 'display', 'name', 'description', 'authentication_method', + 'encryption_algorithm', 'authentication_algorithm', 'group', 'sa_lifetime', 'comments', 'tags', + 'custom_fields', 'created', 'last_updated', ) brief_fields = ('id', 'url', 'display', 'name', 'description') @@ -45,6 +48,9 @@ class IKEPolicySerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField( view_name='vpn-api:ikepolicy-detail' ) + display_url = serializers.HyperlinkedIdentityField( + view_name='vpn:ikepolicy-detail' + ) version = ChoiceField( choices=IKEVersionChoices ) @@ -62,8 +68,8 @@ class IKEPolicySerializer(NetBoxModelSerializer): class Meta: model = IKEPolicy fields = ( - 'id', 'url', 'display', 'name', 'description', 'version', 'mode', 'proposals', 'preshared_key', 'comments', - 'tags', 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'name', 'description', 'version', 'mode', 'proposals', + 'preshared_key', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', ) brief_fields = ('id', 'url', 'display', 'name', 'description') @@ -72,6 +78,9 @@ class IPSecProposalSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField( view_name='vpn-api:ipsecproposal-detail' ) + display_url = serializers.HyperlinkedIdentityField( + view_name='vpn:ipsecproposal-detail' + ) encryption_algorithm = ChoiceField( choices=EncryptionAlgorithmChoices ) @@ -82,8 +91,8 @@ class IPSecProposalSerializer(NetBoxModelSerializer): class Meta: model = IPSecProposal fields = ( - 'id', 'url', 'display', 'name', 'description', 'encryption_algorithm', 'authentication_algorithm', - 'sa_lifetime_seconds', 'sa_lifetime_data', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'name', 'description', 'encryption_algorithm', + 'authentication_algorithm', 'sa_lifetime_seconds', 'sa_lifetime_data', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', ) brief_fields = ('id', 'url', 'display', 'name', 'description') @@ -92,6 +101,9 @@ class IPSecPolicySerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField( view_name='vpn-api:ipsecpolicy-detail' ) + display_url = serializers.HyperlinkedIdentityField( + view_name='vpn:ipsecpolicy-detail' + ) proposals = SerializedPKRelatedField( queryset=IPSecProposal.objects.all(), serializer=IPSecProposalSerializer, @@ -107,7 +119,7 @@ class IPSecPolicySerializer(NetBoxModelSerializer): class Meta: model = IPSecPolicy fields = ( - 'id', 'url', 'display', 'name', 'description', 'proposals', 'pfs_group', 'comments', 'tags', + 'id', 'url', 'display_url', 'display', 'name', 'description', 'proposals', 'pfs_group', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', ) brief_fields = ('id', 'url', 'display', 'name', 'description') @@ -117,6 +129,9 @@ class IPSecProfileSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField( view_name='vpn-api:ipsecprofile-detail' ) + display_url = serializers.HyperlinkedIdentityField( + view_name='vpn:ipsecprofile-detail' + ) mode = ChoiceField( choices=IPSecModeChoices ) @@ -130,7 +145,7 @@ class IPSecProfileSerializer(NetBoxModelSerializer): class Meta: model = IPSecProfile fields = ( - 'id', 'url', 'display', 'name', 'description', 'mode', 'ike_policy', 'ipsec_policy', 'comments', 'tags', - 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'name', 'description', 'mode', 'ike_policy', 'ipsec_policy', + 'comments', 'tags', 'custom_fields', 'created', 'last_updated', ) brief_fields = ('id', 'url', 'display', 'name', 'description') diff --git a/netbox/vpn/api/serializers_/l2vpn.py b/netbox/vpn/api/serializers_/l2vpn.py index 3b78d50c907..6c5faa6e260 100644 --- a/netbox/vpn/api/serializers_/l2vpn.py +++ b/netbox/vpn/api/serializers_/l2vpn.py @@ -19,6 +19,7 @@ class L2VPNSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='vpn-api:l2vpn-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='vpn:l2vpn-detail') type = ChoiceField(choices=L2VPNTypeChoices, required=False) import_targets = SerializedPKRelatedField( queryset=RouteTarget.objects.all(), @@ -39,14 +40,15 @@ class L2VPNSerializer(NetBoxModelSerializer): class Meta: model = L2VPN fields = [ - 'id', 'url', 'display', 'identifier', 'name', 'slug', 'type', 'import_targets', 'export_targets', - 'description', 'comments', 'tenant', 'tags', 'custom_fields', 'created', 'last_updated' + 'id', 'url', 'display_url', 'display', 'identifier', 'name', 'slug', 'type', 'import_targets', + 'export_targets', 'description', 'comments', 'tenant', 'tags', 'custom_fields', 'created', 'last_updated' ] brief_fields = ('id', 'url', 'display', 'identifier', 'name', 'slug', 'type', 'description') class L2VPNTerminationSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='vpn-api:l2vpntermination-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='vpn:l2vpntermination-detail') l2vpn = L2VPNSerializer( nested=True ) @@ -58,7 +60,7 @@ class L2VPNTerminationSerializer(NetBoxModelSerializer): class Meta: model = L2VPNTermination fields = [ - 'id', 'url', 'display', 'l2vpn', 'assigned_object_type', 'assigned_object_id', + 'id', 'url', 'display_url', 'display', 'l2vpn', 'assigned_object_type', 'assigned_object_id', 'assigned_object', 'tags', 'custom_fields', 'created', 'last_updated' ] brief_fields = ('id', 'url', 'display', 'l2vpn') diff --git a/netbox/vpn/api/serializers_/tunnels.py b/netbox/vpn/api/serializers_/tunnels.py index 7146f964d34..e2fa53459e9 100644 --- a/netbox/vpn/api/serializers_/tunnels.py +++ b/netbox/vpn/api/serializers_/tunnels.py @@ -24,6 +24,7 @@ class TunnelGroupSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='vpn-api:tunnelgroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='vpn:tunnelgroup-detail') # Related object counts tunnel_count = RelatedObjectCountField('tunnels') @@ -31,8 +32,8 @@ class TunnelGroupSerializer(NetBoxModelSerializer): class Meta: model = TunnelGroup fields = [ - 'id', 'url', 'display', 'name', 'slug', 'description', 'tags', 'custom_fields', 'created', 'last_updated', - 'tunnel_count', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'description', 'tags', 'custom_fields', + 'created', 'last_updated', 'tunnel_count', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'tunnel_count') @@ -41,6 +42,9 @@ class TunnelSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField( view_name='vpn-api:tunnel-detail' ) + display_url = serializers.HyperlinkedIdentityField( + view_name='vpn:tunnel-detail' + ) status = ChoiceField( choices=TunnelStatusChoices ) @@ -70,8 +74,9 @@ class TunnelSerializer(NetBoxModelSerializer): class Meta: model = Tunnel fields = ( - 'id', 'url', 'display', 'name', 'status', 'group', 'encapsulation', 'ipsec_profile', 'tenant', 'tunnel_id', - 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'terminations_count', + 'id', 'url', 'display_url', 'display', 'name', 'status', 'group', 'encapsulation', 'ipsec_profile', + 'tenant', 'tunnel_id', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', + 'terminations_count', ) brief_fields = ('id', 'url', 'display', 'name', 'description') @@ -80,6 +85,9 @@ class TunnelTerminationSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField( view_name='vpn-api:tunneltermination-detail' ) + display_url = serializers.HyperlinkedIdentityField( + view_name='vpn:tunneltermination-detail' + ) tunnel = TunnelSerializer( nested=True ) @@ -101,8 +109,8 @@ class TunnelTerminationSerializer(NetBoxModelSerializer): class Meta: model = TunnelTermination fields = ( - 'id', 'url', 'display', 'tunnel', 'role', 'termination_type', 'termination_id', 'termination', 'outside_ip', - 'tags', 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'tunnel', 'role', 'termination_type', 'termination_id', + 'termination', 'outside_ip', 'tags', 'custom_fields', 'created', 'last_updated', ) brief_fields = ('id', 'url', 'display') diff --git a/netbox/wireless/api/nested_serializers.py b/netbox/wireless/api/nested_serializers.py index 53f2a635419..d8ea12fa3db 100644 --- a/netbox/wireless/api/nested_serializers.py +++ b/netbox/wireless/api/nested_serializers.py @@ -16,25 +16,28 @@ ) class NestedWirelessLANGroupSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='wireless-api:wirelesslangroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='wireless:wirelesslangroup-detail') wirelesslan_count = serializers.IntegerField(read_only=True) _depth = serializers.IntegerField(source='level', read_only=True) class Meta: model = WirelessLANGroup - fields = ['id', 'url', 'display', 'name', 'slug', 'wirelesslan_count', '_depth'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'wirelesslan_count', '_depth'] class NestedWirelessLANSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='wireless-api:wirelesslan-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='wireless:wirelesslan-detail') class Meta: model = WirelessLAN - fields = ['id', 'url', 'display', 'ssid'] + fields = ['id', 'url', 'display_url', 'display', 'ssid'] class NestedWirelessLinkSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='wireless-api:wirelesslink-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='wireless:wirelesslink-detail') class Meta: model = WirelessLink - fields = ['id', 'url', 'display', 'ssid'] + fields = ['id', 'url', 'display_url', 'display', 'ssid'] diff --git a/netbox/wireless/api/serializers_/wirelesslans.py b/netbox/wireless/api/serializers_/wirelesslans.py index a47a2d92c12..ff41485c7cb 100644 --- a/netbox/wireless/api/serializers_/wirelesslans.py +++ b/netbox/wireless/api/serializers_/wirelesslans.py @@ -16,20 +16,22 @@ class WirelessLANGroupSerializer(NestedGroupModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='wireless-api:wirelesslangroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='wireless:wirelesslangroup-detail') parent = NestedWirelessLANGroupSerializer(required=False, allow_null=True, default=None) wirelesslan_count = serializers.IntegerField(read_only=True, default=0) class Meta: model = WirelessLANGroup fields = [ - 'id', 'url', 'display', 'name', 'slug', 'parent', 'description', 'tags', 'custom_fields', 'created', - 'last_updated', 'wirelesslan_count', '_depth', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'parent', 'description', 'tags', 'custom_fields', + 'created', 'last_updated', 'wirelesslan_count', '_depth', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'wirelesslan_count', '_depth') class WirelessLANSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='wireless-api:wirelesslan-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='wireless:wirelesslan-detail') group = WirelessLANGroupSerializer(nested=True, required=False, allow_null=True) status = ChoiceField(choices=WirelessLANStatusChoices, required=False, allow_blank=True) vlan = VLANSerializer(nested=True, required=False, allow_null=True) @@ -40,7 +42,8 @@ class WirelessLANSerializer(NetBoxModelSerializer): class Meta: model = WirelessLAN fields = [ - 'id', 'url', 'display', 'ssid', 'description', 'group', 'status', 'vlan', 'tenant', 'auth_type', - 'auth_cipher', 'auth_psk', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'ssid', 'description', 'group', 'status', 'vlan', 'tenant', + 'auth_type', 'auth_cipher', 'auth_psk', 'description', 'comments', 'tags', 'custom_fields', + 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'ssid', 'description') diff --git a/netbox/wireless/api/serializers_/wirelesslinks.py b/netbox/wireless/api/serializers_/wirelesslinks.py index 3a7f8885620..cd9d90b3a88 100644 --- a/netbox/wireless/api/serializers_/wirelesslinks.py +++ b/netbox/wireless/api/serializers_/wirelesslinks.py @@ -15,6 +15,7 @@ class WirelessLinkSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='wireless-api:wirelesslink-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='wireless:wirelesslink-detail') status = ChoiceField(choices=LinkStatusChoices, required=False) interface_a = InterfaceSerializer(nested=True) interface_b = InterfaceSerializer(nested=True) @@ -25,7 +26,8 @@ class WirelessLinkSerializer(NetBoxModelSerializer): class Meta: model = WirelessLink fields = [ - 'id', 'url', 'display', 'interface_a', 'interface_b', 'ssid', 'status', 'tenant', 'auth_type', - 'auth_cipher', 'auth_psk', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'interface_a', 'interface_b', 'ssid', 'status', 'tenant', + 'auth_type', 'auth_cipher', 'auth_psk', 'description', 'comments', 'tags', 'custom_fields', + 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'ssid', 'description') From d888fa30abe332dcf5a49ebb4f96d31e51318aa5 Mon Sep 17 00:00:00 2001 From: Arthur Date: Tue, 4 Jun 2024 14:47:07 -0700 Subject: [PATCH 02/16] 15156 fix view name --- docs/plugins/development/rest-api.md | 4 +- netbox/circuits/api/nested_serializers.py | 12 +-- netbox/circuits/api/serializers_/circuits.py | 8 +- netbox/circuits/api/serializers_/providers.py | 6 +- netbox/core/api/nested_serializers.py | 6 +- netbox/core/api/serializers_/data.py | 4 +- netbox/core/api/serializers_/jobs.py | 2 +- netbox/dcim/api/nested_serializers.py | 84 +++++++++---------- netbox/dcim/api/serializers_/cables.py | 6 +- .../api/serializers_/device_components.py | 22 ++--- netbox/dcim/api/serializers_/devices.py | 6 +- .../api/serializers_/devicetype_components.py | 20 ++--- netbox/dcim/api/serializers_/devicetypes.py | 4 +- netbox/dcim/api/serializers_/manufacturers.py | 2 +- netbox/dcim/api/serializers_/platforms.py | 2 +- netbox/dcim/api/serializers_/power.py | 4 +- netbox/dcim/api/serializers_/racks.py | 6 +- netbox/dcim/api/serializers_/roles.py | 4 +- netbox/dcim/api/serializers_/sites.py | 8 +- .../dcim/api/serializers_/virtualchassis.py | 2 +- netbox/extras/api/nested_serializers.py | 26 +++--- netbox/extras/api/serializers_/attachments.py | 2 +- netbox/extras/api/serializers_/bookmarks.py | 2 +- .../extras/api/serializers_/change_logging.py | 2 +- .../extras/api/serializers_/configcontexts.py | 2 +- .../api/serializers_/configtemplates.py | 2 +- .../extras/api/serializers_/customfields.py | 4 +- netbox/extras/api/serializers_/customlinks.py | 2 +- netbox/extras/api/serializers_/events.py | 4 +- .../api/serializers_/exporttemplates.py | 2 +- netbox/extras/api/serializers_/journaling.py | 2 +- netbox/extras/api/serializers_/objecttypes.py | 2 +- .../extras/api/serializers_/savedfilters.py | 2 +- netbox/extras/api/serializers_/scripts.py | 2 +- netbox/extras/api/serializers_/tags.py | 2 +- netbox/ipam/api/nested_serializers.py | 32 +++---- netbox/ipam/api/serializers_/asns.py | 6 +- netbox/ipam/api/serializers_/fhrpgroups.py | 4 +- netbox/ipam/api/serializers_/ip.py | 8 +- netbox/ipam/api/serializers_/roles.py | 2 +- netbox/ipam/api/serializers_/services.py | 4 +- netbox/ipam/api/serializers_/vlans.py | 4 +- netbox/ipam/api/serializers_/vrfs.py | 4 +- netbox/netbox/api/serializers/nested.py | 4 +- netbox/tenancy/api/nested_serializers.py | 12 +-- netbox/tenancy/api/serializers_/contacts.py | 8 +- netbox/tenancy/api/serializers_/tenants.py | 4 +- netbox/users/api/nested_serializers.py | 8 +- netbox/users/api/serializers_/permissions.py | 2 +- netbox/users/api/serializers_/tokens.py | 2 +- netbox/users/api/serializers_/users.py | 4 +- .../virtualization/api/nested_serializers.py | 12 +-- .../api/serializers_/clusters.py | 6 +- .../api/serializers_/virtualmachines.py | 6 +- netbox/vpn/api/nested_serializers.py | 20 ++--- netbox/vpn/api/serializers_/crypto.py | 10 +-- netbox/vpn/api/serializers_/l2vpn.py | 4 +- netbox/vpn/api/serializers_/tunnels.py | 6 +- netbox/wireless/api/nested_serializers.py | 6 +- .../wireless/api/serializers_/wirelesslans.py | 4 +- .../api/serializers_/wirelesslinks.py | 2 +- 61 files changed, 227 insertions(+), 227 deletions(-) diff --git a/docs/plugins/development/rest-api.md b/docs/plugins/development/rest-api.md index 1563ae1c5f2..d109ff3c562 100644 --- a/docs/plugins/development/rest-api.md +++ b/docs/plugins/development/rest-api.md @@ -40,7 +40,7 @@ class MyModelSerializer(NetBoxModelSerializer): view_name='plugins-api:myplugin-api:mymodel-detail' ) display_url = serializers.HyperlinkedIdentityField( - view_name='plugins:myplugin:mymodel-detail' + view_name='plugins:myplugin:mymodel' ) class Meta: @@ -70,7 +70,7 @@ class NestedMyModelSerializer(WritableNestedSerializer): view_name='plugins-api:myplugin-api:mymodel-detail' ) display_url = serializers.HyperlinkedIdentityField( - view_name='plugins:myplugin:mymodel-detail' + view_name='plugins:myplugin:mymodel' ) class Meta: diff --git a/netbox/circuits/api/nested_serializers.py b/netbox/circuits/api/nested_serializers.py index 37e91105b48..eda79d9a32e 100644 --- a/netbox/circuits/api/nested_serializers.py +++ b/netbox/circuits/api/nested_serializers.py @@ -21,7 +21,7 @@ class NestedProviderNetworkSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:providernetwork-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='circuits:providernetwork-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='circuits:providernetwork') class Meta: model = ProviderNetwork @@ -37,7 +37,7 @@ class Meta: ) class NestedProviderSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:provider-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='circuits:provider-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='circuits:provider') circuit_count = RelatedObjectCountField('circuits') class Meta: @@ -51,7 +51,7 @@ class Meta: class NestedProviderAccountSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:provideraccount-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='circuits:provideraccount-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='circuits:provideraccount') class Meta: model = ProviderAccount @@ -67,7 +67,7 @@ class Meta: ) class NestedCircuitTypeSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittype-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='circuits:circuittype-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='circuits:circuittype') circuit_count = RelatedObjectCountField('circuits') class Meta: @@ -77,7 +77,7 @@ class Meta: class NestedCircuitSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuit-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='circuits:circuit-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='circuits:circuit') class Meta: model = Circuit @@ -86,7 +86,7 @@ class Meta: class NestedCircuitTerminationSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittermination-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='circuits:circuittermination-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='circuits:circuittermination') circuit = NestedCircuitSerializer() class Meta: diff --git a/netbox/circuits/api/serializers_/circuits.py b/netbox/circuits/api/serializers_/circuits.py index d431416a5df..220425ecd68 100644 --- a/netbox/circuits/api/serializers_/circuits.py +++ b/netbox/circuits/api/serializers_/circuits.py @@ -19,7 +19,7 @@ class CircuitTypeSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittype-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='circuits:circuittype-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='circuits:circuittype') # Related object counts circuit_count = RelatedObjectCountField('circuits') @@ -35,7 +35,7 @@ class Meta: class CircuitCircuitTerminationSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittermination-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='circuits:circuittermination-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='circuits:circuittermination') site = SiteSerializer(nested=True, allow_null=True) provider_network = ProviderNetworkSerializer(nested=True, allow_null=True) @@ -49,7 +49,7 @@ class Meta: class CircuitSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuit-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='circuits:circuit-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='circuits:circuit') provider = ProviderSerializer(nested=True) provider_account = ProviderAccountSerializer(nested=True, required=False, allow_null=True, default=None) status = ChoiceField(choices=CircuitStatusChoices, required=False) @@ -70,7 +70,7 @@ class Meta: class CircuitTerminationSerializer(NetBoxModelSerializer, CabledObjectSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittermination-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='circuits:circuittermination-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='circuits:circuittermination') circuit = CircuitSerializer(nested=True) site = SiteSerializer(nested=True, required=False, allow_null=True) provider_network = ProviderNetworkSerializer(nested=True, required=False, allow_null=True) diff --git a/netbox/circuits/api/serializers_/providers.py b/netbox/circuits/api/serializers_/providers.py index 6e9eee1f01b..02c74ecf3a5 100644 --- a/netbox/circuits/api/serializers_/providers.py +++ b/netbox/circuits/api/serializers_/providers.py @@ -16,7 +16,7 @@ class ProviderSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:provider-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='circuits:provider-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='circuits:provider') accounts = SerializedPKRelatedField( queryset=ProviderAccount.objects.all(), serializer=NestedProviderAccountSerializer, @@ -45,7 +45,7 @@ class Meta: class ProviderAccountSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:provideraccount-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='circuits:provideraccount-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='circuits:provideraccount') provider = ProviderSerializer(nested=True) name = serializers.CharField(allow_blank=True, max_length=100, required=False, default='') @@ -60,7 +60,7 @@ class Meta: class ProviderNetworkSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:providernetwork-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='circuits:providernetwork-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='circuits:providernetwork') provider = ProviderSerializer(nested=True) class Meta: diff --git a/netbox/core/api/nested_serializers.py b/netbox/core/api/nested_serializers.py index 28a8b1e70a2..b5f249435a4 100644 --- a/netbox/core/api/nested_serializers.py +++ b/netbox/core/api/nested_serializers.py @@ -15,7 +15,7 @@ class NestedDataSourceSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='core-api:datasource-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='core:datasource-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='core:datasource') class Meta: model = DataSource @@ -24,7 +24,7 @@ class Meta: class NestedDataFileSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='core-api:datafile-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='core:datafile-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='core:datafile') class Meta: model = DataFile @@ -33,7 +33,7 @@ class Meta: class NestedJobSerializer(serializers.ModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='core-api:job-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='core:job-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='core:job') status = ChoiceField(choices=JobStatusChoices) user = UserSerializer( nested=True, diff --git a/netbox/core/api/serializers_/data.py b/netbox/core/api/serializers_/data.py index 0832a06e111..faf22c79a59 100644 --- a/netbox/core/api/serializers_/data.py +++ b/netbox/core/api/serializers_/data.py @@ -17,7 +17,7 @@ class DataSourceSerializer(NetBoxModelSerializer): view_name='core-api:datasource-detail' ) display_url = serializers.HyperlinkedIdentityField( - view_name='core:datasource-detail' + view_name='core:datasource' ) type = ChoiceField( choices=get_data_backend_choices() @@ -44,7 +44,7 @@ class DataFileSerializer(NetBoxModelSerializer): view_name='core-api:datafile-detail' ) display_url = serializers.HyperlinkedIdentityField( - view_name='core:datafile-detail' + view_name='core:datafile' ) source = DataSourceSerializer( nested=True, diff --git a/netbox/core/api/serializers_/jobs.py b/netbox/core/api/serializers_/jobs.py index 2edf6094924..8635e74df16 100644 --- a/netbox/core/api/serializers_/jobs.py +++ b/netbox/core/api/serializers_/jobs.py @@ -13,7 +13,7 @@ class JobSerializer(BaseModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='core-api:job-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='core:job-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='core:job') user = UserSerializer( nested=True, read_only=True diff --git a/netbox/dcim/api/nested_serializers.py b/netbox/dcim/api/nested_serializers.py index a59316be8df..89e05fd08d1 100644 --- a/netbox/dcim/api/nested_serializers.py +++ b/netbox/dcim/api/nested_serializers.py @@ -58,7 +58,7 @@ ) class NestedRegionSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:region-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:region-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:region') site_count = serializers.IntegerField(read_only=True) _depth = serializers.IntegerField(source='level', read_only=True) @@ -72,7 +72,7 @@ class Meta: ) class NestedSiteGroupSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:sitegroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:sitegroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:sitegroup') site_count = serializers.IntegerField(read_only=True) _depth = serializers.IntegerField(source='level', read_only=True) @@ -83,7 +83,7 @@ class Meta: class NestedSiteSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:site-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:site-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:site') class Meta: model = models.Site @@ -99,7 +99,7 @@ class Meta: ) class NestedLocationSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:location-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:location-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:location') rack_count = serializers.IntegerField(read_only=True) _depth = serializers.IntegerField(source='level', read_only=True) @@ -113,7 +113,7 @@ class Meta: ) class NestedRackRoleSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackrole-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rackrole-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rackrole') rack_count = RelatedObjectCountField('racks') class Meta: @@ -126,7 +126,7 @@ class Meta: ) class NestedRackSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rack-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rack-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rack') device_count = RelatedObjectCountField('devices') class Meta: @@ -136,7 +136,7 @@ class Meta: class NestedRackReservationSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackreservation-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rackreservation-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rackreservation') user = serializers.SerializerMethodField(read_only=True) class Meta: @@ -156,7 +156,7 @@ def get_user(self, obj): ) class NestedManufacturerSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:manufacturer-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:manufacturer-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:manufacturer') devicetype_count = RelatedObjectCountField('device_types') class Meta: @@ -169,7 +169,7 @@ class Meta: ) class NestedDeviceTypeSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicetype-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:devicetype-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:devicetype') manufacturer = NestedManufacturerSerializer(read_only=True) device_count = RelatedObjectCountField('instances') @@ -180,7 +180,7 @@ class Meta: class NestedModuleTypeSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:moduletype-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:moduletype-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:moduletype') manufacturer = NestedManufacturerSerializer(read_only=True) class Meta: @@ -194,7 +194,7 @@ class Meta: class NestedConsolePortTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleporttemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:consoleporttemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:consoleporttemplate') class Meta: model = models.ConsolePortTemplate @@ -203,7 +203,7 @@ class Meta: class NestedConsoleServerPortTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleserverporttemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:consoleserverporttemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:consoleserverporttemplate') class Meta: model = models.ConsoleServerPortTemplate @@ -212,7 +212,7 @@ class Meta: class NestedPowerPortTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerporttemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:powerporttemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:powerporttemplate') class Meta: model = models.PowerPortTemplate @@ -221,7 +221,7 @@ class Meta: class NestedPowerOutletTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:poweroutlettemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:poweroutlettemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:poweroutlettemplate') class Meta: model = models.PowerOutletTemplate @@ -230,7 +230,7 @@ class Meta: class NestedInterfaceTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:interfacetemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:interfacetemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:interfacetemplate') class Meta: model = models.InterfaceTemplate @@ -239,7 +239,7 @@ class Meta: class NestedRearPortTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearporttemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rearporttemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rearporttemplate') class Meta: model = models.RearPortTemplate @@ -248,7 +248,7 @@ class Meta: class NestedFrontPortTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:frontporttemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:frontporttemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:frontporttemplate') class Meta: model = models.FrontPortTemplate @@ -257,7 +257,7 @@ class Meta: class NestedModuleBayTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:modulebaytemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:modulebaytemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:modulebaytemplate') class Meta: model = models.ModuleBayTemplate @@ -266,7 +266,7 @@ class Meta: class NestedDeviceBayTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicebaytemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:devicebaytemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:devicebaytemplate') class Meta: model = models.DeviceBayTemplate @@ -275,7 +275,7 @@ class Meta: class NestedInventoryItemTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitemtemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:inventoryitemtemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:inventoryitemtemplate') _depth = serializers.IntegerField(source='level', read_only=True) class Meta: @@ -292,7 +292,7 @@ class Meta: ) class NestedDeviceRoleSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicerole-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:devicerole-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:devicerole') device_count = RelatedObjectCountField('devices') virtualmachine_count = RelatedObjectCountField('virtual_machines') @@ -306,7 +306,7 @@ class Meta: ) class NestedPlatformSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:platform-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:platform-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:platform') device_count = RelatedObjectCountField('devices') virtualmachine_count = RelatedObjectCountField('virtual_machines') @@ -317,7 +317,7 @@ class Meta: class NestedDeviceSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:device-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:device-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:device') class Meta: model = models.Device @@ -326,7 +326,7 @@ class Meta: class ModuleNestedModuleBaySerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:modulebay-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:modulebay-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:modulebay') class Meta: model = models.ModuleBay @@ -335,7 +335,7 @@ class Meta: class ModuleBayNestedModuleSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:module-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:module-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:module') class Meta: model = models.Module @@ -344,7 +344,7 @@ class Meta: class NestedModuleSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:module-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:module-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:module') device = NestedDeviceSerializer(read_only=True) module_bay = ModuleNestedModuleBaySerializer(read_only=True) module_type = NestedModuleTypeSerializer(read_only=True) @@ -356,7 +356,7 @@ class Meta: class NestedConsoleServerPortSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleserverport-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:consoleserverport-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:consoleserverport') device = NestedDeviceSerializer(read_only=True) _occupied = serializers.BooleanField(required=False, read_only=True) @@ -367,7 +367,7 @@ class Meta: class NestedConsolePortSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleport-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:consoleport-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:consoleport') device = NestedDeviceSerializer(read_only=True) _occupied = serializers.BooleanField(required=False, read_only=True) @@ -378,7 +378,7 @@ class Meta: class NestedPowerOutletSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:poweroutlet-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:poweroutlet-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:poweroutlet') device = NestedDeviceSerializer(read_only=True) _occupied = serializers.BooleanField(required=False, read_only=True) @@ -389,7 +389,7 @@ class Meta: class NestedPowerPortSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerport-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:powerport-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:powerport') device = NestedDeviceSerializer(read_only=True) _occupied = serializers.BooleanField(required=False, read_only=True) @@ -401,7 +401,7 @@ class Meta: class NestedInterfaceSerializer(WritableNestedSerializer): device = NestedDeviceSerializer(read_only=True) url = serializers.HyperlinkedIdentityField(view_name='dcim-api:interface-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:interface-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:interface') _occupied = serializers.BooleanField(required=False, read_only=True) class Meta: @@ -412,7 +412,7 @@ class Meta: class NestedRearPortSerializer(WritableNestedSerializer): device = NestedDeviceSerializer(read_only=True) url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearport-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rearport-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rearport') _occupied = serializers.BooleanField(required=False, read_only=True) class Meta: @@ -423,7 +423,7 @@ class Meta: class NestedFrontPortSerializer(WritableNestedSerializer): device = NestedDeviceSerializer(read_only=True) url = serializers.HyperlinkedIdentityField(view_name='dcim-api:frontport-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:frontport-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:frontport') _occupied = serializers.BooleanField(required=False, read_only=True) class Meta: @@ -433,7 +433,7 @@ class Meta: class NestedModuleBaySerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:modulebay-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:modulebay-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:modulebay') installed_module = ModuleBayNestedModuleSerializer(required=False, allow_null=True) class Meta: @@ -443,7 +443,7 @@ class Meta: class NestedDeviceBaySerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicebay-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:devicebay-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:devicebay') device = NestedDeviceSerializer(read_only=True) class Meta: @@ -453,7 +453,7 @@ class Meta: class NestedInventoryItemSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitem-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:inventoryitem-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:inventoryitem') device = NestedDeviceSerializer(read_only=True) _depth = serializers.IntegerField(source='level', read_only=True) @@ -467,7 +467,7 @@ class Meta: ) class NestedInventoryItemRoleSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitemrole-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:inventoryitemrole-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:inventoryitemrole') inventoryitem_count = RelatedObjectCountField('inventory_items') class Meta: @@ -481,7 +481,7 @@ class Meta: class NestedCableSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:cable-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:cable-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:cable') class Meta: model = models.Cable @@ -497,7 +497,7 @@ class Meta: ) class NestedVirtualChassisSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:virtualchassis-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:virtualchassis-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:virtualchassis') master = NestedDeviceSerializer() member_count = serializers.IntegerField(read_only=True) @@ -515,7 +515,7 @@ class Meta: ) class NestedPowerPanelSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerpanel-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:powerpanel-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:powerpanel') powerfeed_count = RelatedObjectCountField('powerfeeds') class Meta: @@ -525,7 +525,7 @@ class Meta: class NestedPowerFeedSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerfeed-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:powerfeed-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:powerfeed') _occupied = serializers.BooleanField(required=False, read_only=True) class Meta: @@ -535,7 +535,7 @@ class Meta: class NestedVirtualDeviceContextSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:virtualdevicecontext-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:virtualdevicecontext-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:virtualdevicecontext') device = NestedDeviceSerializer() class Meta: diff --git a/netbox/dcim/api/serializers_/cables.py b/netbox/dcim/api/serializers_/cables.py index bd408aa66d1..e1e69a8fa23 100644 --- a/netbox/dcim/api/serializers_/cables.py +++ b/netbox/dcim/api/serializers_/cables.py @@ -22,7 +22,7 @@ class CableSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:cable-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:cable-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:cable') a_terminations = GenericObjectSerializer(many=True, required=False) b_terminations = GenericObjectSerializer(many=True, required=False) status = ChoiceField(choices=LinkStatusChoices, required=False) @@ -44,7 +44,7 @@ class TracedCableSerializer(serializers.ModelSerializer): Used only while tracing a cable path. """ url = serializers.HyperlinkedIdentityField(view_name='dcim-api:cable-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:cable-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:cable') class Meta: model = Cable @@ -55,7 +55,7 @@ class Meta: class CableTerminationSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:cabletermination-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:cabletermination-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:cabletermination') termination_type = ContentTypeField( queryset=ContentType.objects.filter(CABLE_TERMINATION_MODELS) ) diff --git a/netbox/dcim/api/serializers_/device_components.py b/netbox/dcim/api/serializers_/device_components.py index 11d2a362a11..0a842960b43 100644 --- a/netbox/dcim/api/serializers_/device_components.py +++ b/netbox/dcim/api/serializers_/device_components.py @@ -42,7 +42,7 @@ class ConsoleServerPortSerializer(NetBoxModelSerializer, CabledObjectSerializer, ConnectedEndpointsSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleserverport-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:consoleserverport-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:consoleserverport') device = DeviceSerializer(nested=True) module = ModuleSerializer( nested=True, @@ -74,7 +74,7 @@ class Meta: class ConsolePortSerializer(NetBoxModelSerializer, CabledObjectSerializer, ConnectedEndpointsSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleport-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:consoleport-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:consoleport') device = DeviceSerializer(nested=True) module = ModuleSerializer( nested=True, @@ -106,7 +106,7 @@ class Meta: class PowerPortSerializer(NetBoxModelSerializer, CabledObjectSerializer, ConnectedEndpointsSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerport-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:powerport-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:powerport') device = DeviceSerializer(nested=True) module = ModuleSerializer( nested=True, @@ -134,7 +134,7 @@ class Meta: class PowerOutletSerializer(NetBoxModelSerializer, CabledObjectSerializer, ConnectedEndpointsSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:poweroutlet-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:poweroutlet-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:poweroutlet') device = DeviceSerializer(nested=True) module = ModuleSerializer( nested=True, @@ -173,7 +173,7 @@ class Meta: class InterfaceSerializer(NetBoxModelSerializer, CabledObjectSerializer, ConnectedEndpointsSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:interface-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:interface-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:interface') device = DeviceSerializer(nested=True) vdcs = SerializedPKRelatedField( queryset=VirtualDeviceContext.objects.all(), @@ -256,7 +256,7 @@ def validate(self, data): class RearPortSerializer(NetBoxModelSerializer, CabledObjectSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearport-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rearport-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rearport') device = DeviceSerializer(nested=True) module = ModuleSerializer( nested=True, @@ -281,7 +281,7 @@ class FrontPortRearPortSerializer(WritableNestedSerializer): NestedRearPortSerializer but with parent device omitted (since front and rear ports must belong to same device) """ url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearport-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rearport-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rearport') class Meta: model = RearPort @@ -290,7 +290,7 @@ class Meta: class FrontPortSerializer(NetBoxModelSerializer, CabledObjectSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:frontport-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:frontport-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:frontport') device = DeviceSerializer(nested=True) module = ModuleSerializer( nested=True, @@ -313,7 +313,7 @@ class Meta: class ModuleBaySerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:modulebay-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:modulebay-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:modulebay') device = DeviceSerializer(nested=True) installed_module = ModuleSerializer( nested=True, @@ -333,7 +333,7 @@ class Meta: class DeviceBaySerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicebay-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:devicebay-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:devicebay') device = DeviceSerializer(nested=True) installed_device = DeviceSerializer(nested=True, required=False, allow_null=True) @@ -348,7 +348,7 @@ class Meta: class InventoryItemSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitem-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:inventoryitem-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:inventoryitem') device = DeviceSerializer(nested=True) parent = serializers.PrimaryKeyRelatedField(queryset=InventoryItem.objects.all(), allow_null=True, default=None) role = InventoryItemRoleSerializer(nested=True, required=False, allow_null=True) diff --git a/netbox/dcim/api/serializers_/devices.py b/netbox/dcim/api/serializers_/devices.py index c3e46fbbda8..730b4e60ccf 100644 --- a/netbox/dcim/api/serializers_/devices.py +++ b/netbox/dcim/api/serializers_/devices.py @@ -30,7 +30,7 @@ class DeviceSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:device-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:device-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:device') device_type = DeviceTypeSerializer(nested=True) role = DeviceRoleSerializer(nested=True) tenant = TenantSerializer( @@ -122,7 +122,7 @@ def get_config_context(self, obj): class VirtualDeviceContextSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:virtualdevicecontext-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:virtualdevicecontext-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:virtualdevicecontext') device = DeviceSerializer(nested=True) identifier = serializers.IntegerField(allow_null=True, max_value=32767, min_value=0, required=False, default=None) tenant = TenantSerializer(nested=True, required=False, allow_null=True, default=None) @@ -146,7 +146,7 @@ class Meta: class ModuleSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:module-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:module-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:module') device = DeviceSerializer(nested=True) module_bay = NestedModuleBaySerializer() module_type = ModuleTypeSerializer(nested=True) diff --git a/netbox/dcim/api/serializers_/devicetype_components.py b/netbox/dcim/api/serializers_/devicetype_components.py index 72fe8862214..813cd872ff8 100644 --- a/netbox/dcim/api/serializers_/devicetype_components.py +++ b/netbox/dcim/api/serializers_/devicetype_components.py @@ -33,7 +33,7 @@ class ConsolePortTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleporttemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:consoleporttemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:consoleporttemplate') device_type = DeviceTypeSerializer( nested=True, required=False, @@ -63,7 +63,7 @@ class Meta: class ConsoleServerPortTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleserverporttemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:consoleserverporttemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:consoleserverporttemplate') device_type = DeviceTypeSerializer( nested=True, required=False, @@ -93,7 +93,7 @@ class Meta: class PowerPortTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerporttemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:powerporttemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:powerporttemplate') device_type = DeviceTypeSerializer( nested=True, required=False, @@ -124,7 +124,7 @@ class Meta: class PowerOutletTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:poweroutlettemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:poweroutlettemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:poweroutlettemplate') device_type = DeviceTypeSerializer( nested=True, required=False, @@ -166,7 +166,7 @@ class Meta: class InterfaceTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:interfacetemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:interfacetemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:interfacetemplate') device_type = DeviceTypeSerializer( nested=True, required=False, @@ -214,7 +214,7 @@ class Meta: class RearPortTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearporttemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rearporttemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rearporttemplate') device_type = DeviceTypeSerializer( required=False, nested=True, @@ -240,7 +240,7 @@ class Meta: class FrontPortTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:frontporttemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:frontporttemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:frontporttemplate') device_type = DeviceTypeSerializer( nested=True, required=False, @@ -267,7 +267,7 @@ class Meta: class ModuleBayTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:modulebaytemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:modulebaytemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:modulebaytemplate') device_type = DeviceTypeSerializer( nested=True ) @@ -283,7 +283,7 @@ class Meta: class DeviceBayTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicebaytemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:devicebaytemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:devicebaytemplate') device_type = DeviceTypeSerializer( nested=True ) @@ -299,7 +299,7 @@ class Meta: class InventoryItemTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitemtemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:inventoryitemtemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:inventoryitemtemplate') device_type = DeviceTypeSerializer( nested=True ) diff --git a/netbox/dcim/api/serializers_/devicetypes.py b/netbox/dcim/api/serializers_/devicetypes.py index 1b685b3681e..cfe5a19fd4f 100644 --- a/netbox/dcim/api/serializers_/devicetypes.py +++ b/netbox/dcim/api/serializers_/devicetypes.py @@ -18,7 +18,7 @@ class DeviceTypeSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicetype-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:devicetype-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:devicetype') manufacturer = ManufacturerSerializer(nested=True) default_platform = PlatformSerializer(nested=True, required=False, allow_null=True) u_height = serializers.DecimalField( @@ -65,7 +65,7 @@ class Meta: class ModuleTypeSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:moduletype-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:moduletype-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:moduletype') manufacturer = ManufacturerSerializer(nested=True) weight_unit = ChoiceField(choices=WeightUnitChoices, allow_blank=True, required=False, allow_null=True) diff --git a/netbox/dcim/api/serializers_/manufacturers.py b/netbox/dcim/api/serializers_/manufacturers.py index 814c0517700..671222f27c3 100644 --- a/netbox/dcim/api/serializers_/manufacturers.py +++ b/netbox/dcim/api/serializers_/manufacturers.py @@ -11,7 +11,7 @@ class ManufacturerSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:manufacturer-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:manufacturer-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:manufacturer') # Related object counts devicetype_count = RelatedObjectCountField('device_types') diff --git a/netbox/dcim/api/serializers_/platforms.py b/netbox/dcim/api/serializers_/platforms.py index 3de1e88f735..e61520b63f0 100644 --- a/netbox/dcim/api/serializers_/platforms.py +++ b/netbox/dcim/api/serializers_/platforms.py @@ -13,7 +13,7 @@ class PlatformSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:platform-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:platform-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:platform') manufacturer = ManufacturerSerializer(nested=True, required=False, allow_null=True) config_template = ConfigTemplateSerializer(nested=True, required=False, allow_null=True, default=None) diff --git a/netbox/dcim/api/serializers_/power.py b/netbox/dcim/api/serializers_/power.py index a83dda0e4b7..601d52348bc 100644 --- a/netbox/dcim/api/serializers_/power.py +++ b/netbox/dcim/api/serializers_/power.py @@ -18,7 +18,7 @@ class PowerPanelSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerpanel-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:powerpanel-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:powerpanel') site = SiteSerializer(nested=True) location = LocationSerializer( nested=True, @@ -41,7 +41,7 @@ class Meta: class PowerFeedSerializer(NetBoxModelSerializer, CabledObjectSerializer, ConnectedEndpointsSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerfeed-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:powerfeed-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:powerfeed') power_panel = PowerPanelSerializer(nested=True) rack = RackSerializer( nested=True, diff --git a/netbox/dcim/api/serializers_/racks.py b/netbox/dcim/api/serializers_/racks.py index 2483208d175..6c741918c91 100644 --- a/netbox/dcim/api/serializers_/racks.py +++ b/netbox/dcim/api/serializers_/racks.py @@ -21,7 +21,7 @@ class RackRoleSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackrole-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rackrole-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rackrole') # Related object counts rack_count = RelatedObjectCountField('racks') @@ -37,7 +37,7 @@ class Meta: class RackSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rack-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rack-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rack') site = SiteSerializer(nested=True) location = LocationSerializer(nested=True, required=False, allow_null=True, default=None) tenant = TenantSerializer(nested=True, required=False, allow_null=True) @@ -67,7 +67,7 @@ class Meta: class RackReservationSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackreservation-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rackreservation-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rackreservation') rack = RackSerializer(nested=True) user = UserSerializer(nested=True) tenant = TenantSerializer(nested=True, required=False, allow_null=True) diff --git a/netbox/dcim/api/serializers_/roles.py b/netbox/dcim/api/serializers_/roles.py index fbb2799a60e..aec7f334675 100644 --- a/netbox/dcim/api/serializers_/roles.py +++ b/netbox/dcim/api/serializers_/roles.py @@ -13,7 +13,7 @@ class DeviceRoleSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicerole-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:devicerole-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:devicerole') config_template = ConfigTemplateSerializer(nested=True, required=False, allow_null=True, default=None) # Related object counts @@ -31,7 +31,7 @@ class Meta: class InventoryItemRoleSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitemrole-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:inventoryitemrole-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:inventoryitemrole') # Related object counts inventoryitem_count = RelatedObjectCountField('inventory_items') diff --git a/netbox/dcim/api/serializers_/sites.py b/netbox/dcim/api/serializers_/sites.py index 4e23b1a097a..4cc255cd4f7 100644 --- a/netbox/dcim/api/serializers_/sites.py +++ b/netbox/dcim/api/serializers_/sites.py @@ -20,7 +20,7 @@ class RegionSerializer(NestedGroupModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:region-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:region-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:region') parent = NestedRegionSerializer(required=False, allow_null=True, default=None) site_count = serializers.IntegerField(read_only=True, default=0) @@ -35,7 +35,7 @@ class Meta: class SiteGroupSerializer(NestedGroupModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:sitegroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:sitegroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:sitegroup') parent = NestedSiteGroupSerializer(required=False, allow_null=True, default=None) site_count = serializers.IntegerField(read_only=True, default=0) @@ -50,7 +50,7 @@ class Meta: class SiteSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:site-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:site-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:site') status = ChoiceField(choices=SiteStatusChoices, required=False) region = RegionSerializer(nested=True, required=False, allow_null=True) group = SiteGroupSerializer(nested=True, required=False, allow_null=True) @@ -85,7 +85,7 @@ class Meta: class LocationSerializer(NestedGroupModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:location-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:location-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:location') site = SiteSerializer(nested=True) parent = NestedLocationSerializer(required=False, allow_null=True, default=None) status = ChoiceField(choices=LocationStatusChoices, required=False) diff --git a/netbox/dcim/api/serializers_/virtualchassis.py b/netbox/dcim/api/serializers_/virtualchassis.py index a033bc0abf8..67e3b0f12df 100644 --- a/netbox/dcim/api/serializers_/virtualchassis.py +++ b/netbox/dcim/api/serializers_/virtualchassis.py @@ -11,7 +11,7 @@ class VirtualChassisSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:virtualchassis-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:virtualchassis-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='dcim:virtualchassis') master = NestedDeviceSerializer(required=False, allow_null=True, default=None) members = NestedDeviceSerializer(many=True, read_only=True) diff --git a/netbox/extras/api/nested_serializers.py b/netbox/extras/api/nested_serializers.py index 17901c73cd9..b50175bc3b4 100644 --- a/netbox/extras/api/nested_serializers.py +++ b/netbox/extras/api/nested_serializers.py @@ -23,7 +23,7 @@ class NestedEventRuleSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:eventrule-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:eventrule-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:eventrule') class Meta: model = models.EventRule @@ -32,7 +32,7 @@ class Meta: class NestedWebhookSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:webhook-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:webhook-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:webhook') class Meta: model = models.Webhook @@ -41,7 +41,7 @@ class Meta: class NestedCustomFieldSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:customfield-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:customfield-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:customfield') class Meta: model = models.CustomField @@ -50,7 +50,7 @@ class Meta: class NestedCustomFieldChoiceSetSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:customfieldchoiceset-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:customfieldchoiceset-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:customfieldchoiceset') class Meta: model = models.CustomFieldChoiceSet @@ -59,7 +59,7 @@ class Meta: class NestedCustomLinkSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:customlink-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:customlink-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:customlink') class Meta: model = models.CustomLink @@ -68,7 +68,7 @@ class Meta: class NestedConfigContextSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:configcontext-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:configcontext-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:configcontext') class Meta: model = models.ConfigContext @@ -77,7 +77,7 @@ class Meta: class NestedConfigTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:configtemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:configtemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:configtemplate') class Meta: model = models.ConfigTemplate @@ -86,7 +86,7 @@ class Meta: class NestedExportTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:exporttemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:exporttemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:exporttemplate') class Meta: model = models.ExportTemplate @@ -95,7 +95,7 @@ class Meta: class NestedSavedFilterSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:savedfilter-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:savedfilter-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:savedfilter') class Meta: model = models.SavedFilter @@ -104,7 +104,7 @@ class Meta: class NestedBookmarkSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:bookmark-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:bookmark-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:bookmark') class Meta: model = models.Bookmark @@ -113,7 +113,7 @@ class Meta: class NestedImageAttachmentSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:imageattachment-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:imageattachment-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:imageattachment') class Meta: model = models.ImageAttachment @@ -122,7 +122,7 @@ class Meta: class NestedJournalEntrySerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:journalentry-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:journalentry-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:journalentry') class Meta: model = models.JournalEntry @@ -136,7 +136,7 @@ class NestedScriptSerializer(WritableNestedSerializer): lookup_url_kwarg='pk' ) display_url = serializers.HyperlinkedIdentityField( - view_name='extras:script-detail', + view_name='extras:script', lookup_field='full_name', lookup_url_kwarg='pk' ) diff --git a/netbox/extras/api/serializers_/attachments.py b/netbox/extras/api/serializers_/attachments.py index adb8d6f1ed6..646ec3255d1 100644 --- a/netbox/extras/api/serializers_/attachments.py +++ b/netbox/extras/api/serializers_/attachments.py @@ -15,7 +15,7 @@ class ImageAttachmentSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:imageattachment-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:imageattachment-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:imageattachment') object_type = ContentTypeField( queryset=ObjectType.objects.all() ) diff --git a/netbox/extras/api/serializers_/bookmarks.py b/netbox/extras/api/serializers_/bookmarks.py index 0b85a68cd33..244735833d4 100644 --- a/netbox/extras/api/serializers_/bookmarks.py +++ b/netbox/extras/api/serializers_/bookmarks.py @@ -15,7 +15,7 @@ class BookmarkSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:bookmark-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:bookmark-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:bookmark') object_type = ContentTypeField( queryset=ObjectType.objects.with_feature('bookmarks'), ) diff --git a/netbox/extras/api/serializers_/change_logging.py b/netbox/extras/api/serializers_/change_logging.py index e312a866ae7..dc02e4a5a5e 100644 --- a/netbox/extras/api/serializers_/change_logging.py +++ b/netbox/extras/api/serializers_/change_logging.py @@ -16,7 +16,7 @@ class ObjectChangeSerializer(BaseModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:objectchange-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:objectchange-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:objectchange') user = UserSerializer( nested=True, read_only=True diff --git a/netbox/extras/api/serializers_/configcontexts.py b/netbox/extras/api/serializers_/configcontexts.py index 7473301406b..e18a8b60571 100644 --- a/netbox/extras/api/serializers_/configcontexts.py +++ b/netbox/extras/api/serializers_/configcontexts.py @@ -21,7 +21,7 @@ class ConfigContextSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:configcontext-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:configcontext-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:configcontext') regions = SerializedPKRelatedField( queryset=Region.objects.all(), serializer=RegionSerializer, diff --git a/netbox/extras/api/serializers_/configtemplates.py b/netbox/extras/api/serializers_/configtemplates.py index fd8ef8c0280..c6c2778523f 100644 --- a/netbox/extras/api/serializers_/configtemplates.py +++ b/netbox/extras/api/serializers_/configtemplates.py @@ -12,7 +12,7 @@ class ConfigTemplateSerializer(TaggableModelSerializer, ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:configtemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:configtemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:configtemplate') data_source = DataSourceSerializer( nested=True, required=False diff --git a/netbox/extras/api/serializers_/customfields.py b/netbox/extras/api/serializers_/customfields.py index a765faf4be9..d2f0af17547 100644 --- a/netbox/extras/api/serializers_/customfields.py +++ b/netbox/extras/api/serializers_/customfields.py @@ -17,7 +17,7 @@ class CustomFieldChoiceSetSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:customfieldchoiceset-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:customfieldchoiceset-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:customfieldchoiceset') base_choices = ChoiceField( choices=CustomFieldChoiceSetBaseChoices, required=False @@ -40,7 +40,7 @@ class Meta: class CustomFieldSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:customfield-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:customfield-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:customfield') object_types = ContentTypeField( queryset=ObjectType.objects.with_feature('custom_fields'), many=True diff --git a/netbox/extras/api/serializers_/customlinks.py b/netbox/extras/api/serializers_/customlinks.py index 9ee321f6570..f1728dc4ca0 100644 --- a/netbox/extras/api/serializers_/customlinks.py +++ b/netbox/extras/api/serializers_/customlinks.py @@ -12,7 +12,7 @@ class CustomLinkSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:customlink-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:customlink-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:customlink') object_types = ContentTypeField( queryset=ObjectType.objects.with_feature('custom_links'), many=True diff --git a/netbox/extras/api/serializers_/events.py b/netbox/extras/api/serializers_/events.py index 7fd2cf3e148..e15b02afa06 100644 --- a/netbox/extras/api/serializers_/events.py +++ b/netbox/extras/api/serializers_/events.py @@ -22,7 +22,7 @@ class EventRuleSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:eventrule-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:eventrule-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:eventrule') object_types = ContentTypeField( queryset=ObjectType.objects.with_feature('event_rules'), many=True @@ -60,7 +60,7 @@ def get_action_object(self, instance): class WebhookSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:webhook-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:webhook-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:webhook') class Meta: model = Webhook diff --git a/netbox/extras/api/serializers_/exporttemplates.py b/netbox/extras/api/serializers_/exporttemplates.py index e5b7b47374b..a9d1db10bbf 100644 --- a/netbox/extras/api/serializers_/exporttemplates.py +++ b/netbox/extras/api/serializers_/exporttemplates.py @@ -13,7 +13,7 @@ class ExportTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:exporttemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:exporttemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:exporttemplate') object_types = ContentTypeField( queryset=ObjectType.objects.with_feature('export_templates'), many=True diff --git a/netbox/extras/api/serializers_/journaling.py b/netbox/extras/api/serializers_/journaling.py index 2a31dccc334..721b918faef 100644 --- a/netbox/extras/api/serializers_/journaling.py +++ b/netbox/extras/api/serializers_/journaling.py @@ -17,7 +17,7 @@ class JournalEntrySerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:journalentry-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:journalentry-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:journalentry') assigned_object_type = ContentTypeField( queryset=ObjectType.objects.all() ) diff --git a/netbox/extras/api/serializers_/objecttypes.py b/netbox/extras/api/serializers_/objecttypes.py index 7587901cd64..aea4807930d 100644 --- a/netbox/extras/api/serializers_/objecttypes.py +++ b/netbox/extras/api/serializers_/objecttypes.py @@ -10,7 +10,7 @@ class ObjectTypeSerializer(BaseModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:objecttype-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:objecttype-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:objecttype') class Meta: model = ObjectType diff --git a/netbox/extras/api/serializers_/savedfilters.py b/netbox/extras/api/serializers_/savedfilters.py index 7358a76d6b0..8222ab27542 100644 --- a/netbox/extras/api/serializers_/savedfilters.py +++ b/netbox/extras/api/serializers_/savedfilters.py @@ -12,7 +12,7 @@ class SavedFilterSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:savedfilter-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:savedfilter-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:savedfilter') object_types = ContentTypeField( queryset=ObjectType.objects.all(), many=True diff --git a/netbox/extras/api/serializers_/scripts.py b/netbox/extras/api/serializers_/scripts.py index f5f9947b3bc..77dddc45f6b 100644 --- a/netbox/extras/api/serializers_/scripts.py +++ b/netbox/extras/api/serializers_/scripts.py @@ -15,7 +15,7 @@ class ScriptSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:script-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:script-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:script') description = serializers.SerializerMethodField(read_only=True) vars = serializers.SerializerMethodField(read_only=True) result = JobSerializer(nested=True, read_only=True) diff --git a/netbox/extras/api/serializers_/tags.py b/netbox/extras/api/serializers_/tags.py index 21a02f7fa3d..f84decec543 100644 --- a/netbox/extras/api/serializers_/tags.py +++ b/netbox/extras/api/serializers_/tags.py @@ -12,7 +12,7 @@ class TagSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:tag-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:tag-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:tag') object_types = ContentTypeField( queryset=ObjectType.objects.with_feature('tags'), many=True, diff --git a/netbox/ipam/api/nested_serializers.py b/netbox/ipam/api/nested_serializers.py index d3526e439fc..00f5f1d32ed 100644 --- a/netbox/ipam/api/nested_serializers.py +++ b/netbox/ipam/api/nested_serializers.py @@ -32,7 +32,7 @@ class NestedASNRangeSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:asnrange-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:asnrange-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:asnrange') class Meta: model = models.ASNRange @@ -45,7 +45,7 @@ class Meta: class NestedASNSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:asn-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:asn-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:asn') class Meta: model = models.ASN @@ -61,7 +61,7 @@ class Meta: ) class NestedVRFSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vrf-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:vrf-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:vrf') prefix_count = RelatedObjectCountField('prefixes') class Meta: @@ -75,7 +75,7 @@ class Meta: class NestedRouteTargetSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:routetarget-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:routetarget-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:routetarget') class Meta: model = models.RouteTarget @@ -91,7 +91,7 @@ class Meta: ) class NestedRIRSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:rir-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:rir-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:rir') aggregate_count = RelatedObjectCountField('aggregates') class Meta: @@ -101,7 +101,7 @@ class Meta: class NestedAggregateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:aggregate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:aggregate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:aggregate') family = serializers.IntegerField(read_only=True) class Meta: @@ -115,7 +115,7 @@ class Meta: class NestedFHRPGroupSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:fhrpgroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:fhrpgroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:fhrpgroup') class Meta: model = models.FHRPGroup @@ -124,7 +124,7 @@ class Meta: class NestedFHRPGroupAssignmentSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:fhrpgroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:fhrpgroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:fhrpgroup') group = NestedFHRPGroupSerializer() class Meta: @@ -141,7 +141,7 @@ class Meta: ) class NestedRoleSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:role-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:role-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:role') prefix_count = RelatedObjectCountField('prefixes') vlan_count = RelatedObjectCountField('vlans') @@ -155,7 +155,7 @@ class Meta: ) class NestedVLANGroupSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vlangroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:vlangroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:vlangroup') vlan_count = RelatedObjectCountField('vlans') class Meta: @@ -165,7 +165,7 @@ class Meta: class NestedVLANSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vlan-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:vlan-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:vlan') class Meta: model = models.VLAN @@ -178,7 +178,7 @@ class Meta: class NestedPrefixSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:prefix-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:prefix-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:prefix') family = serializers.IntegerField(read_only=True) _depth = serializers.IntegerField(read_only=True) @@ -193,7 +193,7 @@ class Meta: class NestedIPRangeSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:iprange-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:iprange-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:iprange') family = serializers.IntegerField(read_only=True) start_address = IPAddressField() end_address = IPAddressField() @@ -209,7 +209,7 @@ class Meta: class NestedIPAddressSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:ipaddress-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:ipaddress-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:ipaddress') family = serializers.IntegerField(read_only=True) address = IPAddressField() @@ -224,7 +224,7 @@ class Meta: class NestedServiceTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:servicetemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:servicetemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:servicetemplate') class Meta: model = models.ServiceTemplate @@ -233,7 +233,7 @@ class Meta: class NestedServiceSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:service-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:service-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:service') class Meta: model = models.Service diff --git a/netbox/ipam/api/serializers_/asns.py b/netbox/ipam/api/serializers_/asns.py index 615b93bf83b..13ca47f8c0a 100644 --- a/netbox/ipam/api/serializers_/asns.py +++ b/netbox/ipam/api/serializers_/asns.py @@ -15,7 +15,7 @@ class RIRSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:rir-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:rir-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:rir') # Related object counts aggregate_count = RelatedObjectCountField('aggregates') @@ -31,7 +31,7 @@ class Meta: class ASNRangeSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:asnrange-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:asnrange-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:asnrange') rir = RIRSerializer(nested=True) tenant = TenantSerializer(nested=True, required=False, allow_null=True) asn_count = serializers.IntegerField(read_only=True) @@ -47,7 +47,7 @@ class Meta: class ASNSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:asn-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:asn-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:asn') rir = RIRSerializer(nested=True, required=False, allow_null=True) tenant = TenantSerializer(nested=True, required=False, allow_null=True) diff --git a/netbox/ipam/api/serializers_/fhrpgroups.py b/netbox/ipam/api/serializers_/fhrpgroups.py index f2da9767c49..ebc5e1d5efe 100644 --- a/netbox/ipam/api/serializers_/fhrpgroups.py +++ b/netbox/ipam/api/serializers_/fhrpgroups.py @@ -16,7 +16,7 @@ class FHRPGroupSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:fhrpgroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:fhrpgroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:fhrpgroup') ip_addresses = IPAddressSerializer(nested=True, many=True, read_only=True) class Meta: @@ -30,7 +30,7 @@ class Meta: class FHRPGroupAssignmentSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:fhrpgroupassignment-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:fhrpgroupassignment-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:fhrpgroupassignment') group = FHRPGroupSerializer(nested=True) interface_type = ContentTypeField( queryset=ContentType.objects.all() diff --git a/netbox/ipam/api/serializers_/ip.py b/netbox/ipam/api/serializers_/ip.py index ab53d3619da..c65798474ba 100644 --- a/netbox/ipam/api/serializers_/ip.py +++ b/netbox/ipam/api/serializers_/ip.py @@ -30,7 +30,7 @@ class AggregateSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:aggregate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:aggregate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:aggregate') family = ChoiceField(choices=IPAddressFamilyChoices, read_only=True) rir = RIRSerializer(nested=True) tenant = TenantSerializer(nested=True, required=False, allow_null=True) @@ -47,7 +47,7 @@ class Meta: class PrefixSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:prefix-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:prefix-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:prefix') family = ChoiceField(choices=IPAddressFamilyChoices, read_only=True) site = SiteSerializer(nested=True, required=False, allow_null=True) vrf = VRFSerializer(nested=True, required=False, allow_null=True) @@ -122,7 +122,7 @@ def to_representation(self, instance): class IPRangeSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:iprange-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:iprange-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:iprange') family = ChoiceField(choices=IPAddressFamilyChoices, read_only=True) start_address = IPAddressField() end_address = IPAddressField() @@ -147,7 +147,7 @@ class Meta: class IPAddressSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:ipaddress-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:ipaddress-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:ipaddress') family = ChoiceField(choices=IPAddressFamilyChoices, read_only=True) address = IPAddressField() vrf = VRFSerializer(nested=True, required=False, allow_null=True) diff --git a/netbox/ipam/api/serializers_/roles.py b/netbox/ipam/api/serializers_/roles.py index 26026b87bd6..e3c79c19a67 100644 --- a/netbox/ipam/api/serializers_/roles.py +++ b/netbox/ipam/api/serializers_/roles.py @@ -11,7 +11,7 @@ class RoleSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:role-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:role-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:role') # Related object counts prefix_count = RelatedObjectCountField('prefixes') diff --git a/netbox/ipam/api/serializers_/services.py b/netbox/ipam/api/serializers_/services.py index 10ba32250d5..b08d17121d6 100644 --- a/netbox/ipam/api/serializers_/services.py +++ b/netbox/ipam/api/serializers_/services.py @@ -16,7 +16,7 @@ class ServiceTemplateSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:servicetemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:servicetemplate-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:servicetemplate') protocol = ChoiceField(choices=ServiceProtocolChoices, required=False) class Meta: @@ -30,7 +30,7 @@ class Meta: class ServiceSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:service-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:service-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:service') device = DeviceSerializer(nested=True, required=False, allow_null=True) virtual_machine = VirtualMachineSerializer(nested=True, required=False, allow_null=True) protocol = ChoiceField(choices=ServiceProtocolChoices, required=False) diff --git a/netbox/ipam/api/serializers_/vlans.py b/netbox/ipam/api/serializers_/vlans.py index 5deba3dae47..bb243365b0e 100644 --- a/netbox/ipam/api/serializers_/vlans.py +++ b/netbox/ipam/api/serializers_/vlans.py @@ -23,7 +23,7 @@ class VLANGroupSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vlangroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:vlangroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:vlangroup') scope_type = ContentTypeField( queryset=ContentType.objects.filter( model__in=VLANGROUP_SCOPE_TYPES @@ -59,7 +59,7 @@ def get_scope(self, obj): class VLANSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vlan-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:vlan-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:vlan') site = SiteSerializer(nested=True, required=False, allow_null=True) group = VLANGroupSerializer(nested=True, required=False, allow_null=True, default=None) tenant = TenantSerializer(nested=True, required=False, allow_null=True) diff --git a/netbox/ipam/api/serializers_/vrfs.py b/netbox/ipam/api/serializers_/vrfs.py index 6c38782615b..a316b404b58 100644 --- a/netbox/ipam/api/serializers_/vrfs.py +++ b/netbox/ipam/api/serializers_/vrfs.py @@ -13,7 +13,7 @@ class RouteTargetSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:routetarget-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:routetarget-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:routetarget') tenant = TenantSerializer(nested=True, required=False, allow_null=True) class Meta: @@ -27,7 +27,7 @@ class Meta: class VRFSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vrf-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:vrf-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='ipam:vrf') tenant = TenantSerializer(nested=True, required=False, allow_null=True) import_targets = SerializedPKRelatedField( queryset=RouteTarget.objects.all(), diff --git a/netbox/netbox/api/serializers/nested.py b/netbox/netbox/api/serializers/nested.py index c39701e95d9..aa7c6e59e29 100644 --- a/netbox/netbox/api/serializers/nested.py +++ b/netbox/netbox/api/serializers/nested.py @@ -23,8 +23,8 @@ def to_internal_value(self, data): # Declared here for use by PrimaryModelSerializer, but should be imported from extras.api.nested_serializers class NestedTagSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:tag-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:tag-detail') + url = serializers.HyperlinkedIdentityField(view_name='extras-api:tag-detai') + display_url = serializers.HyperlinkedIdentityField(view_name='extras:tag') class Meta: model = Tag diff --git a/netbox/tenancy/api/nested_serializers.py b/netbox/tenancy/api/nested_serializers.py index 4125dd154bd..fe8f9ad8b37 100644 --- a/netbox/tenancy/api/nested_serializers.py +++ b/netbox/tenancy/api/nested_serializers.py @@ -23,7 +23,7 @@ ) class NestedTenantGroupSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:tenantgroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:tenantgroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:tenantgroup') tenant_count = serializers.IntegerField(read_only=True) _depth = serializers.IntegerField(source='level', read_only=True) @@ -34,7 +34,7 @@ class Meta: class NestedTenantSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:tenant-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:tenant-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:tenant') class Meta: model = Tenant @@ -50,7 +50,7 @@ class Meta: ) class NestedContactGroupSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:contactgroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:contactgroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:contactgroup') contact_count = serializers.IntegerField(read_only=True) _depth = serializers.IntegerField(source='level', read_only=True) @@ -61,7 +61,7 @@ class Meta: class NestedContactRoleSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:contactrole-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:contactrole-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:contactrole') class Meta: model = ContactRole @@ -70,7 +70,7 @@ class Meta: class NestedContactSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:contact-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:contact-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:contact') class Meta: model = Contact @@ -79,7 +79,7 @@ class Meta: class NestedContactAssignmentSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:contactassignment-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:contactassignment-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:contactassignment') contact = NestedContactSerializer() role = NestedContactRoleSerializer diff --git a/netbox/tenancy/api/serializers_/contacts.py b/netbox/tenancy/api/serializers_/contacts.py index d315abff678..4b5b7827ea5 100644 --- a/netbox/tenancy/api/serializers_/contacts.py +++ b/netbox/tenancy/api/serializers_/contacts.py @@ -20,7 +20,7 @@ class ContactGroupSerializer(NestedGroupModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:contactgroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:contactgroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:contactgroup') parent = NestedContactGroupSerializer(required=False, allow_null=True, default=None) contact_count = serializers.IntegerField(read_only=True, default=0) @@ -35,7 +35,7 @@ class Meta: class ContactRoleSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:contactrole-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:contactrole-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:contactrole') class Meta: model = ContactRole @@ -48,7 +48,7 @@ class Meta: class ContactSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:contact-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:contact-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:contact') group = ContactGroupSerializer(nested=True, required=False, allow_null=True, default=None) class Meta: @@ -62,7 +62,7 @@ class Meta: class ContactAssignmentSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:contactassignment-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:contactassignment-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:contactassignment') object_type = ContentTypeField( queryset=ContentType.objects.all() ) diff --git a/netbox/tenancy/api/serializers_/tenants.py b/netbox/tenancy/api/serializers_/tenants.py index 5beaa807d3a..eb31b47a8b7 100644 --- a/netbox/tenancy/api/serializers_/tenants.py +++ b/netbox/tenancy/api/serializers_/tenants.py @@ -13,7 +13,7 @@ class TenantGroupSerializer(NestedGroupModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:tenantgroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:tenantgroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:tenantgroup') parent = NestedTenantGroupSerializer(required=False, allow_null=True) tenant_count = serializers.IntegerField(read_only=True, default=0) @@ -28,7 +28,7 @@ class Meta: class TenantSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:tenant-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:tenant-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:tenant') group = TenantGroupSerializer(nested=True, required=False, allow_null=True, default=None) # Related object counts diff --git a/netbox/users/api/nested_serializers.py b/netbox/users/api/nested_serializers.py index d6f9dbb5cb2..103984634e6 100644 --- a/netbox/users/api/nested_serializers.py +++ b/netbox/users/api/nested_serializers.py @@ -18,7 +18,7 @@ class NestedGroupSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='users-api:group-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='users:group-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='users:group') class Meta: model = Group @@ -27,7 +27,7 @@ class Meta: class NestedUserSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='users-api:user-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='users:user-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='users:user') class Meta: model = get_user_model() @@ -42,7 +42,7 @@ def get_display(self, obj): class NestedTokenSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='users-api:token-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='users:token-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='users:token') class Meta: model = Token @@ -51,7 +51,7 @@ class Meta: class NestedObjectPermissionSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='users-api:objectpermission-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='users:objectpermission-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='users:objectpermission') object_types = ContentTypeField( queryset=ObjectType.objects.all(), many=True diff --git a/netbox/users/api/serializers_/permissions.py b/netbox/users/api/serializers_/permissions.py index 8534fb8f16e..f9974e7de91 100644 --- a/netbox/users/api/serializers_/permissions.py +++ b/netbox/users/api/serializers_/permissions.py @@ -13,7 +13,7 @@ class ObjectPermissionSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='users-api:objectpermission-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='users:objectpermission-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='users:objectpermission') object_types = ContentTypeField( queryset=ObjectType.objects.all(), many=True diff --git a/netbox/users/api/serializers_/tokens.py b/netbox/users/api/serializers_/tokens.py index b0c3ffd893d..6c777ccbc39 100644 --- a/netbox/users/api/serializers_/tokens.py +++ b/netbox/users/api/serializers_/tokens.py @@ -16,7 +16,7 @@ class TokenSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='users-api:token-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='users:token-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='users:token') key = serializers.CharField( min_length=40, max_length=40, diff --git a/netbox/users/api/serializers_/users.py b/netbox/users/api/serializers_/users.py index 13541207b60..aeeefe9d306 100644 --- a/netbox/users/api/serializers_/users.py +++ b/netbox/users/api/serializers_/users.py @@ -16,7 +16,7 @@ class GroupSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='users-api:group-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='users:group-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='users:group') user_count = serializers.IntegerField(read_only=True) permissions = SerializedPKRelatedField( source='object_permissions', @@ -35,7 +35,7 @@ class Meta: class UserSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='users-api:user-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='users:user-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='users:user') groups = SerializedPKRelatedField( queryset=Group.objects.all(), serializer=GroupSerializer, diff --git a/netbox/virtualization/api/nested_serializers.py b/netbox/virtualization/api/nested_serializers.py index accba4b8a59..c7b5986ad13 100644 --- a/netbox/virtualization/api/nested_serializers.py +++ b/netbox/virtualization/api/nested_serializers.py @@ -24,7 +24,7 @@ ) class NestedClusterTypeSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustertype-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:clustertype-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:clustertype') cluster_count = RelatedObjectCountField('clusters') class Meta: @@ -37,7 +37,7 @@ class Meta: ) class NestedClusterGroupSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustergroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:clustergroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:clustergroup') cluster_count = RelatedObjectCountField('clusters') class Meta: @@ -50,7 +50,7 @@ class Meta: ) class NestedClusterSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:cluster-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:cluster-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:cluster') virtualmachine_count = RelatedObjectCountField('virtual_machines') class Meta: @@ -64,7 +64,7 @@ class Meta: class NestedVirtualMachineSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:virtualmachine-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:virtualmachine-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:virtualmachine') class Meta: model = VirtualMachine @@ -73,7 +73,7 @@ class Meta: class NestedVMInterfaceSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:vminterface-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:vminterface-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:vminterface') virtual_machine = NestedVirtualMachineSerializer(read_only=True) class Meta: @@ -83,7 +83,7 @@ class Meta: class NestedVirtualDiskSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:virtualdisk-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:virtualdisk-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:virtualdisk') virtual_machine = NestedVirtualMachineSerializer(read_only=True) class Meta: diff --git a/netbox/virtualization/api/serializers_/clusters.py b/netbox/virtualization/api/serializers_/clusters.py index c5a25698429..3ee50bfadc5 100644 --- a/netbox/virtualization/api/serializers_/clusters.py +++ b/netbox/virtualization/api/serializers_/clusters.py @@ -16,7 +16,7 @@ class ClusterTypeSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustertype-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:clustertype-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:clustertype') # Related object counts cluster_count = RelatedObjectCountField('clusters') @@ -32,7 +32,7 @@ class Meta: class ClusterGroupSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustergroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:clustergroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:clustergroup') # Related object counts cluster_count = RelatedObjectCountField('clusters') @@ -48,7 +48,7 @@ class Meta: class ClusterSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:cluster-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:cluster-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:cluster') type = ClusterTypeSerializer(nested=True) group = ClusterGroupSerializer(nested=True, required=False, allow_null=True, default=None) status = ChoiceField(choices=ClusterStatusChoices, required=False) diff --git a/netbox/virtualization/api/serializers_/virtualmachines.py b/netbox/virtualization/api/serializers_/virtualmachines.py index 6af0b3442ff..9cd78b9d9ee 100644 --- a/netbox/virtualization/api/serializers_/virtualmachines.py +++ b/netbox/virtualization/api/serializers_/virtualmachines.py @@ -30,7 +30,7 @@ class VirtualMachineSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:virtualmachine-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:virtualmachine-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:virtualmachine') status = ChoiceField(choices=VirtualMachineStatusChoices, required=False) site = SiteSerializer(nested=True, required=False, allow_null=True, default=None) cluster = ClusterSerializer(nested=True, required=False, allow_null=True, default=None) @@ -80,7 +80,7 @@ def get_config_context(self, obj): class VMInterfaceSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:vminterface-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:vminterface-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:vminterface') virtual_machine = VirtualMachineSerializer(nested=True) parent = NestedVMInterfaceSerializer(required=False, allow_null=True) bridge = NestedVMInterfaceSerializer(required=False, allow_null=True) @@ -132,7 +132,7 @@ def validate(self, data): class VirtualDiskSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:virtualdisk-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:virtualdisk-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:virtualdisk') virtual_machine = VirtualMachineSerializer(nested=True) class Meta: diff --git a/netbox/vpn/api/nested_serializers.py b/netbox/vpn/api/nested_serializers.py index 385bbe2a5a5..cc911878d8c 100644 --- a/netbox/vpn/api/nested_serializers.py +++ b/netbox/vpn/api/nested_serializers.py @@ -24,7 +24,7 @@ ) class NestedTunnelGroupSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='vpn-api:tunnelgroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='vpn:tunnelgroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='vpn:tunnelgroup') tunnel_count = RelatedObjectCountField('tunnels') class Meta: @@ -37,7 +37,7 @@ class NestedTunnelSerializer(WritableNestedSerializer): view_name='vpn-api:tunnel-detail' ) display_url = serializers.HyperlinkedIdentityField( - view_name='vpn:tunnel-detail' + view_name='vpn:tunnel' ) class Meta: @@ -50,7 +50,7 @@ class NestedTunnelTerminationSerializer(WritableNestedSerializer): view_name='vpn-api:tunneltermination-detail' ) display_url = serializers.HyperlinkedIdentityField( - view_name='vpn:tunneltermination-detail' + view_name='vpn:tunneltermination' ) class Meta: @@ -63,7 +63,7 @@ class NestedIKEProposalSerializer(WritableNestedSerializer): view_name='vpn-api:ikeproposal-detail' ) display_url = serializers.HyperlinkedIdentityField( - view_name='vpn:ikeproposal-detail' + view_name='vpn:ikeproposal' ) class Meta: @@ -76,7 +76,7 @@ class NestedIKEPolicySerializer(WritableNestedSerializer): view_name='vpn-api:ikepolicy-detail' ) display_url = serializers.HyperlinkedIdentityField( - view_name='vpn:ikepolicy-detail' + view_name='vpn:ikepolicy' ) class Meta: @@ -89,7 +89,7 @@ class NestedIPSecProposalSerializer(WritableNestedSerializer): view_name='vpn-api:ipsecproposal-detail' ) display_url = serializers.HyperlinkedIdentityField( - view_name='vpn:ipsecproposal-detail' + view_name='vpn:ipsecproposal' ) class Meta: @@ -102,7 +102,7 @@ class NestedIPSecPolicySerializer(WritableNestedSerializer): view_name='vpn-api:ipsecpolicy-detail' ) display_url = serializers.HyperlinkedIdentityField( - view_name='vpn:ipsecpolicy-detail' + view_name='vpn:ipsecpolicy' ) class Meta: @@ -115,7 +115,7 @@ class NestedIPSecProfileSerializer(WritableNestedSerializer): view_name='vpn-api:ipsecprofile-detail' ) display_url = serializers.HyperlinkedIdentityField( - view_name='vpn:ipsecprofile-detail' + view_name='vpn:ipsecprofile' ) class Meta: @@ -129,7 +129,7 @@ class Meta: class NestedL2VPNSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='vpn-api:l2vpn-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='vpn:l2vpn-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='vpn:l2vpn') class Meta: model = models.L2VPN @@ -140,7 +140,7 @@ class Meta: class NestedL2VPNTerminationSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='vpn-api:l2vpntermination-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='vpn:l2vpntermination-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='vpn:l2vpntermination') l2vpn = NestedL2VPNSerializer() class Meta: diff --git a/netbox/vpn/api/serializers_/crypto.py b/netbox/vpn/api/serializers_/crypto.py index 0f625f8a0e9..52e453b2608 100644 --- a/netbox/vpn/api/serializers_/crypto.py +++ b/netbox/vpn/api/serializers_/crypto.py @@ -19,7 +19,7 @@ class IKEProposalSerializer(NetBoxModelSerializer): view_name='vpn-api:ikeproposal-detail' ) display_url = serializers.HyperlinkedIdentityField( - view_name='vpn:ikeproposal-detail' + view_name='vpn:ikeproposal' ) authentication_method = ChoiceField( choices=AuthenticationMethodChoices @@ -49,7 +49,7 @@ class IKEPolicySerializer(NetBoxModelSerializer): view_name='vpn-api:ikepolicy-detail' ) display_url = serializers.HyperlinkedIdentityField( - view_name='vpn:ikepolicy-detail' + view_name='vpn:ikepolicy' ) version = ChoiceField( choices=IKEVersionChoices @@ -79,7 +79,7 @@ class IPSecProposalSerializer(NetBoxModelSerializer): view_name='vpn-api:ipsecproposal-detail' ) display_url = serializers.HyperlinkedIdentityField( - view_name='vpn:ipsecproposal-detail' + view_name='vpn:ipsecproposal' ) encryption_algorithm = ChoiceField( choices=EncryptionAlgorithmChoices @@ -102,7 +102,7 @@ class IPSecPolicySerializer(NetBoxModelSerializer): view_name='vpn-api:ipsecpolicy-detail' ) display_url = serializers.HyperlinkedIdentityField( - view_name='vpn:ipsecpolicy-detail' + view_name='vpn:ipsecpolicy' ) proposals = SerializedPKRelatedField( queryset=IPSecProposal.objects.all(), @@ -130,7 +130,7 @@ class IPSecProfileSerializer(NetBoxModelSerializer): view_name='vpn-api:ipsecprofile-detail' ) display_url = serializers.HyperlinkedIdentityField( - view_name='vpn:ipsecprofile-detail' + view_name='vpn:ipsecprofile' ) mode = ChoiceField( choices=IPSecModeChoices diff --git a/netbox/vpn/api/serializers_/l2vpn.py b/netbox/vpn/api/serializers_/l2vpn.py index 6c5faa6e260..96539b8aaa5 100644 --- a/netbox/vpn/api/serializers_/l2vpn.py +++ b/netbox/vpn/api/serializers_/l2vpn.py @@ -19,7 +19,7 @@ class L2VPNSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='vpn-api:l2vpn-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='vpn:l2vpn-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='vpn:l2vpn') type = ChoiceField(choices=L2VPNTypeChoices, required=False) import_targets = SerializedPKRelatedField( queryset=RouteTarget.objects.all(), @@ -48,7 +48,7 @@ class Meta: class L2VPNTerminationSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='vpn-api:l2vpntermination-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='vpn:l2vpntermination-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='vpn:l2vpntermination') l2vpn = L2VPNSerializer( nested=True ) diff --git a/netbox/vpn/api/serializers_/tunnels.py b/netbox/vpn/api/serializers_/tunnels.py index e2fa53459e9..d463f49ddae 100644 --- a/netbox/vpn/api/serializers_/tunnels.py +++ b/netbox/vpn/api/serializers_/tunnels.py @@ -24,7 +24,7 @@ class TunnelGroupSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='vpn-api:tunnelgroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='vpn:tunnelgroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='vpn:tunnelgroup') # Related object counts tunnel_count = RelatedObjectCountField('tunnels') @@ -43,7 +43,7 @@ class TunnelSerializer(NetBoxModelSerializer): view_name='vpn-api:tunnel-detail' ) display_url = serializers.HyperlinkedIdentityField( - view_name='vpn:tunnel-detail' + view_name='vpn:tunnel' ) status = ChoiceField( choices=TunnelStatusChoices @@ -86,7 +86,7 @@ class TunnelTerminationSerializer(NetBoxModelSerializer): view_name='vpn-api:tunneltermination-detail' ) display_url = serializers.HyperlinkedIdentityField( - view_name='vpn:tunneltermination-detail' + view_name='vpn:tunneltermination' ) tunnel = TunnelSerializer( nested=True diff --git a/netbox/wireless/api/nested_serializers.py b/netbox/wireless/api/nested_serializers.py index d8ea12fa3db..e0731e6c97e 100644 --- a/netbox/wireless/api/nested_serializers.py +++ b/netbox/wireless/api/nested_serializers.py @@ -16,7 +16,7 @@ ) class NestedWirelessLANGroupSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='wireless-api:wirelesslangroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='wireless:wirelesslangroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='wireless:wirelesslangroup') wirelesslan_count = serializers.IntegerField(read_only=True) _depth = serializers.IntegerField(source='level', read_only=True) @@ -27,7 +27,7 @@ class Meta: class NestedWirelessLANSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='wireless-api:wirelesslan-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='wireless:wirelesslan-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='wireless:wirelesslan') class Meta: model = WirelessLAN @@ -36,7 +36,7 @@ class Meta: class NestedWirelessLinkSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='wireless-api:wirelesslink-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='wireless:wirelesslink-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='wireless:wirelesslink') class Meta: model = WirelessLink diff --git a/netbox/wireless/api/serializers_/wirelesslans.py b/netbox/wireless/api/serializers_/wirelesslans.py index ff41485c7cb..08f4f90d9fd 100644 --- a/netbox/wireless/api/serializers_/wirelesslans.py +++ b/netbox/wireless/api/serializers_/wirelesslans.py @@ -16,7 +16,7 @@ class WirelessLANGroupSerializer(NestedGroupModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='wireless-api:wirelesslangroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='wireless:wirelesslangroup-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='wireless:wirelesslangroup') parent = NestedWirelessLANGroupSerializer(required=False, allow_null=True, default=None) wirelesslan_count = serializers.IntegerField(read_only=True, default=0) @@ -31,7 +31,7 @@ class Meta: class WirelessLANSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='wireless-api:wirelesslan-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='wireless:wirelesslan-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='wireless:wirelesslan') group = WirelessLANGroupSerializer(nested=True, required=False, allow_null=True) status = ChoiceField(choices=WirelessLANStatusChoices, required=False, allow_blank=True) vlan = VLANSerializer(nested=True, required=False, allow_null=True) diff --git a/netbox/wireless/api/serializers_/wirelesslinks.py b/netbox/wireless/api/serializers_/wirelesslinks.py index cd9d90b3a88..880ce9f62f0 100644 --- a/netbox/wireless/api/serializers_/wirelesslinks.py +++ b/netbox/wireless/api/serializers_/wirelesslinks.py @@ -15,7 +15,7 @@ class WirelessLinkSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='wireless-api:wirelesslink-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='wireless:wirelesslink-detail') + display_url = serializers.HyperlinkedIdentityField(view_name='wireless:wirelesslink') status = ChoiceField(choices=LinkStatusChoices, required=False) interface_a = InterfaceSerializer(nested=True) interface_b = InterfaceSerializer(nested=True) From fb1f72ea696fe456b3c6531cd7388aa0229959f5 Mon Sep 17 00:00:00 2001 From: Arthur Date: Tue, 4 Jun 2024 15:05:37 -0700 Subject: [PATCH 03/16] 15156 fix typo --- netbox/netbox/api/serializers/nested.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/netbox/api/serializers/nested.py b/netbox/netbox/api/serializers/nested.py index aa7c6e59e29..a9a434d66b7 100644 --- a/netbox/netbox/api/serializers/nested.py +++ b/netbox/netbox/api/serializers/nested.py @@ -23,7 +23,7 @@ def to_internal_value(self, data): # Declared here for use by PrimaryModelSerializer, but should be imported from extras.api.nested_serializers class NestedTagSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:tag-detai') + url = serializers.HyperlinkedIdentityField(view_name='extras-api:tag-detail') display_url = serializers.HyperlinkedIdentityField(view_name='extras:tag') class Meta: From 91f1cdb3551186999c7b0a0a31991900b628f33d Mon Sep 17 00:00:00 2001 From: Arthur Date: Wed, 5 Jun 2024 10:21:43 -0700 Subject: [PATCH 04/16] 15156 fix tests --- netbox/dcim/api/nested_serializers.py | 20 +++++++++---------- netbox/dcim/api/serializers_/cables.py | 2 +- .../api/serializers_/devicetype_components.py | 20 +++++++++---------- netbox/extras/api/nested_serializers.py | 4 ++-- netbox/extras/api/serializers_/attachments.py | 2 +- netbox/extras/api/serializers_/bookmarks.py | 2 +- netbox/extras/api/serializers_/objecttypes.py | 2 +- netbox/ipam/api/serializers_/fhrpgroups.py | 2 +- netbox/tenancy/api/nested_serializers.py | 2 +- netbox/tenancy/api/serializers_/contacts.py | 2 +- 10 files changed, 29 insertions(+), 29 deletions(-) diff --git a/netbox/dcim/api/nested_serializers.py b/netbox/dcim/api/nested_serializers.py index 89e05fd08d1..8f4d97d34f9 100644 --- a/netbox/dcim/api/nested_serializers.py +++ b/netbox/dcim/api/nested_serializers.py @@ -194,7 +194,7 @@ class Meta: class NestedConsolePortTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleporttemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:consoleporttemplate') + display_url = serializers.CharField(allow_null=True, read_only=True) class Meta: model = models.ConsolePortTemplate @@ -203,7 +203,7 @@ class Meta: class NestedConsoleServerPortTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleserverporttemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:consoleserverporttemplate') + display_url = serializers.CharField(allow_null=True, read_only=True) class Meta: model = models.ConsoleServerPortTemplate @@ -212,7 +212,7 @@ class Meta: class NestedPowerPortTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerporttemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:powerporttemplate') + display_url = serializers.CharField(allow_null=True, read_only=True) class Meta: model = models.PowerPortTemplate @@ -221,7 +221,7 @@ class Meta: class NestedPowerOutletTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:poweroutlettemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:poweroutlettemplate') + display_url = serializers.CharField(allow_null=True, read_only=True) class Meta: model = models.PowerOutletTemplate @@ -230,7 +230,7 @@ class Meta: class NestedInterfaceTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:interfacetemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:interfacetemplate') + display_url = serializers.CharField(allow_null=True, read_only=True) class Meta: model = models.InterfaceTemplate @@ -239,7 +239,7 @@ class Meta: class NestedRearPortTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearporttemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rearporttemplate') + display_url = serializers.CharField(allow_null=True, read_only=True) class Meta: model = models.RearPortTemplate @@ -248,7 +248,7 @@ class Meta: class NestedFrontPortTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:frontporttemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:frontporttemplate') + display_url = serializers.CharField(allow_null=True, read_only=True) class Meta: model = models.FrontPortTemplate @@ -257,7 +257,7 @@ class Meta: class NestedModuleBayTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:modulebaytemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:modulebaytemplate') + display_url = serializers.CharField(allow_null=True, read_only=True) class Meta: model = models.ModuleBayTemplate @@ -266,7 +266,7 @@ class Meta: class NestedDeviceBayTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicebaytemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:devicebaytemplate') + display_url = serializers.CharField(allow_null=True, read_only=True) class Meta: model = models.DeviceBayTemplate @@ -275,7 +275,7 @@ class Meta: class NestedInventoryItemTemplateSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitemtemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:inventoryitemtemplate') + display_url = serializers.CharField(allow_null=True, read_only=True) _depth = serializers.IntegerField(source='level', read_only=True) class Meta: diff --git a/netbox/dcim/api/serializers_/cables.py b/netbox/dcim/api/serializers_/cables.py index e1e69a8fa23..1881df41aa0 100644 --- a/netbox/dcim/api/serializers_/cables.py +++ b/netbox/dcim/api/serializers_/cables.py @@ -55,7 +55,7 @@ class Meta: class CableTerminationSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:cabletermination-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:cabletermination') + display_url = serializers.CharField(allow_null=True, read_only=True) termination_type = ContentTypeField( queryset=ContentType.objects.filter(CABLE_TERMINATION_MODELS) ) diff --git a/netbox/dcim/api/serializers_/devicetype_components.py b/netbox/dcim/api/serializers_/devicetype_components.py index 813cd872ff8..cd72236f483 100644 --- a/netbox/dcim/api/serializers_/devicetype_components.py +++ b/netbox/dcim/api/serializers_/devicetype_components.py @@ -33,7 +33,7 @@ class ConsolePortTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleporttemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:consoleporttemplate') + display_url = serializers.CharField(allow_null=True, read_only=True) device_type = DeviceTypeSerializer( nested=True, required=False, @@ -63,7 +63,7 @@ class Meta: class ConsoleServerPortTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleserverporttemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:consoleserverporttemplate') + display_url = serializers.CharField(allow_null=True, read_only=True) device_type = DeviceTypeSerializer( nested=True, required=False, @@ -93,7 +93,7 @@ class Meta: class PowerPortTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerporttemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:powerporttemplate') + display_url = serializers.CharField(allow_null=True, read_only=True) device_type = DeviceTypeSerializer( nested=True, required=False, @@ -124,7 +124,7 @@ class Meta: class PowerOutletTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:poweroutlettemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:poweroutlettemplate') + display_url = serializers.CharField(allow_null=True, read_only=True) device_type = DeviceTypeSerializer( nested=True, required=False, @@ -166,7 +166,7 @@ class Meta: class InterfaceTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:interfacetemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:interfacetemplate') + display_url = serializers.CharField(allow_null=True, read_only=True) device_type = DeviceTypeSerializer( nested=True, required=False, @@ -214,7 +214,7 @@ class Meta: class RearPortTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearporttemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rearporttemplate') + display_url = serializers.CharField(allow_null=True, read_only=True) device_type = DeviceTypeSerializer( required=False, nested=True, @@ -240,7 +240,7 @@ class Meta: class FrontPortTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:frontporttemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:frontporttemplate') + display_url = serializers.CharField(allow_null=True, read_only=True) device_type = DeviceTypeSerializer( nested=True, required=False, @@ -267,7 +267,7 @@ class Meta: class ModuleBayTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:modulebaytemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:modulebaytemplate') + display_url = serializers.CharField(allow_null=True, read_only=True) device_type = DeviceTypeSerializer( nested=True ) @@ -283,7 +283,7 @@ class Meta: class DeviceBayTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicebaytemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:devicebaytemplate') + display_url = serializers.CharField(allow_null=True, read_only=True) device_type = DeviceTypeSerializer( nested=True ) @@ -299,7 +299,7 @@ class Meta: class InventoryItemTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitemtemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:inventoryitemtemplate') + display_url = serializers.CharField(allow_null=True, read_only=True) device_type = DeviceTypeSerializer( nested=True ) diff --git a/netbox/extras/api/nested_serializers.py b/netbox/extras/api/nested_serializers.py index b50175bc3b4..9368e58995b 100644 --- a/netbox/extras/api/nested_serializers.py +++ b/netbox/extras/api/nested_serializers.py @@ -104,7 +104,7 @@ class Meta: class NestedBookmarkSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:bookmark-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:bookmark') + display_url = serializers.CharField(allow_null=True, read_only=True) class Meta: model = models.Bookmark @@ -113,7 +113,7 @@ class Meta: class NestedImageAttachmentSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:imageattachment-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:imageattachment') + display_url = serializers.CharField(allow_null=True, read_only=True) class Meta: model = models.ImageAttachment diff --git a/netbox/extras/api/serializers_/attachments.py b/netbox/extras/api/serializers_/attachments.py index 646ec3255d1..d6955553688 100644 --- a/netbox/extras/api/serializers_/attachments.py +++ b/netbox/extras/api/serializers_/attachments.py @@ -15,7 +15,7 @@ class ImageAttachmentSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:imageattachment-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:imageattachment') + display_url = serializers.CharField(allow_null=True, read_only=True) object_type = ContentTypeField( queryset=ObjectType.objects.all() ) diff --git a/netbox/extras/api/serializers_/bookmarks.py b/netbox/extras/api/serializers_/bookmarks.py index 244735833d4..ea9cb4e696e 100644 --- a/netbox/extras/api/serializers_/bookmarks.py +++ b/netbox/extras/api/serializers_/bookmarks.py @@ -15,7 +15,7 @@ class BookmarkSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:bookmark-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:bookmark') + display_url = serializers.CharField(allow_null=True, read_only=True) object_type = ContentTypeField( queryset=ObjectType.objects.with_feature('bookmarks'), ) diff --git a/netbox/extras/api/serializers_/objecttypes.py b/netbox/extras/api/serializers_/objecttypes.py index aea4807930d..9f0b38819bb 100644 --- a/netbox/extras/api/serializers_/objecttypes.py +++ b/netbox/extras/api/serializers_/objecttypes.py @@ -10,7 +10,7 @@ class ObjectTypeSerializer(BaseModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:objecttype-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:objecttype') + display_url = serializers.CharField(allow_null=True, read_only=True) class Meta: model = ObjectType diff --git a/netbox/ipam/api/serializers_/fhrpgroups.py b/netbox/ipam/api/serializers_/fhrpgroups.py index ebc5e1d5efe..4990acf2b60 100644 --- a/netbox/ipam/api/serializers_/fhrpgroups.py +++ b/netbox/ipam/api/serializers_/fhrpgroups.py @@ -30,7 +30,7 @@ class Meta: class FHRPGroupAssignmentSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:fhrpgroupassignment-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:fhrpgroupassignment') + display_url = serializers.CharField(allow_null=True, read_only=True) group = FHRPGroupSerializer(nested=True) interface_type = ContentTypeField( queryset=ContentType.objects.all() diff --git a/netbox/tenancy/api/nested_serializers.py b/netbox/tenancy/api/nested_serializers.py index fe8f9ad8b37..ef7a1b03adc 100644 --- a/netbox/tenancy/api/nested_serializers.py +++ b/netbox/tenancy/api/nested_serializers.py @@ -79,7 +79,7 @@ class Meta: class NestedContactAssignmentSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:contactassignment-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:contactassignment') + display_url = serializers.CharField(allow_null=True, read_only=True) contact = NestedContactSerializer() role = NestedContactRoleSerializer diff --git a/netbox/tenancy/api/serializers_/contacts.py b/netbox/tenancy/api/serializers_/contacts.py index 4b5b7827ea5..134638980de 100644 --- a/netbox/tenancy/api/serializers_/contacts.py +++ b/netbox/tenancy/api/serializers_/contacts.py @@ -62,7 +62,7 @@ class Meta: class ContactAssignmentSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:contactassignment-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:contactassignment') + display_url = serializers.CharField(allow_null=True, read_only=True) object_type = ContentTypeField( queryset=ContentType.objects.all() ) From 8b80b5e1cd896f8f68d06ffc9a92635c29352629 Mon Sep 17 00:00:00 2001 From: Arthur Date: Mon, 10 Jun 2024 15:24:52 -0700 Subject: [PATCH 05/16] 15156 add url display_url to base class --- docs/plugins/development/rest-api.md | 16 +--- netbox/circuits/api/nested_serializers.py | 12 --- netbox/circuits/api/serializers_/circuits.py | 8 -- netbox/circuits/api/serializers_/providers.py | 6 -- netbox/core/api/nested_serializers.py | 6 -- netbox/core/api/serializers_/data.py | 12 --- netbox/core/api/serializers_/jobs.py | 2 - netbox/dcim/api/nested_serializers.py | 84 ------------------- netbox/dcim/api/serializers_/cables.py | 3 - .../api/serializers_/device_components.py | 22 ----- netbox/dcim/api/serializers_/devices.py | 6 -- netbox/dcim/api/serializers_/devicetypes.py | 4 - netbox/dcim/api/serializers_/manufacturers.py | 2 - netbox/dcim/api/serializers_/platforms.py | 2 - netbox/dcim/api/serializers_/power.py | 4 - netbox/dcim/api/serializers_/racks.py | 6 -- netbox/dcim/api/serializers_/roles.py | 4 - netbox/dcim/api/serializers_/sites.py | 8 -- .../dcim/api/serializers_/virtualchassis.py | 2 - netbox/extras/api/nested_serializers.py | 22 ----- netbox/extras/api/serializers_/attachments.py | 1 - netbox/extras/api/serializers_/bookmarks.py | 1 - .../extras/api/serializers_/change_logging.py | 2 - .../extras/api/serializers_/configcontexts.py | 2 - .../api/serializers_/configtemplates.py | 2 - .../extras/api/serializers_/customfields.py | 4 - netbox/extras/api/serializers_/customlinks.py | 2 - netbox/extras/api/serializers_/events.py | 4 - .../api/serializers_/exporttemplates.py | 2 - netbox/extras/api/serializers_/journaling.py | 2 - netbox/extras/api/serializers_/objecttypes.py | 1 - .../extras/api/serializers_/savedfilters.py | 2 - netbox/extras/api/serializers_/scripts.py | 2 - netbox/extras/api/serializers_/tags.py | 2 - netbox/ipam/api/nested_serializers.py | 32 ------- netbox/ipam/api/serializers_/asns.py | 6 -- netbox/ipam/api/serializers_/fhrpgroups.py | 3 - netbox/ipam/api/serializers_/ip.py | 8 -- netbox/ipam/api/serializers_/roles.py | 2 - netbox/ipam/api/serializers_/services.py | 4 - netbox/ipam/api/serializers_/vlans.py | 4 - netbox/ipam/api/serializers_/vrfs.py | 4 - netbox/netbox/api/serializers/base.py | 31 +++++++ netbox/netbox/api/serializers/nested.py | 2 - netbox/tenancy/api/nested_serializers.py | 11 --- netbox/tenancy/api/serializers_/contacts.py | 7 -- netbox/tenancy/api/serializers_/tenants.py | 4 - netbox/users/api/nested_serializers.py | 8 -- netbox/users/api/serializers_/permissions.py | 2 - netbox/users/api/serializers_/tokens.py | 2 - netbox/users/api/serializers_/users.py | 4 - .../virtualization/api/nested_serializers.py | 12 --- .../api/serializers_/clusters.py | 6 -- .../api/serializers_/virtualmachines.py | 6 -- netbox/vpn/api/nested_serializers.py | 48 ----------- netbox/vpn/api/serializers_/crypto.py | 30 ------- netbox/vpn/api/serializers_/l2vpn.py | 4 - netbox/vpn/api/serializers_/tunnels.py | 14 ---- netbox/wireless/api/nested_serializers.py | 6 -- .../wireless/api/serializers_/wirelesslans.py | 4 - .../api/serializers_/wirelesslinks.py | 2 - 61 files changed, 34 insertions(+), 492 deletions(-) diff --git a/docs/plugins/development/rest-api.md b/docs/plugins/development/rest-api.md index d109ff3c562..62dd2c882b5 100644 --- a/docs/plugins/development/rest-api.md +++ b/docs/plugins/development/rest-api.md @@ -27,7 +27,7 @@ Serializers are responsible for converting Python objects to JSON data suitable #### Example -To create a serializer for a plugin model, subclass `NetBoxModelSerializer` in `api/serializers.py`. Specify the model class and the fields to include within the serializer's `Meta` class. It is generally advisable to include a `url` attribute on each serializer. This will render the direct link to access the object being rendered. +To create a serializer for a plugin model, subclass `NetBoxModelSerializer` in `api/serializers.py`. Specify the model class and the fields to include within the serializer's `Meta` class. ```python # api/serializers.py @@ -36,12 +36,7 @@ from netbox.api.serializers import NetBoxModelSerializer from my_plugin.models import MyModel class MyModelSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField( - view_name='plugins-api:myplugin-api:mymodel-detail' - ) - display_url = serializers.HyperlinkedIdentityField( - view_name='plugins:myplugin:mymodel' - ) + foo = SiteSerializer(nested=True, allow_null=True) class Meta: model = MyModel @@ -66,12 +61,7 @@ from netbox.api.serializers import WritableNestedSerializer from my_plugin.models import MyModel class NestedMyModelSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField( - view_name='plugins-api:myplugin-api:mymodel-detail' - ) - display_url = serializers.HyperlinkedIdentityField( - view_name='plugins:myplugin:mymodel' - ) + foo = SiteSerializer(nested=True, allow_null=True) class Meta: model = MyModel diff --git a/netbox/circuits/api/nested_serializers.py b/netbox/circuits/api/nested_serializers.py index eda79d9a32e..4201b37612d 100644 --- a/netbox/circuits/api/nested_serializers.py +++ b/netbox/circuits/api/nested_serializers.py @@ -20,8 +20,6 @@ # class NestedProviderNetworkSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='circuits-api:providernetwork-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='circuits:providernetwork') class Meta: model = ProviderNetwork @@ -36,8 +34,6 @@ class Meta: exclude_fields=('circuit_count',), ) class NestedProviderSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='circuits-api:provider-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='circuits:provider') circuit_count = RelatedObjectCountField('circuits') class Meta: @@ -50,8 +46,6 @@ class Meta: # class NestedProviderAccountSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='circuits-api:provideraccount-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='circuits:provideraccount') class Meta: model = ProviderAccount @@ -66,8 +60,6 @@ class Meta: exclude_fields=('circuit_count',), ) class NestedCircuitTypeSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittype-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='circuits:circuittype') circuit_count = RelatedObjectCountField('circuits') class Meta: @@ -76,8 +68,6 @@ class Meta: class NestedCircuitSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuit-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='circuits:circuit') class Meta: model = Circuit @@ -85,8 +75,6 @@ class Meta: class NestedCircuitTerminationSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittermination-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='circuits:circuittermination') circuit = NestedCircuitSerializer() class Meta: diff --git a/netbox/circuits/api/serializers_/circuits.py b/netbox/circuits/api/serializers_/circuits.py index 220425ecd68..7010bb2c6bb 100644 --- a/netbox/circuits/api/serializers_/circuits.py +++ b/netbox/circuits/api/serializers_/circuits.py @@ -18,8 +18,6 @@ class CircuitTypeSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittype-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='circuits:circuittype') # Related object counts circuit_count = RelatedObjectCountField('circuits') @@ -34,8 +32,6 @@ class Meta: class CircuitCircuitTerminationSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittermination-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='circuits:circuittermination') site = SiteSerializer(nested=True, allow_null=True) provider_network = ProviderNetworkSerializer(nested=True, allow_null=True) @@ -48,8 +44,6 @@ class Meta: class CircuitSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuit-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='circuits:circuit') provider = ProviderSerializer(nested=True) provider_account = ProviderAccountSerializer(nested=True, required=False, allow_null=True, default=None) status = ChoiceField(choices=CircuitStatusChoices, required=False) @@ -69,8 +63,6 @@ class Meta: class CircuitTerminationSerializer(NetBoxModelSerializer, CabledObjectSerializer): - url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittermination-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='circuits:circuittermination') circuit = CircuitSerializer(nested=True) site = SiteSerializer(nested=True, required=False, allow_null=True) provider_network = ProviderNetworkSerializer(nested=True, required=False, allow_null=True) diff --git a/netbox/circuits/api/serializers_/providers.py b/netbox/circuits/api/serializers_/providers.py index 02c74ecf3a5..b0e27754b93 100644 --- a/netbox/circuits/api/serializers_/providers.py +++ b/netbox/circuits/api/serializers_/providers.py @@ -15,8 +15,6 @@ class ProviderSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='circuits-api:provider-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='circuits:provider') accounts = SerializedPKRelatedField( queryset=ProviderAccount.objects.all(), serializer=NestedProviderAccountSerializer, @@ -44,8 +42,6 @@ class Meta: class ProviderAccountSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='circuits-api:provideraccount-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='circuits:provideraccount') provider = ProviderSerializer(nested=True) name = serializers.CharField(allow_blank=True, max_length=100, required=False, default='') @@ -59,8 +55,6 @@ class Meta: class ProviderNetworkSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='circuits-api:providernetwork-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='circuits:providernetwork') provider = ProviderSerializer(nested=True) class Meta: diff --git a/netbox/core/api/nested_serializers.py b/netbox/core/api/nested_serializers.py index b5f249435a4..8e5d3ff6331 100644 --- a/netbox/core/api/nested_serializers.py +++ b/netbox/core/api/nested_serializers.py @@ -14,8 +14,6 @@ class NestedDataSourceSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='core-api:datasource-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='core:datasource') class Meta: model = DataSource @@ -23,8 +21,6 @@ class Meta: class NestedDataFileSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='core-api:datafile-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='core:datafile') class Meta: model = DataFile @@ -32,8 +28,6 @@ class Meta: class NestedJobSerializer(serializers.ModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='core-api:job-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='core:job') status = ChoiceField(choices=JobStatusChoices) user = UserSerializer( nested=True, diff --git a/netbox/core/api/serializers_/data.py b/netbox/core/api/serializers_/data.py index faf22c79a59..eddd45c5831 100644 --- a/netbox/core/api/serializers_/data.py +++ b/netbox/core/api/serializers_/data.py @@ -13,12 +13,6 @@ class DataSourceSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField( - view_name='core-api:datasource-detail' - ) - display_url = serializers.HyperlinkedIdentityField( - view_name='core:datasource' - ) type = ChoiceField( choices=get_data_backend_choices() ) @@ -40,12 +34,6 @@ class Meta: class DataFileSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField( - view_name='core-api:datafile-detail' - ) - display_url = serializers.HyperlinkedIdentityField( - view_name='core:datafile' - ) source = DataSourceSerializer( nested=True, read_only=True diff --git a/netbox/core/api/serializers_/jobs.py b/netbox/core/api/serializers_/jobs.py index 8635e74df16..e5e07aa414b 100644 --- a/netbox/core/api/serializers_/jobs.py +++ b/netbox/core/api/serializers_/jobs.py @@ -12,8 +12,6 @@ class JobSerializer(BaseModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='core-api:job-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='core:job') user = UserSerializer( nested=True, read_only=True diff --git a/netbox/dcim/api/nested_serializers.py b/netbox/dcim/api/nested_serializers.py index 8f4d97d34f9..6aff1bdc915 100644 --- a/netbox/dcim/api/nested_serializers.py +++ b/netbox/dcim/api/nested_serializers.py @@ -57,8 +57,6 @@ exclude_fields=('site_count',), ) class NestedRegionSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:region-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:region') site_count = serializers.IntegerField(read_only=True) _depth = serializers.IntegerField(source='level', read_only=True) @@ -71,8 +69,6 @@ class Meta: exclude_fields=('site_count',), ) class NestedSiteGroupSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:sitegroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:sitegroup') site_count = serializers.IntegerField(read_only=True) _depth = serializers.IntegerField(source='level', read_only=True) @@ -82,8 +78,6 @@ class Meta: class NestedSiteSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:site-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:site') class Meta: model = models.Site @@ -98,8 +92,6 @@ class Meta: exclude_fields=('rack_count',), ) class NestedLocationSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:location-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:location') rack_count = serializers.IntegerField(read_only=True) _depth = serializers.IntegerField(source='level', read_only=True) @@ -112,8 +104,6 @@ class Meta: exclude_fields=('rack_count',), ) class NestedRackRoleSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackrole-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rackrole') rack_count = RelatedObjectCountField('racks') class Meta: @@ -125,8 +115,6 @@ class Meta: exclude_fields=('device_count',), ) class NestedRackSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rack-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rack') device_count = RelatedObjectCountField('devices') class Meta: @@ -135,8 +123,6 @@ class Meta: class NestedRackReservationSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackreservation-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rackreservation') user = serializers.SerializerMethodField(read_only=True) class Meta: @@ -155,8 +141,6 @@ def get_user(self, obj): exclude_fields=('devicetype_count',), ) class NestedManufacturerSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:manufacturer-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:manufacturer') devicetype_count = RelatedObjectCountField('device_types') class Meta: @@ -168,8 +152,6 @@ class Meta: exclude_fields=('device_count',), ) class NestedDeviceTypeSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicetype-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:devicetype') manufacturer = NestedManufacturerSerializer(read_only=True) device_count = RelatedObjectCountField('instances') @@ -179,8 +161,6 @@ class Meta: class NestedModuleTypeSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:moduletype-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:moduletype') manufacturer = NestedManufacturerSerializer(read_only=True) class Meta: @@ -193,8 +173,6 @@ class Meta: # class NestedConsolePortTemplateSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleporttemplate-detail') - display_url = serializers.CharField(allow_null=True, read_only=True) class Meta: model = models.ConsolePortTemplate @@ -202,8 +180,6 @@ class Meta: class NestedConsoleServerPortTemplateSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleserverporttemplate-detail') - display_url = serializers.CharField(allow_null=True, read_only=True) class Meta: model = models.ConsoleServerPortTemplate @@ -211,8 +187,6 @@ class Meta: class NestedPowerPortTemplateSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerporttemplate-detail') - display_url = serializers.CharField(allow_null=True, read_only=True) class Meta: model = models.PowerPortTemplate @@ -220,8 +194,6 @@ class Meta: class NestedPowerOutletTemplateSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:poweroutlettemplate-detail') - display_url = serializers.CharField(allow_null=True, read_only=True) class Meta: model = models.PowerOutletTemplate @@ -229,8 +201,6 @@ class Meta: class NestedInterfaceTemplateSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:interfacetemplate-detail') - display_url = serializers.CharField(allow_null=True, read_only=True) class Meta: model = models.InterfaceTemplate @@ -238,8 +208,6 @@ class Meta: class NestedRearPortTemplateSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearporttemplate-detail') - display_url = serializers.CharField(allow_null=True, read_only=True) class Meta: model = models.RearPortTemplate @@ -247,8 +215,6 @@ class Meta: class NestedFrontPortTemplateSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:frontporttemplate-detail') - display_url = serializers.CharField(allow_null=True, read_only=True) class Meta: model = models.FrontPortTemplate @@ -256,8 +222,6 @@ class Meta: class NestedModuleBayTemplateSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:modulebaytemplate-detail') - display_url = serializers.CharField(allow_null=True, read_only=True) class Meta: model = models.ModuleBayTemplate @@ -265,8 +229,6 @@ class Meta: class NestedDeviceBayTemplateSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicebaytemplate-detail') - display_url = serializers.CharField(allow_null=True, read_only=True) class Meta: model = models.DeviceBayTemplate @@ -274,8 +236,6 @@ class Meta: class NestedInventoryItemTemplateSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitemtemplate-detail') - display_url = serializers.CharField(allow_null=True, read_only=True) _depth = serializers.IntegerField(source='level', read_only=True) class Meta: @@ -291,8 +251,6 @@ class Meta: exclude_fields=('device_count', 'virtualmachine_count'), ) class NestedDeviceRoleSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicerole-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:devicerole') device_count = RelatedObjectCountField('devices') virtualmachine_count = RelatedObjectCountField('virtual_machines') @@ -305,8 +263,6 @@ class Meta: exclude_fields=('device_count', 'virtualmachine_count'), ) class NestedPlatformSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:platform-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:platform') device_count = RelatedObjectCountField('devices') virtualmachine_count = RelatedObjectCountField('virtual_machines') @@ -316,8 +272,6 @@ class Meta: class NestedDeviceSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:device-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:device') class Meta: model = models.Device @@ -325,8 +279,6 @@ class Meta: class ModuleNestedModuleBaySerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:modulebay-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:modulebay') class Meta: model = models.ModuleBay @@ -334,8 +286,6 @@ class Meta: class ModuleBayNestedModuleSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:module-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:module') class Meta: model = models.Module @@ -343,8 +293,6 @@ class Meta: class NestedModuleSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:module-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:module') device = NestedDeviceSerializer(read_only=True) module_bay = ModuleNestedModuleBaySerializer(read_only=True) module_type = NestedModuleTypeSerializer(read_only=True) @@ -355,8 +303,6 @@ class Meta: class NestedConsoleServerPortSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleserverport-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:consoleserverport') device = NestedDeviceSerializer(read_only=True) _occupied = serializers.BooleanField(required=False, read_only=True) @@ -366,8 +312,6 @@ class Meta: class NestedConsolePortSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleport-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:consoleport') device = NestedDeviceSerializer(read_only=True) _occupied = serializers.BooleanField(required=False, read_only=True) @@ -377,8 +321,6 @@ class Meta: class NestedPowerOutletSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:poweroutlet-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:poweroutlet') device = NestedDeviceSerializer(read_only=True) _occupied = serializers.BooleanField(required=False, read_only=True) @@ -388,8 +330,6 @@ class Meta: class NestedPowerPortSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerport-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:powerport') device = NestedDeviceSerializer(read_only=True) _occupied = serializers.BooleanField(required=False, read_only=True) @@ -400,8 +340,6 @@ class Meta: class NestedInterfaceSerializer(WritableNestedSerializer): device = NestedDeviceSerializer(read_only=True) - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:interface-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:interface') _occupied = serializers.BooleanField(required=False, read_only=True) class Meta: @@ -411,8 +349,6 @@ class Meta: class NestedRearPortSerializer(WritableNestedSerializer): device = NestedDeviceSerializer(read_only=True) - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearport-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rearport') _occupied = serializers.BooleanField(required=False, read_only=True) class Meta: @@ -422,8 +358,6 @@ class Meta: class NestedFrontPortSerializer(WritableNestedSerializer): device = NestedDeviceSerializer(read_only=True) - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:frontport-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:frontport') _occupied = serializers.BooleanField(required=False, read_only=True) class Meta: @@ -432,8 +366,6 @@ class Meta: class NestedModuleBaySerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:modulebay-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:modulebay') installed_module = ModuleBayNestedModuleSerializer(required=False, allow_null=True) class Meta: @@ -442,8 +374,6 @@ class Meta: class NestedDeviceBaySerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicebay-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:devicebay') device = NestedDeviceSerializer(read_only=True) class Meta: @@ -452,8 +382,6 @@ class Meta: class NestedInventoryItemSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitem-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:inventoryitem') device = NestedDeviceSerializer(read_only=True) _depth = serializers.IntegerField(source='level', read_only=True) @@ -466,8 +394,6 @@ class Meta: exclude_fields=('inventoryitem_count',), ) class NestedInventoryItemRoleSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitemrole-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:inventoryitemrole') inventoryitem_count = RelatedObjectCountField('inventory_items') class Meta: @@ -480,8 +406,6 @@ class Meta: # class NestedCableSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:cable-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:cable') class Meta: model = models.Cable @@ -496,8 +420,6 @@ class Meta: exclude_fields=('member_count',), ) class NestedVirtualChassisSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:virtualchassis-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:virtualchassis') master = NestedDeviceSerializer() member_count = serializers.IntegerField(read_only=True) @@ -514,8 +436,6 @@ class Meta: exclude_fields=('powerfeed_count',), ) class NestedPowerPanelSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerpanel-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:powerpanel') powerfeed_count = RelatedObjectCountField('powerfeeds') class Meta: @@ -524,8 +444,6 @@ class Meta: class NestedPowerFeedSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerfeed-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:powerfeed') _occupied = serializers.BooleanField(required=False, read_only=True) class Meta: @@ -534,8 +452,6 @@ class Meta: class NestedVirtualDeviceContextSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:virtualdevicecontext-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:virtualdevicecontext') device = NestedDeviceSerializer() class Meta: diff --git a/netbox/dcim/api/serializers_/cables.py b/netbox/dcim/api/serializers_/cables.py index 1881df41aa0..e64efafd78f 100644 --- a/netbox/dcim/api/serializers_/cables.py +++ b/netbox/dcim/api/serializers_/cables.py @@ -21,8 +21,6 @@ class CableSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:cable-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:cable') a_terminations = GenericObjectSerializer(many=True, required=False) b_terminations = GenericObjectSerializer(many=True, required=False) status = ChoiceField(choices=LinkStatusChoices, required=False) @@ -54,7 +52,6 @@ class Meta: class CableTerminationSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:cabletermination-detail') display_url = serializers.CharField(allow_null=True, read_only=True) termination_type = ContentTypeField( queryset=ContentType.objects.filter(CABLE_TERMINATION_MODELS) diff --git a/netbox/dcim/api/serializers_/device_components.py b/netbox/dcim/api/serializers_/device_components.py index 0a842960b43..ab3944723b7 100644 --- a/netbox/dcim/api/serializers_/device_components.py +++ b/netbox/dcim/api/serializers_/device_components.py @@ -41,8 +41,6 @@ class ConsoleServerPortSerializer(NetBoxModelSerializer, CabledObjectSerializer, ConnectedEndpointsSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleserverport-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:consoleserverport') device = DeviceSerializer(nested=True) module = ModuleSerializer( nested=True, @@ -73,8 +71,6 @@ class Meta: class ConsolePortSerializer(NetBoxModelSerializer, CabledObjectSerializer, ConnectedEndpointsSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleport-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:consoleport') device = DeviceSerializer(nested=True) module = ModuleSerializer( nested=True, @@ -105,8 +101,6 @@ class Meta: class PowerPortSerializer(NetBoxModelSerializer, CabledObjectSerializer, ConnectedEndpointsSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerport-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:powerport') device = DeviceSerializer(nested=True) module = ModuleSerializer( nested=True, @@ -133,8 +127,6 @@ class Meta: class PowerOutletSerializer(NetBoxModelSerializer, CabledObjectSerializer, ConnectedEndpointsSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:poweroutlet-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:poweroutlet') device = DeviceSerializer(nested=True) module = ModuleSerializer( nested=True, @@ -172,8 +164,6 @@ class Meta: class InterfaceSerializer(NetBoxModelSerializer, CabledObjectSerializer, ConnectedEndpointsSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:interface-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:interface') device = DeviceSerializer(nested=True) vdcs = SerializedPKRelatedField( queryset=VirtualDeviceContext.objects.all(), @@ -255,8 +245,6 @@ def validate(self, data): class RearPortSerializer(NetBoxModelSerializer, CabledObjectSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearport-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rearport') device = DeviceSerializer(nested=True) module = ModuleSerializer( nested=True, @@ -280,8 +268,6 @@ class FrontPortRearPortSerializer(WritableNestedSerializer): """ NestedRearPortSerializer but with parent device omitted (since front and rear ports must belong to same device) """ - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearport-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rearport') class Meta: model = RearPort @@ -289,8 +275,6 @@ class Meta: class FrontPortSerializer(NetBoxModelSerializer, CabledObjectSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:frontport-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:frontport') device = DeviceSerializer(nested=True) module = ModuleSerializer( nested=True, @@ -312,8 +296,6 @@ class Meta: class ModuleBaySerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:modulebay-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:modulebay') device = DeviceSerializer(nested=True) installed_module = ModuleSerializer( nested=True, @@ -332,8 +314,6 @@ class Meta: class DeviceBaySerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicebay-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:devicebay') device = DeviceSerializer(nested=True) installed_device = DeviceSerializer(nested=True, required=False, allow_null=True) @@ -347,8 +327,6 @@ class Meta: class InventoryItemSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitem-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:inventoryitem') device = DeviceSerializer(nested=True) parent = serializers.PrimaryKeyRelatedField(queryset=InventoryItem.objects.all(), allow_null=True, default=None) role = InventoryItemRoleSerializer(nested=True, required=False, allow_null=True) diff --git a/netbox/dcim/api/serializers_/devices.py b/netbox/dcim/api/serializers_/devices.py index 730b4e60ccf..f4e72f08279 100644 --- a/netbox/dcim/api/serializers_/devices.py +++ b/netbox/dcim/api/serializers_/devices.py @@ -29,8 +29,6 @@ class DeviceSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:device-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:device') device_type = DeviceTypeSerializer(nested=True) role = DeviceRoleSerializer(nested=True) tenant = TenantSerializer( @@ -121,8 +119,6 @@ def get_config_context(self, obj): class VirtualDeviceContextSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:virtualdevicecontext-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:virtualdevicecontext') device = DeviceSerializer(nested=True) identifier = serializers.IntegerField(allow_null=True, max_value=32767, min_value=0, required=False, default=None) tenant = TenantSerializer(nested=True, required=False, allow_null=True, default=None) @@ -145,8 +141,6 @@ class Meta: class ModuleSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:module-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:module') device = DeviceSerializer(nested=True) module_bay = NestedModuleBaySerializer() module_type = ModuleTypeSerializer(nested=True) diff --git a/netbox/dcim/api/serializers_/devicetypes.py b/netbox/dcim/api/serializers_/devicetypes.py index cfe5a19fd4f..a755247db10 100644 --- a/netbox/dcim/api/serializers_/devicetypes.py +++ b/netbox/dcim/api/serializers_/devicetypes.py @@ -17,8 +17,6 @@ class DeviceTypeSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicetype-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:devicetype') manufacturer = ManufacturerSerializer(nested=True) default_platform = PlatformSerializer(nested=True, required=False, allow_null=True) u_height = serializers.DecimalField( @@ -64,8 +62,6 @@ class Meta: class ModuleTypeSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:moduletype-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:moduletype') manufacturer = ManufacturerSerializer(nested=True) weight_unit = ChoiceField(choices=WeightUnitChoices, allow_blank=True, required=False, allow_null=True) diff --git a/netbox/dcim/api/serializers_/manufacturers.py b/netbox/dcim/api/serializers_/manufacturers.py index 671222f27c3..61158e0f75d 100644 --- a/netbox/dcim/api/serializers_/manufacturers.py +++ b/netbox/dcim/api/serializers_/manufacturers.py @@ -10,8 +10,6 @@ class ManufacturerSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:manufacturer-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:manufacturer') # Related object counts devicetype_count = RelatedObjectCountField('device_types') diff --git a/netbox/dcim/api/serializers_/platforms.py b/netbox/dcim/api/serializers_/platforms.py index e61520b63f0..3c846f8fd11 100644 --- a/netbox/dcim/api/serializers_/platforms.py +++ b/netbox/dcim/api/serializers_/platforms.py @@ -12,8 +12,6 @@ class PlatformSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:platform-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:platform') manufacturer = ManufacturerSerializer(nested=True, required=False, allow_null=True) config_template = ConfigTemplateSerializer(nested=True, required=False, allow_null=True, default=None) diff --git a/netbox/dcim/api/serializers_/power.py b/netbox/dcim/api/serializers_/power.py index 601d52348bc..fc65a0732f4 100644 --- a/netbox/dcim/api/serializers_/power.py +++ b/netbox/dcim/api/serializers_/power.py @@ -17,8 +17,6 @@ class PowerPanelSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerpanel-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:powerpanel') site = SiteSerializer(nested=True) location = LocationSerializer( nested=True, @@ -40,8 +38,6 @@ class Meta: class PowerFeedSerializer(NetBoxModelSerializer, CabledObjectSerializer, ConnectedEndpointsSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerfeed-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:powerfeed') power_panel = PowerPanelSerializer(nested=True) rack = RackSerializer( nested=True, diff --git a/netbox/dcim/api/serializers_/racks.py b/netbox/dcim/api/serializers_/racks.py index 6c741918c91..d8d73800195 100644 --- a/netbox/dcim/api/serializers_/racks.py +++ b/netbox/dcim/api/serializers_/racks.py @@ -20,8 +20,6 @@ class RackRoleSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackrole-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rackrole') # Related object counts rack_count = RelatedObjectCountField('racks') @@ -36,8 +34,6 @@ class Meta: class RackSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rack-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rack') site = SiteSerializer(nested=True) location = LocationSerializer(nested=True, required=False, allow_null=True, default=None) tenant = TenantSerializer(nested=True, required=False, allow_null=True) @@ -66,8 +62,6 @@ class Meta: class RackReservationSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackreservation-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:rackreservation') rack = RackSerializer(nested=True) user = UserSerializer(nested=True) tenant = TenantSerializer(nested=True, required=False, allow_null=True) diff --git a/netbox/dcim/api/serializers_/roles.py b/netbox/dcim/api/serializers_/roles.py index aec7f334675..e9c9d35639a 100644 --- a/netbox/dcim/api/serializers_/roles.py +++ b/netbox/dcim/api/serializers_/roles.py @@ -12,8 +12,6 @@ class DeviceRoleSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicerole-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:devicerole') config_template = ConfigTemplateSerializer(nested=True, required=False, allow_null=True, default=None) # Related object counts @@ -30,8 +28,6 @@ class Meta: class InventoryItemRoleSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitemrole-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:inventoryitemrole') # Related object counts inventoryitem_count = RelatedObjectCountField('inventory_items') diff --git a/netbox/dcim/api/serializers_/sites.py b/netbox/dcim/api/serializers_/sites.py index 4cc255cd4f7..f45a1949da7 100644 --- a/netbox/dcim/api/serializers_/sites.py +++ b/netbox/dcim/api/serializers_/sites.py @@ -19,8 +19,6 @@ class RegionSerializer(NestedGroupModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:region-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:region') parent = NestedRegionSerializer(required=False, allow_null=True, default=None) site_count = serializers.IntegerField(read_only=True, default=0) @@ -34,8 +32,6 @@ class Meta: class SiteGroupSerializer(NestedGroupModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:sitegroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:sitegroup') parent = NestedSiteGroupSerializer(required=False, allow_null=True, default=None) site_count = serializers.IntegerField(read_only=True, default=0) @@ -49,8 +45,6 @@ class Meta: class SiteSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:site-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:site') status = ChoiceField(choices=SiteStatusChoices, required=False) region = RegionSerializer(nested=True, required=False, allow_null=True) group = SiteGroupSerializer(nested=True, required=False, allow_null=True) @@ -84,8 +78,6 @@ class Meta: class LocationSerializer(NestedGroupModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:location-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:location') site = SiteSerializer(nested=True) parent = NestedLocationSerializer(required=False, allow_null=True, default=None) status = ChoiceField(choices=LocationStatusChoices, required=False) diff --git a/netbox/dcim/api/serializers_/virtualchassis.py b/netbox/dcim/api/serializers_/virtualchassis.py index 67e3b0f12df..19e94ba8dd3 100644 --- a/netbox/dcim/api/serializers_/virtualchassis.py +++ b/netbox/dcim/api/serializers_/virtualchassis.py @@ -10,8 +10,6 @@ class VirtualChassisSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:virtualchassis-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:virtualchassis') master = NestedDeviceSerializer(required=False, allow_null=True, default=None) members = NestedDeviceSerializer(many=True, read_only=True) diff --git a/netbox/extras/api/nested_serializers.py b/netbox/extras/api/nested_serializers.py index 9368e58995b..5b8394aaa4e 100644 --- a/netbox/extras/api/nested_serializers.py +++ b/netbox/extras/api/nested_serializers.py @@ -22,8 +22,6 @@ class NestedEventRuleSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:eventrule-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:eventrule') class Meta: model = models.EventRule @@ -31,8 +29,6 @@ class Meta: class NestedWebhookSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:webhook-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:webhook') class Meta: model = models.Webhook @@ -40,8 +36,6 @@ class Meta: class NestedCustomFieldSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:customfield-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:customfield') class Meta: model = models.CustomField @@ -49,8 +43,6 @@ class Meta: class NestedCustomFieldChoiceSetSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:customfieldchoiceset-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:customfieldchoiceset') class Meta: model = models.CustomFieldChoiceSet @@ -58,8 +50,6 @@ class Meta: class NestedCustomLinkSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:customlink-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:customlink') class Meta: model = models.CustomLink @@ -67,8 +57,6 @@ class Meta: class NestedConfigContextSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:configcontext-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:configcontext') class Meta: model = models.ConfigContext @@ -76,8 +64,6 @@ class Meta: class NestedConfigTemplateSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:configtemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:configtemplate') class Meta: model = models.ConfigTemplate @@ -85,8 +71,6 @@ class Meta: class NestedExportTemplateSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:exporttemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:exporttemplate') class Meta: model = models.ExportTemplate @@ -94,8 +78,6 @@ class Meta: class NestedSavedFilterSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:savedfilter-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:savedfilter') class Meta: model = models.SavedFilter @@ -103,7 +85,6 @@ class Meta: class NestedBookmarkSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:bookmark-detail') display_url = serializers.CharField(allow_null=True, read_only=True) class Meta: @@ -112,7 +93,6 @@ class Meta: class NestedImageAttachmentSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:imageattachment-detail') display_url = serializers.CharField(allow_null=True, read_only=True) class Meta: @@ -121,8 +101,6 @@ class Meta: class NestedJournalEntrySerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:journalentry-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:journalentry') class Meta: model = models.JournalEntry diff --git a/netbox/extras/api/serializers_/attachments.py b/netbox/extras/api/serializers_/attachments.py index d6955553688..e5b23984935 100644 --- a/netbox/extras/api/serializers_/attachments.py +++ b/netbox/extras/api/serializers_/attachments.py @@ -14,7 +14,6 @@ class ImageAttachmentSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:imageattachment-detail') display_url = serializers.CharField(allow_null=True, read_only=True) object_type = ContentTypeField( queryset=ObjectType.objects.all() diff --git a/netbox/extras/api/serializers_/bookmarks.py b/netbox/extras/api/serializers_/bookmarks.py index ea9cb4e696e..f881658c7a1 100644 --- a/netbox/extras/api/serializers_/bookmarks.py +++ b/netbox/extras/api/serializers_/bookmarks.py @@ -14,7 +14,6 @@ class BookmarkSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:bookmark-detail') display_url = serializers.CharField(allow_null=True, read_only=True) object_type = ContentTypeField( queryset=ObjectType.objects.with_feature('bookmarks'), diff --git a/netbox/extras/api/serializers_/change_logging.py b/netbox/extras/api/serializers_/change_logging.py index dc02e4a5a5e..5dc7a73d393 100644 --- a/netbox/extras/api/serializers_/change_logging.py +++ b/netbox/extras/api/serializers_/change_logging.py @@ -15,8 +15,6 @@ class ObjectChangeSerializer(BaseModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:objectchange-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:objectchange') user = UserSerializer( nested=True, read_only=True diff --git a/netbox/extras/api/serializers_/configcontexts.py b/netbox/extras/api/serializers_/configcontexts.py index e18a8b60571..42a11ffcdb8 100644 --- a/netbox/extras/api/serializers_/configcontexts.py +++ b/netbox/extras/api/serializers_/configcontexts.py @@ -20,8 +20,6 @@ class ConfigContextSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:configcontext-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:configcontext') regions = SerializedPKRelatedField( queryset=Region.objects.all(), serializer=RegionSerializer, diff --git a/netbox/extras/api/serializers_/configtemplates.py b/netbox/extras/api/serializers_/configtemplates.py index c6c2778523f..30d2fb46856 100644 --- a/netbox/extras/api/serializers_/configtemplates.py +++ b/netbox/extras/api/serializers_/configtemplates.py @@ -11,8 +11,6 @@ class ConfigTemplateSerializer(TaggableModelSerializer, ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:configtemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:configtemplate') data_source = DataSourceSerializer( nested=True, required=False diff --git a/netbox/extras/api/serializers_/customfields.py b/netbox/extras/api/serializers_/customfields.py index d2f0af17547..65f866a68a4 100644 --- a/netbox/extras/api/serializers_/customfields.py +++ b/netbox/extras/api/serializers_/customfields.py @@ -16,8 +16,6 @@ class CustomFieldChoiceSetSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:customfieldchoiceset-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:customfieldchoiceset') base_choices = ChoiceField( choices=CustomFieldChoiceSetBaseChoices, required=False @@ -39,8 +37,6 @@ class Meta: class CustomFieldSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:customfield-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:customfield') object_types = ContentTypeField( queryset=ObjectType.objects.with_feature('custom_fields'), many=True diff --git a/netbox/extras/api/serializers_/customlinks.py b/netbox/extras/api/serializers_/customlinks.py index f1728dc4ca0..6391e047139 100644 --- a/netbox/extras/api/serializers_/customlinks.py +++ b/netbox/extras/api/serializers_/customlinks.py @@ -11,8 +11,6 @@ class CustomLinkSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:customlink-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:customlink') object_types = ContentTypeField( queryset=ObjectType.objects.with_feature('custom_links'), many=True diff --git a/netbox/extras/api/serializers_/events.py b/netbox/extras/api/serializers_/events.py index e15b02afa06..6af30e70742 100644 --- a/netbox/extras/api/serializers_/events.py +++ b/netbox/extras/api/serializers_/events.py @@ -21,8 +21,6 @@ # class EventRuleSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:eventrule-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:eventrule') object_types = ContentTypeField( queryset=ObjectType.objects.with_feature('event_rules'), many=True @@ -59,8 +57,6 @@ def get_action_object(self, instance): # class WebhookSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:webhook-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:webhook') class Meta: model = Webhook diff --git a/netbox/extras/api/serializers_/exporttemplates.py b/netbox/extras/api/serializers_/exporttemplates.py index a9d1db10bbf..faef9bb9ef2 100644 --- a/netbox/extras/api/serializers_/exporttemplates.py +++ b/netbox/extras/api/serializers_/exporttemplates.py @@ -12,8 +12,6 @@ class ExportTemplateSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:exporttemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:exporttemplate') object_types = ContentTypeField( queryset=ObjectType.objects.with_feature('export_templates'), many=True diff --git a/netbox/extras/api/serializers_/journaling.py b/netbox/extras/api/serializers_/journaling.py index 721b918faef..4afd3e70acc 100644 --- a/netbox/extras/api/serializers_/journaling.py +++ b/netbox/extras/api/serializers_/journaling.py @@ -16,8 +16,6 @@ class JournalEntrySerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:journalentry-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:journalentry') assigned_object_type = ContentTypeField( queryset=ObjectType.objects.all() ) diff --git a/netbox/extras/api/serializers_/objecttypes.py b/netbox/extras/api/serializers_/objecttypes.py index 9f0b38819bb..c1980c1061a 100644 --- a/netbox/extras/api/serializers_/objecttypes.py +++ b/netbox/extras/api/serializers_/objecttypes.py @@ -9,7 +9,6 @@ class ObjectTypeSerializer(BaseModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:objecttype-detail') display_url = serializers.CharField(allow_null=True, read_only=True) class Meta: diff --git a/netbox/extras/api/serializers_/savedfilters.py b/netbox/extras/api/serializers_/savedfilters.py index 8222ab27542..1403037971f 100644 --- a/netbox/extras/api/serializers_/savedfilters.py +++ b/netbox/extras/api/serializers_/savedfilters.py @@ -11,8 +11,6 @@ class SavedFilterSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:savedfilter-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:savedfilter') object_types = ContentTypeField( queryset=ObjectType.objects.all(), many=True diff --git a/netbox/extras/api/serializers_/scripts.py b/netbox/extras/api/serializers_/scripts.py index 77dddc45f6b..f35b1ea0fc1 100644 --- a/netbox/extras/api/serializers_/scripts.py +++ b/netbox/extras/api/serializers_/scripts.py @@ -14,8 +14,6 @@ class ScriptSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:script-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:script') description = serializers.SerializerMethodField(read_only=True) vars = serializers.SerializerMethodField(read_only=True) result = JobSerializer(nested=True, read_only=True) diff --git a/netbox/extras/api/serializers_/tags.py b/netbox/extras/api/serializers_/tags.py index f84decec543..946ed3c8a85 100644 --- a/netbox/extras/api/serializers_/tags.py +++ b/netbox/extras/api/serializers_/tags.py @@ -11,8 +11,6 @@ class TagSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:tag-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:tag') object_types = ContentTypeField( queryset=ObjectType.objects.with_feature('tags'), many=True, diff --git a/netbox/ipam/api/nested_serializers.py b/netbox/ipam/api/nested_serializers.py index 00f5f1d32ed..95b5ab11df0 100644 --- a/netbox/ipam/api/nested_serializers.py +++ b/netbox/ipam/api/nested_serializers.py @@ -31,8 +31,6 @@ # class NestedASNRangeSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:asnrange-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:asnrange') class Meta: model = models.ASNRange @@ -44,8 +42,6 @@ class Meta: # class NestedASNSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:asn-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:asn') class Meta: model = models.ASN @@ -60,8 +56,6 @@ class Meta: exclude_fields=('prefix_count',), ) class NestedVRFSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vrf-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:vrf') prefix_count = RelatedObjectCountField('prefixes') class Meta: @@ -74,8 +68,6 @@ class Meta: # class NestedRouteTargetSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:routetarget-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:routetarget') class Meta: model = models.RouteTarget @@ -90,8 +82,6 @@ class Meta: exclude_fields=('aggregate_count',), ) class NestedRIRSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:rir-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:rir') aggregate_count = RelatedObjectCountField('aggregates') class Meta: @@ -100,8 +90,6 @@ class Meta: class NestedAggregateSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:aggregate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:aggregate') family = serializers.IntegerField(read_only=True) class Meta: @@ -114,8 +102,6 @@ class Meta: # class NestedFHRPGroupSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:fhrpgroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:fhrpgroup') class Meta: model = models.FHRPGroup @@ -123,8 +109,6 @@ class Meta: class NestedFHRPGroupAssignmentSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:fhrpgroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:fhrpgroup') group = NestedFHRPGroupSerializer() class Meta: @@ -140,8 +124,6 @@ class Meta: exclude_fields=('prefix_count', 'vlan_count'), ) class NestedRoleSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:role-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:role') prefix_count = RelatedObjectCountField('prefixes') vlan_count = RelatedObjectCountField('vlans') @@ -154,8 +136,6 @@ class Meta: exclude_fields=('vlan_count',), ) class NestedVLANGroupSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vlangroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:vlangroup') vlan_count = RelatedObjectCountField('vlans') class Meta: @@ -164,8 +144,6 @@ class Meta: class NestedVLANSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vlan-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:vlan') class Meta: model = models.VLAN @@ -177,8 +155,6 @@ class Meta: # class NestedPrefixSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:prefix-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:prefix') family = serializers.IntegerField(read_only=True) _depth = serializers.IntegerField(read_only=True) @@ -192,8 +168,6 @@ class Meta: # class NestedIPRangeSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:iprange-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:iprange') family = serializers.IntegerField(read_only=True) start_address = IPAddressField() end_address = IPAddressField() @@ -208,8 +182,6 @@ class Meta: # class NestedIPAddressSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:ipaddress-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:ipaddress') family = serializers.IntegerField(read_only=True) address = IPAddressField() @@ -223,8 +195,6 @@ class Meta: # class NestedServiceTemplateSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:servicetemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:servicetemplate') class Meta: model = models.ServiceTemplate @@ -232,8 +202,6 @@ class Meta: class NestedServiceSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:service-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:service') class Meta: model = models.Service diff --git a/netbox/ipam/api/serializers_/asns.py b/netbox/ipam/api/serializers_/asns.py index 13ca47f8c0a..8baa073f558 100644 --- a/netbox/ipam/api/serializers_/asns.py +++ b/netbox/ipam/api/serializers_/asns.py @@ -14,8 +14,6 @@ class RIRSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:rir-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:rir') # Related object counts aggregate_count = RelatedObjectCountField('aggregates') @@ -30,8 +28,6 @@ class Meta: class ASNRangeSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:asnrange-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:asnrange') rir = RIRSerializer(nested=True) tenant = TenantSerializer(nested=True, required=False, allow_null=True) asn_count = serializers.IntegerField(read_only=True) @@ -46,8 +42,6 @@ class Meta: class ASNSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:asn-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:asn') rir = RIRSerializer(nested=True, required=False, allow_null=True) tenant = TenantSerializer(nested=True, required=False, allow_null=True) diff --git a/netbox/ipam/api/serializers_/fhrpgroups.py b/netbox/ipam/api/serializers_/fhrpgroups.py index 4990acf2b60..c11367da575 100644 --- a/netbox/ipam/api/serializers_/fhrpgroups.py +++ b/netbox/ipam/api/serializers_/fhrpgroups.py @@ -15,8 +15,6 @@ class FHRPGroupSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:fhrpgroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:fhrpgroup') ip_addresses = IPAddressSerializer(nested=True, many=True, read_only=True) class Meta: @@ -29,7 +27,6 @@ class Meta: class FHRPGroupAssignmentSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:fhrpgroupassignment-detail') display_url = serializers.CharField(allow_null=True, read_only=True) group = FHRPGroupSerializer(nested=True) interface_type = ContentTypeField( diff --git a/netbox/ipam/api/serializers_/ip.py b/netbox/ipam/api/serializers_/ip.py index c65798474ba..73fd0906442 100644 --- a/netbox/ipam/api/serializers_/ip.py +++ b/netbox/ipam/api/serializers_/ip.py @@ -29,8 +29,6 @@ class AggregateSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:aggregate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:aggregate') family = ChoiceField(choices=IPAddressFamilyChoices, read_only=True) rir = RIRSerializer(nested=True) tenant = TenantSerializer(nested=True, required=False, allow_null=True) @@ -46,8 +44,6 @@ class Meta: class PrefixSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:prefix-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:prefix') family = ChoiceField(choices=IPAddressFamilyChoices, read_only=True) site = SiteSerializer(nested=True, required=False, allow_null=True) vrf = VRFSerializer(nested=True, required=False, allow_null=True) @@ -121,8 +117,6 @@ def to_representation(self, instance): # class IPRangeSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:iprange-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:iprange') family = ChoiceField(choices=IPAddressFamilyChoices, read_only=True) start_address = IPAddressField() end_address = IPAddressField() @@ -146,8 +140,6 @@ class Meta: # class IPAddressSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:ipaddress-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:ipaddress') family = ChoiceField(choices=IPAddressFamilyChoices, read_only=True) address = IPAddressField() vrf = VRFSerializer(nested=True, required=False, allow_null=True) diff --git a/netbox/ipam/api/serializers_/roles.py b/netbox/ipam/api/serializers_/roles.py index e3c79c19a67..9a97a8570e4 100644 --- a/netbox/ipam/api/serializers_/roles.py +++ b/netbox/ipam/api/serializers_/roles.py @@ -10,8 +10,6 @@ class RoleSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:role-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:role') # Related object counts prefix_count = RelatedObjectCountField('prefixes') diff --git a/netbox/ipam/api/serializers_/services.py b/netbox/ipam/api/serializers_/services.py index b08d17121d6..e0b2014f622 100644 --- a/netbox/ipam/api/serializers_/services.py +++ b/netbox/ipam/api/serializers_/services.py @@ -15,8 +15,6 @@ class ServiceTemplateSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:servicetemplate-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:servicetemplate') protocol = ChoiceField(choices=ServiceProtocolChoices, required=False) class Meta: @@ -29,8 +27,6 @@ class Meta: class ServiceSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:service-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:service') device = DeviceSerializer(nested=True, required=False, allow_null=True) virtual_machine = VirtualMachineSerializer(nested=True, required=False, allow_null=True) protocol = ChoiceField(choices=ServiceProtocolChoices, required=False) diff --git a/netbox/ipam/api/serializers_/vlans.py b/netbox/ipam/api/serializers_/vlans.py index bb243365b0e..5525545a86f 100644 --- a/netbox/ipam/api/serializers_/vlans.py +++ b/netbox/ipam/api/serializers_/vlans.py @@ -22,8 +22,6 @@ class VLANGroupSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vlangroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:vlangroup') scope_type = ContentTypeField( queryset=ContentType.objects.filter( model__in=VLANGROUP_SCOPE_TYPES @@ -58,8 +56,6 @@ def get_scope(self, obj): class VLANSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vlan-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:vlan') site = SiteSerializer(nested=True, required=False, allow_null=True) group = VLANGroupSerializer(nested=True, required=False, allow_null=True, default=None) tenant = TenantSerializer(nested=True, required=False, allow_null=True) diff --git a/netbox/ipam/api/serializers_/vrfs.py b/netbox/ipam/api/serializers_/vrfs.py index a316b404b58..ad54dc09557 100644 --- a/netbox/ipam/api/serializers_/vrfs.py +++ b/netbox/ipam/api/serializers_/vrfs.py @@ -12,8 +12,6 @@ class RouteTargetSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:routetarget-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:routetarget') tenant = TenantSerializer(nested=True, required=False, allow_null=True) class Meta: @@ -26,8 +24,6 @@ class Meta: class VRFSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vrf-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='ipam:vrf') tenant = TenantSerializer(nested=True, required=False, allow_null=True) import_targets = SerializedPKRelatedField( queryset=RouteTarget.objects.all(), diff --git a/netbox/netbox/api/serializers/base.py b/netbox/netbox/api/serializers/base.py index 58ef4521972..c6ddc20e3fa 100644 --- a/netbox/netbox/api/serializers/base.py +++ b/netbox/netbox/api/serializers/base.py @@ -13,7 +13,27 @@ ) +class NetBoxApiHyperlinkedIdentityField(serializers.HyperlinkedIdentityField): + + def __init__(self, model, **kwargs): + model_name = model._meta.model_name + app_name = model._meta.app_label + view_name = f'{app_name}-api:{model_name}-detail' + super().__init__(view_name, **kwargs) + + +class NetBoxUrlHyperlinkedIdentityField(serializers.HyperlinkedIdentityField): + + def __init__(self, model, **kwargs): + model_name = model._meta.model_name + app_name = model._meta.app_label + view_name = f'{app_name}:{model_name}' + super().__init__(view_name, **kwargs) + + class BaseModelSerializer(serializers.ModelSerializer): + url = serializers.RelatedField(read_only=True) + display_url = serializers.RelatedField(read_only=True) display = serializers.SerializerMethodField(read_only=True) def __init__(self, *args, nested=False, fields=None, **kwargs): @@ -36,6 +56,17 @@ def __init__(self, *args, nested=False, fields=None, **kwargs): if self.nested and not fields: self._requested_fields = getattr(self.Meta, 'brief_fields', None) + # don't override the field if the class already defines these so can set lookup_field + if ( + "url" in self.fields and not isinstance(self.fields["url"], serializers.HyperlinkedIdentityField) and + isinstance(self.fields["url"], serializers.RelatedField)): + self.fields["url"] = NetBoxApiHyperlinkedIdentityField(self.Meta.model) + if ( + "display_url" in self.fields and not + isinstance(self.fields["display_url"], serializers.HyperlinkedIdentityField) and + isinstance(self.fields["display_url"], serializers.RelatedField)): + self.fields["display_url"] = NetBoxUrlHyperlinkedIdentityField(self.Meta.model) + super().__init__(*args, **kwargs) def to_internal_value(self, data): diff --git a/netbox/netbox/api/serializers/nested.py b/netbox/netbox/api/serializers/nested.py index a9a434d66b7..af4ae35cbed 100644 --- a/netbox/netbox/api/serializers/nested.py +++ b/netbox/netbox/api/serializers/nested.py @@ -23,8 +23,6 @@ def to_internal_value(self, data): # Declared here for use by PrimaryModelSerializer, but should be imported from extras.api.nested_serializers class NestedTagSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:tag-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='extras:tag') class Meta: model = Tag diff --git a/netbox/tenancy/api/nested_serializers.py b/netbox/tenancy/api/nested_serializers.py index ef7a1b03adc..7c2403a3fa3 100644 --- a/netbox/tenancy/api/nested_serializers.py +++ b/netbox/tenancy/api/nested_serializers.py @@ -22,8 +22,6 @@ exclude_fields=('tenant_count',), ) class NestedTenantGroupSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:tenantgroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:tenantgroup') tenant_count = serializers.IntegerField(read_only=True) _depth = serializers.IntegerField(source='level', read_only=True) @@ -33,8 +31,6 @@ class Meta: class NestedTenantSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:tenant-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:tenant') class Meta: model = Tenant @@ -49,8 +45,6 @@ class Meta: exclude_fields=('contact_count',), ) class NestedContactGroupSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:contactgroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:contactgroup') contact_count = serializers.IntegerField(read_only=True) _depth = serializers.IntegerField(source='level', read_only=True) @@ -60,8 +54,6 @@ class Meta: class NestedContactRoleSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:contactrole-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:contactrole') class Meta: model = ContactRole @@ -69,8 +61,6 @@ class Meta: class NestedContactSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:contact-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:contact') class Meta: model = Contact @@ -78,7 +68,6 @@ class Meta: class NestedContactAssignmentSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:contactassignment-detail') display_url = serializers.CharField(allow_null=True, read_only=True) contact = NestedContactSerializer() role = NestedContactRoleSerializer diff --git a/netbox/tenancy/api/serializers_/contacts.py b/netbox/tenancy/api/serializers_/contacts.py index 134638980de..8009cb63fc7 100644 --- a/netbox/tenancy/api/serializers_/contacts.py +++ b/netbox/tenancy/api/serializers_/contacts.py @@ -19,8 +19,6 @@ class ContactGroupSerializer(NestedGroupModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:contactgroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:contactgroup') parent = NestedContactGroupSerializer(required=False, allow_null=True, default=None) contact_count = serializers.IntegerField(read_only=True, default=0) @@ -34,8 +32,6 @@ class Meta: class ContactRoleSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:contactrole-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:contactrole') class Meta: model = ContactRole @@ -47,8 +43,6 @@ class Meta: class ContactSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:contact-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:contact') group = ContactGroupSerializer(nested=True, required=False, allow_null=True, default=None) class Meta: @@ -61,7 +55,6 @@ class Meta: class ContactAssignmentSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:contactassignment-detail') display_url = serializers.CharField(allow_null=True, read_only=True) object_type = ContentTypeField( queryset=ContentType.objects.all() diff --git a/netbox/tenancy/api/serializers_/tenants.py b/netbox/tenancy/api/serializers_/tenants.py index eb31b47a8b7..2ccac0d59a5 100644 --- a/netbox/tenancy/api/serializers_/tenants.py +++ b/netbox/tenancy/api/serializers_/tenants.py @@ -12,8 +12,6 @@ class TenantGroupSerializer(NestedGroupModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:tenantgroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:tenantgroup') parent = NestedTenantGroupSerializer(required=False, allow_null=True) tenant_count = serializers.IntegerField(read_only=True, default=0) @@ -27,8 +25,6 @@ class Meta: class TenantSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:tenant-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='tenancy:tenant') group = TenantGroupSerializer(nested=True, required=False, allow_null=True, default=None) # Related object counts diff --git a/netbox/users/api/nested_serializers.py b/netbox/users/api/nested_serializers.py index 103984634e6..1d14a416953 100644 --- a/netbox/users/api/nested_serializers.py +++ b/netbox/users/api/nested_serializers.py @@ -17,8 +17,6 @@ class NestedGroupSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='users-api:group-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='users:group') class Meta: model = Group @@ -26,8 +24,6 @@ class Meta: class NestedUserSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='users-api:user-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='users:user') class Meta: model = get_user_model() @@ -41,8 +37,6 @@ def get_display(self, obj): class NestedTokenSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='users-api:token-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='users:token') class Meta: model = Token @@ -50,8 +44,6 @@ class Meta: class NestedObjectPermissionSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='users-api:objectpermission-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='users:objectpermission') object_types = ContentTypeField( queryset=ObjectType.objects.all(), many=True diff --git a/netbox/users/api/serializers_/permissions.py b/netbox/users/api/serializers_/permissions.py index f9974e7de91..b6f9de74cfd 100644 --- a/netbox/users/api/serializers_/permissions.py +++ b/netbox/users/api/serializers_/permissions.py @@ -12,8 +12,6 @@ class ObjectPermissionSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='users-api:objectpermission-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='users:objectpermission') object_types = ContentTypeField( queryset=ObjectType.objects.all(), many=True diff --git a/netbox/users/api/serializers_/tokens.py b/netbox/users/api/serializers_/tokens.py index 6c777ccbc39..377573abac6 100644 --- a/netbox/users/api/serializers_/tokens.py +++ b/netbox/users/api/serializers_/tokens.py @@ -15,8 +15,6 @@ class TokenSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='users-api:token-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='users:token') key = serializers.CharField( min_length=40, max_length=40, diff --git a/netbox/users/api/serializers_/users.py b/netbox/users/api/serializers_/users.py index aeeefe9d306..18f1291d11b 100644 --- a/netbox/users/api/serializers_/users.py +++ b/netbox/users/api/serializers_/users.py @@ -15,8 +15,6 @@ class GroupSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='users-api:group-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='users:group') user_count = serializers.IntegerField(read_only=True) permissions = SerializedPKRelatedField( source='object_permissions', @@ -34,8 +32,6 @@ class Meta: class UserSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='users-api:user-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='users:user') groups = SerializedPKRelatedField( queryset=Group.objects.all(), serializer=GroupSerializer, diff --git a/netbox/virtualization/api/nested_serializers.py b/netbox/virtualization/api/nested_serializers.py index c7b5986ad13..4c070c85ce4 100644 --- a/netbox/virtualization/api/nested_serializers.py +++ b/netbox/virtualization/api/nested_serializers.py @@ -23,8 +23,6 @@ exclude_fields=('cluster_count',), ) class NestedClusterTypeSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustertype-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:clustertype') cluster_count = RelatedObjectCountField('clusters') class Meta: @@ -36,8 +34,6 @@ class Meta: exclude_fields=('cluster_count',), ) class NestedClusterGroupSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustergroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:clustergroup') cluster_count = RelatedObjectCountField('clusters') class Meta: @@ -49,8 +45,6 @@ class Meta: exclude_fields=('virtualmachine_count',), ) class NestedClusterSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:cluster-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:cluster') virtualmachine_count = RelatedObjectCountField('virtual_machines') class Meta: @@ -63,8 +57,6 @@ class Meta: # class NestedVirtualMachineSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:virtualmachine-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:virtualmachine') class Meta: model = VirtualMachine @@ -72,8 +64,6 @@ class Meta: class NestedVMInterfaceSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:vminterface-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:vminterface') virtual_machine = NestedVirtualMachineSerializer(read_only=True) class Meta: @@ -82,8 +72,6 @@ class Meta: class NestedVirtualDiskSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:virtualdisk-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:virtualdisk') virtual_machine = NestedVirtualMachineSerializer(read_only=True) class Meta: diff --git a/netbox/virtualization/api/serializers_/clusters.py b/netbox/virtualization/api/serializers_/clusters.py index 3ee50bfadc5..b1648713205 100644 --- a/netbox/virtualization/api/serializers_/clusters.py +++ b/netbox/virtualization/api/serializers_/clusters.py @@ -15,8 +15,6 @@ class ClusterTypeSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustertype-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:clustertype') # Related object counts cluster_count = RelatedObjectCountField('clusters') @@ -31,8 +29,6 @@ class Meta: class ClusterGroupSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustergroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:clustergroup') # Related object counts cluster_count = RelatedObjectCountField('clusters') @@ -47,8 +43,6 @@ class Meta: class ClusterSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:cluster-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:cluster') type = ClusterTypeSerializer(nested=True) group = ClusterGroupSerializer(nested=True, required=False, allow_null=True, default=None) status = ChoiceField(choices=ClusterStatusChoices, required=False) diff --git a/netbox/virtualization/api/serializers_/virtualmachines.py b/netbox/virtualization/api/serializers_/virtualmachines.py index 9cd78b9d9ee..e6b57fc8710 100644 --- a/netbox/virtualization/api/serializers_/virtualmachines.py +++ b/netbox/virtualization/api/serializers_/virtualmachines.py @@ -29,8 +29,6 @@ class VirtualMachineSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:virtualmachine-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:virtualmachine') status = ChoiceField(choices=VirtualMachineStatusChoices, required=False) site = SiteSerializer(nested=True, required=False, allow_null=True, default=None) cluster = ClusterSerializer(nested=True, required=False, allow_null=True, default=None) @@ -79,8 +77,6 @@ def get_config_context(self, obj): # class VMInterfaceSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:vminterface-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:vminterface') virtual_machine = VirtualMachineSerializer(nested=True) parent = NestedVMInterfaceSerializer(required=False, allow_null=True) bridge = NestedVMInterfaceSerializer(required=False, allow_null=True) @@ -131,8 +127,6 @@ def validate(self, data): # class VirtualDiskSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:virtualdisk-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='virtualization:virtualdisk') virtual_machine = VirtualMachineSerializer(nested=True) class Meta: diff --git a/netbox/vpn/api/nested_serializers.py b/netbox/vpn/api/nested_serializers.py index cc911878d8c..2c7e3eb035f 100644 --- a/netbox/vpn/api/nested_serializers.py +++ b/netbox/vpn/api/nested_serializers.py @@ -23,8 +23,6 @@ exclude_fields=('tunnel_count',), ) class NestedTunnelGroupSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='vpn-api:tunnelgroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='vpn:tunnelgroup') tunnel_count = RelatedObjectCountField('tunnels') class Meta: @@ -33,12 +31,6 @@ class Meta: class NestedTunnelSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField( - view_name='vpn-api:tunnel-detail' - ) - display_url = serializers.HyperlinkedIdentityField( - view_name='vpn:tunnel' - ) class Meta: model = models.Tunnel @@ -46,12 +38,6 @@ class Meta: class NestedTunnelTerminationSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField( - view_name='vpn-api:tunneltermination-detail' - ) - display_url = serializers.HyperlinkedIdentityField( - view_name='vpn:tunneltermination' - ) class Meta: model = models.TunnelTermination @@ -59,12 +45,6 @@ class Meta: class NestedIKEProposalSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField( - view_name='vpn-api:ikeproposal-detail' - ) - display_url = serializers.HyperlinkedIdentityField( - view_name='vpn:ikeproposal' - ) class Meta: model = models.IKEProposal @@ -72,12 +52,6 @@ class Meta: class NestedIKEPolicySerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField( - view_name='vpn-api:ikepolicy-detail' - ) - display_url = serializers.HyperlinkedIdentityField( - view_name='vpn:ikepolicy' - ) class Meta: model = models.IKEPolicy @@ -85,12 +59,6 @@ class Meta: class NestedIPSecProposalSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField( - view_name='vpn-api:ipsecproposal-detail' - ) - display_url = serializers.HyperlinkedIdentityField( - view_name='vpn:ipsecproposal' - ) class Meta: model = models.IPSecProposal @@ -98,12 +66,6 @@ class Meta: class NestedIPSecPolicySerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField( - view_name='vpn-api:ipsecpolicy-detail' - ) - display_url = serializers.HyperlinkedIdentityField( - view_name='vpn:ipsecpolicy' - ) class Meta: model = models.IPSecPolicy @@ -111,12 +73,6 @@ class Meta: class NestedIPSecProfileSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField( - view_name='vpn-api:ipsecprofile-detail' - ) - display_url = serializers.HyperlinkedIdentityField( - view_name='vpn:ipsecprofile' - ) class Meta: model = models.IPSecProfile @@ -128,8 +84,6 @@ class Meta: # class NestedL2VPNSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='vpn-api:l2vpn-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='vpn:l2vpn') class Meta: model = models.L2VPN @@ -139,8 +93,6 @@ class Meta: class NestedL2VPNTerminationSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='vpn-api:l2vpntermination-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='vpn:l2vpntermination') l2vpn = NestedL2VPNSerializer() class Meta: diff --git a/netbox/vpn/api/serializers_/crypto.py b/netbox/vpn/api/serializers_/crypto.py index 52e453b2608..27a39055fc2 100644 --- a/netbox/vpn/api/serializers_/crypto.py +++ b/netbox/vpn/api/serializers_/crypto.py @@ -15,12 +15,6 @@ class IKEProposalSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField( - view_name='vpn-api:ikeproposal-detail' - ) - display_url = serializers.HyperlinkedIdentityField( - view_name='vpn:ikeproposal' - ) authentication_method = ChoiceField( choices=AuthenticationMethodChoices ) @@ -45,12 +39,6 @@ class Meta: class IKEPolicySerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField( - view_name='vpn-api:ikepolicy-detail' - ) - display_url = serializers.HyperlinkedIdentityField( - view_name='vpn:ikepolicy' - ) version = ChoiceField( choices=IKEVersionChoices ) @@ -75,12 +63,6 @@ class Meta: class IPSecProposalSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField( - view_name='vpn-api:ipsecproposal-detail' - ) - display_url = serializers.HyperlinkedIdentityField( - view_name='vpn:ipsecproposal' - ) encryption_algorithm = ChoiceField( choices=EncryptionAlgorithmChoices ) @@ -98,12 +80,6 @@ class Meta: class IPSecPolicySerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField( - view_name='vpn-api:ipsecpolicy-detail' - ) - display_url = serializers.HyperlinkedIdentityField( - view_name='vpn:ipsecpolicy' - ) proposals = SerializedPKRelatedField( queryset=IPSecProposal.objects.all(), serializer=IPSecProposalSerializer, @@ -126,12 +102,6 @@ class Meta: class IPSecProfileSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField( - view_name='vpn-api:ipsecprofile-detail' - ) - display_url = serializers.HyperlinkedIdentityField( - view_name='vpn:ipsecprofile' - ) mode = ChoiceField( choices=IPSecModeChoices ) diff --git a/netbox/vpn/api/serializers_/l2vpn.py b/netbox/vpn/api/serializers_/l2vpn.py index 96539b8aaa5..c16cbbe1d4d 100644 --- a/netbox/vpn/api/serializers_/l2vpn.py +++ b/netbox/vpn/api/serializers_/l2vpn.py @@ -18,8 +18,6 @@ class L2VPNSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='vpn-api:l2vpn-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='vpn:l2vpn') type = ChoiceField(choices=L2VPNTypeChoices, required=False) import_targets = SerializedPKRelatedField( queryset=RouteTarget.objects.all(), @@ -47,8 +45,6 @@ class Meta: class L2VPNTerminationSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='vpn-api:l2vpntermination-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='vpn:l2vpntermination') l2vpn = L2VPNSerializer( nested=True ) diff --git a/netbox/vpn/api/serializers_/tunnels.py b/netbox/vpn/api/serializers_/tunnels.py index d463f49ddae..a89766d3f5a 100644 --- a/netbox/vpn/api/serializers_/tunnels.py +++ b/netbox/vpn/api/serializers_/tunnels.py @@ -23,8 +23,6 @@ # class TunnelGroupSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='vpn-api:tunnelgroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='vpn:tunnelgroup') # Related object counts tunnel_count = RelatedObjectCountField('tunnels') @@ -39,12 +37,6 @@ class Meta: class TunnelSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField( - view_name='vpn-api:tunnel-detail' - ) - display_url = serializers.HyperlinkedIdentityField( - view_name='vpn:tunnel' - ) status = ChoiceField( choices=TunnelStatusChoices ) @@ -82,12 +74,6 @@ class Meta: class TunnelTerminationSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField( - view_name='vpn-api:tunneltermination-detail' - ) - display_url = serializers.HyperlinkedIdentityField( - view_name='vpn:tunneltermination' - ) tunnel = TunnelSerializer( nested=True ) diff --git a/netbox/wireless/api/nested_serializers.py b/netbox/wireless/api/nested_serializers.py index e0731e6c97e..8196b982815 100644 --- a/netbox/wireless/api/nested_serializers.py +++ b/netbox/wireless/api/nested_serializers.py @@ -15,8 +15,6 @@ exclude_fields=('wirelesslan_count',), ) class NestedWirelessLANGroupSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='wireless-api:wirelesslangroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='wireless:wirelesslangroup') wirelesslan_count = serializers.IntegerField(read_only=True) _depth = serializers.IntegerField(source='level', read_only=True) @@ -26,8 +24,6 @@ class Meta: class NestedWirelessLANSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='wireless-api:wirelesslan-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='wireless:wirelesslan') class Meta: model = WirelessLAN @@ -35,8 +31,6 @@ class Meta: class NestedWirelessLinkSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='wireless-api:wirelesslink-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='wireless:wirelesslink') class Meta: model = WirelessLink diff --git a/netbox/wireless/api/serializers_/wirelesslans.py b/netbox/wireless/api/serializers_/wirelesslans.py index 08f4f90d9fd..9f6b9c009af 100644 --- a/netbox/wireless/api/serializers_/wirelesslans.py +++ b/netbox/wireless/api/serializers_/wirelesslans.py @@ -15,8 +15,6 @@ class WirelessLANGroupSerializer(NestedGroupModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='wireless-api:wirelesslangroup-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='wireless:wirelesslangroup') parent = NestedWirelessLANGroupSerializer(required=False, allow_null=True, default=None) wirelesslan_count = serializers.IntegerField(read_only=True, default=0) @@ -30,8 +28,6 @@ class Meta: class WirelessLANSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='wireless-api:wirelesslan-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='wireless:wirelesslan') group = WirelessLANGroupSerializer(nested=True, required=False, allow_null=True) status = ChoiceField(choices=WirelessLANStatusChoices, required=False, allow_blank=True) vlan = VLANSerializer(nested=True, required=False, allow_null=True) diff --git a/netbox/wireless/api/serializers_/wirelesslinks.py b/netbox/wireless/api/serializers_/wirelesslinks.py index 880ce9f62f0..2b1075cbe26 100644 --- a/netbox/wireless/api/serializers_/wirelesslinks.py +++ b/netbox/wireless/api/serializers_/wirelesslinks.py @@ -14,8 +14,6 @@ class WirelessLinkSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='wireless-api:wirelesslink-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='wireless:wirelesslink') status = ChoiceField(choices=LinkStatusChoices, required=False) interface_a = InterfaceSerializer(nested=True) interface_b = InterfaceSerializer(nested=True) From bf9a285ad7f99ca1699032a5d883eaad258e08c2 Mon Sep 17 00:00:00 2001 From: Arthur Date: Mon, 10 Jun 2024 15:27:01 -0700 Subject: [PATCH 06/16] 15156 add url display_url to base class --- netbox/netbox/api/serializers/base.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/netbox/netbox/api/serializers/base.py b/netbox/netbox/api/serializers/base.py index c6ddc20e3fa..8f4b96defcd 100644 --- a/netbox/netbox/api/serializers/base.py +++ b/netbox/netbox/api/serializers/base.py @@ -57,12 +57,10 @@ def __init__(self, *args, nested=False, fields=None, **kwargs): self._requested_fields = getattr(self.Meta, 'brief_fields', None) # don't override the field if the class already defines these so can set lookup_field - if ( - "url" in self.fields and not isinstance(self.fields["url"], serializers.HyperlinkedIdentityField) and + if ("url" in self.fields and not isinstance(self.fields["url"], serializers.HyperlinkedIdentityField) and isinstance(self.fields["url"], serializers.RelatedField)): self.fields["url"] = NetBoxApiHyperlinkedIdentityField(self.Meta.model) - if ( - "display_url" in self.fields and not + if ("display_url" in self.fields and not isinstance(self.fields["display_url"], serializers.HyperlinkedIdentityField) and isinstance(self.fields["display_url"], serializers.RelatedField)): self.fields["display_url"] = NetBoxUrlHyperlinkedIdentityField(self.Meta.model) From 10ff487dcbe29bed698a4b2bce7241f8e536ef2d Mon Sep 17 00:00:00 2001 From: Arthur Date: Mon, 10 Jun 2024 16:03:02 -0700 Subject: [PATCH 07/16] 15156 add url display_url to base class --- netbox/extras/api/serializers_/objecttypes.py | 1 + 1 file changed, 1 insertion(+) diff --git a/netbox/extras/api/serializers_/objecttypes.py b/netbox/extras/api/serializers_/objecttypes.py index c1980c1061a..9f0b38819bb 100644 --- a/netbox/extras/api/serializers_/objecttypes.py +++ b/netbox/extras/api/serializers_/objecttypes.py @@ -9,6 +9,7 @@ class ObjectTypeSerializer(BaseModelSerializer): + url = serializers.HyperlinkedIdentityField(view_name='extras-api:objecttype-detail') display_url = serializers.CharField(allow_null=True, read_only=True) class Meta: From f3dbde984f5926f98e0eab97b4263427d9683267 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Fri, 14 Jun 2024 12:07:44 -0700 Subject: [PATCH 08/16] 15156 review changes --- netbox/dcim/api/serializers_/devicetype_components.py | 10 ---------- netbox/extras/webhooks.py | 6 ++++++ netbox/netbox/api/serializers/base.py | 8 ++++---- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/netbox/dcim/api/serializers_/devicetype_components.py b/netbox/dcim/api/serializers_/devicetype_components.py index cd72236f483..48470f62d48 100644 --- a/netbox/dcim/api/serializers_/devicetype_components.py +++ b/netbox/dcim/api/serializers_/devicetype_components.py @@ -32,7 +32,6 @@ class ConsolePortTemplateSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleporttemplate-detail') display_url = serializers.CharField(allow_null=True, read_only=True) device_type = DeviceTypeSerializer( nested=True, @@ -62,7 +61,6 @@ class Meta: class ConsoleServerPortTemplateSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleserverporttemplate-detail') display_url = serializers.CharField(allow_null=True, read_only=True) device_type = DeviceTypeSerializer( nested=True, @@ -92,7 +90,6 @@ class Meta: class PowerPortTemplateSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerporttemplate-detail') display_url = serializers.CharField(allow_null=True, read_only=True) device_type = DeviceTypeSerializer( nested=True, @@ -123,7 +120,6 @@ class Meta: class PowerOutletTemplateSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:poweroutlettemplate-detail') display_url = serializers.CharField(allow_null=True, read_only=True) device_type = DeviceTypeSerializer( nested=True, @@ -165,7 +161,6 @@ class Meta: class InterfaceTemplateSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:interfacetemplate-detail') display_url = serializers.CharField(allow_null=True, read_only=True) device_type = DeviceTypeSerializer( nested=True, @@ -213,7 +208,6 @@ class Meta: class RearPortTemplateSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearporttemplate-detail') display_url = serializers.CharField(allow_null=True, read_only=True) device_type = DeviceTypeSerializer( required=False, @@ -239,7 +233,6 @@ class Meta: class FrontPortTemplateSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:frontporttemplate-detail') display_url = serializers.CharField(allow_null=True, read_only=True) device_type = DeviceTypeSerializer( nested=True, @@ -266,7 +259,6 @@ class Meta: class ModuleBayTemplateSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:modulebaytemplate-detail') display_url = serializers.CharField(allow_null=True, read_only=True) device_type = DeviceTypeSerializer( nested=True @@ -282,7 +274,6 @@ class Meta: class DeviceBayTemplateSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicebaytemplate-detail') display_url = serializers.CharField(allow_null=True, read_only=True) device_type = DeviceTypeSerializer( nested=True @@ -298,7 +289,6 @@ class Meta: class InventoryItemTemplateSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitemtemplate-detail') display_url = serializers.CharField(allow_null=True, read_only=True) device_type = DeviceTypeSerializer( nested=True diff --git a/netbox/extras/webhooks.py b/netbox/extras/webhooks.py index 53ec161d783..64208cc675c 100644 --- a/netbox/extras/webhooks.py +++ b/netbox/extras/webhooks.py @@ -1,6 +1,7 @@ import hashlib import hmac import logging +import json import requests from django.conf import settings @@ -79,6 +80,11 @@ def send_webhook(event_rule, model_name, event, data, timestamp, username, reque logger.error(f"Error forming HTTP request: {e}") raise e + print('--- data ---') + print(json.dumps(data, indent=4)) + print('--- snapshots ---') + print(json.dumps(snapshots, indent=4)) + print("") # If a secret key is defined, sign the request with a hash of the key and its content if webhook.secret != '': prepared_request.headers['X-Hook-Signature'] = generate_signature(prepared_request.body, webhook.secret) diff --git a/netbox/netbox/api/serializers/base.py b/netbox/netbox/api/serializers/base.py index 8f4b96defcd..7ec6e161d7f 100644 --- a/netbox/netbox/api/serializers/base.py +++ b/netbox/netbox/api/serializers/base.py @@ -13,7 +13,7 @@ ) -class NetBoxApiHyperlinkedIdentityField(serializers.HyperlinkedIdentityField): +class NetBoxAPIHyperlinkedIdentityField(serializers.HyperlinkedIdentityField): def __init__(self, model, **kwargs): model_name = model._meta.model_name @@ -22,7 +22,7 @@ def __init__(self, model, **kwargs): super().__init__(view_name, **kwargs) -class NetBoxUrlHyperlinkedIdentityField(serializers.HyperlinkedIdentityField): +class NetBoxURLHyperlinkedIdentityField(serializers.HyperlinkedIdentityField): def __init__(self, model, **kwargs): model_name = model._meta.model_name @@ -59,11 +59,11 @@ def __init__(self, *args, nested=False, fields=None, **kwargs): # don't override the field if the class already defines these so can set lookup_field if ("url" in self.fields and not isinstance(self.fields["url"], serializers.HyperlinkedIdentityField) and isinstance(self.fields["url"], serializers.RelatedField)): - self.fields["url"] = NetBoxApiHyperlinkedIdentityField(self.Meta.model) + self.fields["url"] = NetBoxAPIHyperlinkedIdentityField(self.Meta.model) if ("display_url" in self.fields and not isinstance(self.fields["display_url"], serializers.HyperlinkedIdentityField) and isinstance(self.fields["display_url"], serializers.RelatedField)): - self.fields["display_url"] = NetBoxUrlHyperlinkedIdentityField(self.Meta.model) + self.fields["display_url"] = NetBoxURLHyperlinkedIdentityField(self.Meta.model) super().__init__(*args, **kwargs) From 57ead66e7a8668656c61bc7d5654aac572d96a50 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Fri, 14 Jun 2024 13:25:16 -0700 Subject: [PATCH 09/16] 15156 review changes --- netbox/dcim/api/serializers_/cables.py | 3 +- .../api/serializers_/devicetype_components.py | 30 +++++++------------ 2 files changed, 11 insertions(+), 22 deletions(-) diff --git a/netbox/dcim/api/serializers_/cables.py b/netbox/dcim/api/serializers_/cables.py index e64efafd78f..970d744dc6b 100644 --- a/netbox/dcim/api/serializers_/cables.py +++ b/netbox/dcim/api/serializers_/cables.py @@ -52,7 +52,6 @@ class Meta: class CableTerminationSerializer(NetBoxModelSerializer): - display_url = serializers.CharField(allow_null=True, read_only=True) termination_type = ContentTypeField( queryset=ContentType.objects.filter(CABLE_TERMINATION_MODELS) ) @@ -61,7 +60,7 @@ class CableTerminationSerializer(NetBoxModelSerializer): class Meta: model = CableTermination fields = [ - 'id', 'url', 'display_url', 'display', 'cable', 'cable_end', 'termination_type', 'termination_id', + 'id', 'url', 'display', 'cable', 'cable_end', 'termination_type', 'termination_id', 'termination', 'created', 'last_updated', ] diff --git a/netbox/dcim/api/serializers_/devicetype_components.py b/netbox/dcim/api/serializers_/devicetype_components.py index 48470f62d48..b03fbc63452 100644 --- a/netbox/dcim/api/serializers_/devicetype_components.py +++ b/netbox/dcim/api/serializers_/devicetype_components.py @@ -32,7 +32,6 @@ class ConsolePortTemplateSerializer(ValidatedModelSerializer): - display_url = serializers.CharField(allow_null=True, read_only=True) device_type = DeviceTypeSerializer( nested=True, required=False, @@ -54,14 +53,13 @@ class ConsolePortTemplateSerializer(ValidatedModelSerializer): class Meta: model = ConsolePortTemplate fields = [ - 'id', 'url', 'display_url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', + 'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'description', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') class ConsoleServerPortTemplateSerializer(ValidatedModelSerializer): - display_url = serializers.CharField(allow_null=True, read_only=True) device_type = DeviceTypeSerializer( nested=True, required=False, @@ -83,14 +81,13 @@ class ConsoleServerPortTemplateSerializer(ValidatedModelSerializer): class Meta: model = ConsoleServerPortTemplate fields = [ - 'id', 'url', 'display_url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', + 'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'description', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') class PowerPortTemplateSerializer(ValidatedModelSerializer): - display_url = serializers.CharField(allow_null=True, read_only=True) device_type = DeviceTypeSerializer( nested=True, required=False, @@ -113,14 +110,13 @@ class PowerPortTemplateSerializer(ValidatedModelSerializer): class Meta: model = PowerPortTemplate fields = [ - 'id', 'url', 'display_url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', + 'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'maximum_draw', 'allocated_draw', 'description', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') class PowerOutletTemplateSerializer(ValidatedModelSerializer): - display_url = serializers.CharField(allow_null=True, read_only=True) device_type = DeviceTypeSerializer( nested=True, required=False, @@ -154,14 +150,13 @@ class PowerOutletTemplateSerializer(ValidatedModelSerializer): class Meta: model = PowerOutletTemplate fields = [ - 'id', 'url', 'display_url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', + 'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'power_port', 'feed_leg', 'description', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') class InterfaceTemplateSerializer(ValidatedModelSerializer): - display_url = serializers.CharField(allow_null=True, read_only=True) device_type = DeviceTypeSerializer( nested=True, required=False, @@ -201,14 +196,13 @@ class InterfaceTemplateSerializer(ValidatedModelSerializer): class Meta: model = InterfaceTemplate fields = [ - 'id', 'url', 'display_url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'enabled', + 'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'enabled', 'mgmt_only', 'description', 'bridge', 'poe_mode', 'poe_type', 'rf_role', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') class RearPortTemplateSerializer(ValidatedModelSerializer): - display_url = serializers.CharField(allow_null=True, read_only=True) device_type = DeviceTypeSerializer( required=False, nested=True, @@ -226,14 +220,13 @@ class RearPortTemplateSerializer(ValidatedModelSerializer): class Meta: model = RearPortTemplate fields = [ - 'id', 'url', 'display_url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'color', + 'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'color', 'positions', 'description', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') class FrontPortTemplateSerializer(ValidatedModelSerializer): - display_url = serializers.CharField(allow_null=True, read_only=True) device_type = DeviceTypeSerializer( nested=True, required=False, @@ -252,14 +245,13 @@ class FrontPortTemplateSerializer(ValidatedModelSerializer): class Meta: model = FrontPortTemplate fields = [ - 'id', 'url', 'display_url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'color', + 'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'color', 'rear_port', 'rear_port_position', 'description', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') class ModuleBayTemplateSerializer(ValidatedModelSerializer): - display_url = serializers.CharField(allow_null=True, read_only=True) device_type = DeviceTypeSerializer( nested=True ) @@ -267,14 +259,13 @@ class ModuleBayTemplateSerializer(ValidatedModelSerializer): class Meta: model = ModuleBayTemplate fields = [ - 'id', 'url', 'display_url', 'display', 'device_type', 'name', 'label', 'position', 'description', + 'id', 'url', 'display', 'device_type', 'name', 'label', 'position', 'description', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') class DeviceBayTemplateSerializer(ValidatedModelSerializer): - display_url = serializers.CharField(allow_null=True, read_only=True) device_type = DeviceTypeSerializer( nested=True ) @@ -282,14 +273,13 @@ class DeviceBayTemplateSerializer(ValidatedModelSerializer): class Meta: model = DeviceBayTemplate fields = [ - 'id', 'url', 'display_url', 'display', 'device_type', 'name', 'label', 'description', + 'id', 'url', 'display', 'device_type', 'name', 'label', 'description', 'created', 'last_updated' ] brief_fields = ('id', 'url', 'display', 'name', 'description') class InventoryItemTemplateSerializer(ValidatedModelSerializer): - display_url = serializers.CharField(allow_null=True, read_only=True) device_type = DeviceTypeSerializer( nested=True ) @@ -316,7 +306,7 @@ class InventoryItemTemplateSerializer(ValidatedModelSerializer): class Meta: model = InventoryItemTemplate fields = [ - 'id', 'url', 'display_url', 'display', 'device_type', 'parent', 'name', 'label', 'role', 'manufacturer', + 'id', 'url', 'display', 'device_type', 'parent', 'name', 'label', 'role', 'manufacturer', 'part_id', 'description', 'component_type', 'component_id', 'component', 'created', 'last_updated', '_depth', ] From 46d45b1f1893996ec9e12d30e42eca9c834ea3b8 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Fri, 14 Jun 2024 13:51:14 -0700 Subject: [PATCH 10/16] 15156 review changes --- netbox/netbox/api/serializers/base.py | 59 ++++++++++++++++----------- 1 file changed, 36 insertions(+), 23 deletions(-) diff --git a/netbox/netbox/api/serializers/base.py b/netbox/netbox/api/serializers/base.py index 7ec6e161d7f..6e75b5f875b 100644 --- a/netbox/netbox/api/serializers/base.py +++ b/netbox/netbox/api/serializers/base.py @@ -13,27 +13,49 @@ ) -class NetBoxAPIHyperlinkedIdentityField(serializers.HyperlinkedIdentityField): +class BaseNetBoxHyperlinkedIdentityField(serializers.HyperlinkedIdentityField): + """ + Overrides HyperlinkedIdentityField to use standard NetBox view naming + instead of passing in the view_name. Initialize with a blank view_name + and it will get replaced in the get_url call. Derived classes must + define a get_view_name. + """ + def get_url(self, obj, view_name, request, format): + """ + Given an object, return the URL that hyperlinks to the object. + + May raise a `NoReverseMatch` if the `view_name` and `lookup_field` + attributes are not configured to correctly match the URL conf. + """ + # Unsaved objects will not yet have a valid URL. + if hasattr(obj, 'pk') and obj.pk in (None, ''): + return None + + lookup_value = getattr(obj, self.lookup_field) + kwargs = {self.lookup_url_kwarg: lookup_value} - def __init__(self, model, **kwargs): - model_name = model._meta.model_name - app_name = model._meta.app_label - view_name = f'{app_name}-api:{model_name}-detail' - super().__init__(view_name, **kwargs) + model_name = self.parent.Meta.model._meta.model_name + app_name = self.parent.Meta.model._meta.app_label + view_name = self.get_view_name(app_name, model_name) + return self.reverse(view_name, kwargs=kwargs, request=request, format=format) -class NetBoxURLHyperlinkedIdentityField(serializers.HyperlinkedIdentityField): +class NetBoxAPIHyperlinkedIdentityField(BaseNetBoxHyperlinkedIdentityField): - def __init__(self, model, **kwargs): - model_name = model._meta.model_name - app_name = model._meta.app_label - view_name = f'{app_name}:{model_name}' - super().__init__(view_name, **kwargs) + def get_view_name(self, app_name, model_name): + return f'{app_name}-api:{model_name}-detail' + + + +class NetBoxURLHyperlinkedIdentityField(BaseNetBoxHyperlinkedIdentityField): + + def get_view_name(self, app_name, model_name): + return f'{app_name}:{model_name}' class BaseModelSerializer(serializers.ModelSerializer): - url = serializers.RelatedField(read_only=True) - display_url = serializers.RelatedField(read_only=True) + url = NetBoxAPIHyperlinkedIdentityField(view_name="") + display_url = NetBoxURLHyperlinkedIdentityField(view_name="") display = serializers.SerializerMethodField(read_only=True) def __init__(self, *args, nested=False, fields=None, **kwargs): @@ -56,15 +78,6 @@ def __init__(self, *args, nested=False, fields=None, **kwargs): if self.nested and not fields: self._requested_fields = getattr(self.Meta, 'brief_fields', None) - # don't override the field if the class already defines these so can set lookup_field - if ("url" in self.fields and not isinstance(self.fields["url"], serializers.HyperlinkedIdentityField) and - isinstance(self.fields["url"], serializers.RelatedField)): - self.fields["url"] = NetBoxAPIHyperlinkedIdentityField(self.Meta.model) - if ("display_url" in self.fields and not - isinstance(self.fields["display_url"], serializers.HyperlinkedIdentityField) and - isinstance(self.fields["display_url"], serializers.RelatedField)): - self.fields["display_url"] = NetBoxURLHyperlinkedIdentityField(self.Meta.model) - super().__init__(*args, **kwargs) def to_internal_value(self, data): From 619e9eb3143871a5864cdcf1411a5666723ba8c5 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Fri, 14 Jun 2024 14:11:14 -0700 Subject: [PATCH 11/16] 15156 review changes --- netbox/netbox/api/serializers/base.py | 1 - 1 file changed, 1 deletion(-) diff --git a/netbox/netbox/api/serializers/base.py b/netbox/netbox/api/serializers/base.py index 6e75b5f875b..46f06544bfd 100644 --- a/netbox/netbox/api/serializers/base.py +++ b/netbox/netbox/api/serializers/base.py @@ -46,7 +46,6 @@ def get_view_name(self, app_name, model_name): return f'{app_name}-api:{model_name}-detail' - class NetBoxURLHyperlinkedIdentityField(BaseNetBoxHyperlinkedIdentityField): def get_view_name(self, app_name, model_name): From ff2468cc9fe4d4e9866c43847f0709c18bab6f4f Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Fri, 14 Jun 2024 15:15:11 -0700 Subject: [PATCH 12/16] 15156 remove bogus code --- netbox/extras/webhooks.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/netbox/extras/webhooks.py b/netbox/extras/webhooks.py index 64208cc675c..3d9b911e8e4 100644 --- a/netbox/extras/webhooks.py +++ b/netbox/extras/webhooks.py @@ -80,11 +80,6 @@ def send_webhook(event_rule, model_name, event, data, timestamp, username, reque logger.error(f"Error forming HTTP request: {e}") raise e - print('--- data ---') - print(json.dumps(data, indent=4)) - print('--- snapshots ---') - print(json.dumps(snapshots, indent=4)) - print("") # If a secret key is defined, sign the request with a hash of the key and its content if webhook.secret != '': prepared_request.headers['X-Hook-Signature'] = generate_signature(prepared_request.body, webhook.secret) From 8b500baa612c11b7e76ca312d63f7330ae345b38 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Fri, 14 Jun 2024 15:16:13 -0700 Subject: [PATCH 13/16] 15156 remove bogus code --- netbox/extras/webhooks.py | 1 - 1 file changed, 1 deletion(-) diff --git a/netbox/extras/webhooks.py b/netbox/extras/webhooks.py index 3d9b911e8e4..53ec161d783 100644 --- a/netbox/extras/webhooks.py +++ b/netbox/extras/webhooks.py @@ -1,7 +1,6 @@ import hashlib import hmac import logging -import json import requests from django.conf import settings From 1ff4e165e37610538053bc96accef838080af607 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Thu, 20 Jun 2024 09:30:54 -0700 Subject: [PATCH 14/16] 15156 review changes --- netbox/dcim/api/serializers_/cables.py | 6 ++---- netbox/extras/api/nested_serializers.py | 6 ++---- netbox/extras/api/serializers_/attachments.py | 3 +-- netbox/extras/api/serializers_/bookmarks.py | 3 +-- netbox/extras/api/serializers_/objecttypes.py | 3 +-- netbox/ipam/api/serializers_/fhrpgroups.py | 3 +-- netbox/tenancy/api/nested_serializers.py | 3 +-- netbox/tenancy/api/serializers_/contacts.py | 3 +-- 8 files changed, 10 insertions(+), 20 deletions(-) diff --git a/netbox/dcim/api/serializers_/cables.py b/netbox/dcim/api/serializers_/cables.py index 970d744dc6b..53dc3a0d671 100644 --- a/netbox/dcim/api/serializers_/cables.py +++ b/netbox/dcim/api/serializers_/cables.py @@ -7,7 +7,7 @@ from dcim.constants import * from dcim.models import Cable, CablePath, CableTermination from netbox.api.fields import ChoiceField, ContentTypeField -from netbox.api.serializers import GenericObjectSerializer, NetBoxModelSerializer +from netbox.api.serializers import BaseModelSerializer, GenericObjectSerializer, NetBoxModelSerializer from tenancy.api.serializers_.tenants import TenantSerializer from utilities.api import get_serializer_for_model @@ -37,12 +37,10 @@ class Meta: brief_fields = ('id', 'url', 'display', 'label', 'description') -class TracedCableSerializer(serializers.ModelSerializer): +class TracedCableSerializer(BaseModelSerializer): """ Used only while tracing a cable path. """ - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:cable-detail') - display_url = serializers.HyperlinkedIdentityField(view_name='dcim:cable') class Meta: model = Cable diff --git a/netbox/extras/api/nested_serializers.py b/netbox/extras/api/nested_serializers.py index 5b8394aaa4e..3904493c08a 100644 --- a/netbox/extras/api/nested_serializers.py +++ b/netbox/extras/api/nested_serializers.py @@ -85,19 +85,17 @@ class Meta: class NestedBookmarkSerializer(WritableNestedSerializer): - display_url = serializers.CharField(allow_null=True, read_only=True) class Meta: model = models.Bookmark - fields = ['id', 'url', 'display_url', 'display', 'object_id', 'object_type'] + fields = ['id', 'url', 'display', 'object_id', 'object_type'] class NestedImageAttachmentSerializer(WritableNestedSerializer): - display_url = serializers.CharField(allow_null=True, read_only=True) class Meta: model = models.ImageAttachment - fields = ['id', 'url', 'display_url', 'display', 'name', 'image'] + fields = ['id', 'url', 'display', 'name', 'image'] class NestedJournalEntrySerializer(WritableNestedSerializer): diff --git a/netbox/extras/api/serializers_/attachments.py b/netbox/extras/api/serializers_/attachments.py index e5b23984935..0c6ce1f3ad1 100644 --- a/netbox/extras/api/serializers_/attachments.py +++ b/netbox/extras/api/serializers_/attachments.py @@ -14,7 +14,6 @@ class ImageAttachmentSerializer(ValidatedModelSerializer): - display_url = serializers.CharField(allow_null=True, read_only=True) object_type = ContentTypeField( queryset=ObjectType.objects.all() ) @@ -23,7 +22,7 @@ class ImageAttachmentSerializer(ValidatedModelSerializer): class Meta: model = ImageAttachment fields = [ - 'id', 'url', 'display_url', 'display', 'object_type', 'object_id', 'parent', 'name', 'image', + 'id', 'url', 'display', 'object_type', 'object_id', 'parent', 'name', 'image', 'image_height', 'image_width', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'image') diff --git a/netbox/extras/api/serializers_/bookmarks.py b/netbox/extras/api/serializers_/bookmarks.py index f881658c7a1..a404d83c347 100644 --- a/netbox/extras/api/serializers_/bookmarks.py +++ b/netbox/extras/api/serializers_/bookmarks.py @@ -14,7 +14,6 @@ class BookmarkSerializer(ValidatedModelSerializer): - display_url = serializers.CharField(allow_null=True, read_only=True) object_type = ContentTypeField( queryset=ObjectType.objects.with_feature('bookmarks'), ) @@ -24,7 +23,7 @@ class BookmarkSerializer(ValidatedModelSerializer): class Meta: model = Bookmark fields = [ - 'id', 'url', 'display_url', 'display', 'object_type', 'object_id', 'object', 'user', 'created', + 'id', 'url', 'display', 'object_type', 'object_id', 'object', 'user', 'created', ] brief_fields = ('id', 'url', 'display', 'object_id', 'object_type') diff --git a/netbox/extras/api/serializers_/objecttypes.py b/netbox/extras/api/serializers_/objecttypes.py index 9f0b38819bb..8e480665234 100644 --- a/netbox/extras/api/serializers_/objecttypes.py +++ b/netbox/extras/api/serializers_/objecttypes.py @@ -10,8 +10,7 @@ class ObjectTypeSerializer(BaseModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:objecttype-detail') - display_url = serializers.CharField(allow_null=True, read_only=True) class Meta: model = ObjectType - fields = ['id', 'url', 'display_url', 'display', 'app_label', 'model'] + fields = ['id', 'url', 'display', 'app_label', 'model'] diff --git a/netbox/ipam/api/serializers_/fhrpgroups.py b/netbox/ipam/api/serializers_/fhrpgroups.py index c11367da575..b5bebbc9566 100644 --- a/netbox/ipam/api/serializers_/fhrpgroups.py +++ b/netbox/ipam/api/serializers_/fhrpgroups.py @@ -27,7 +27,6 @@ class Meta: class FHRPGroupAssignmentSerializer(NetBoxModelSerializer): - display_url = serializers.CharField(allow_null=True, read_only=True) group = FHRPGroupSerializer(nested=True) interface_type = ContentTypeField( queryset=ContentType.objects.all() @@ -37,7 +36,7 @@ class FHRPGroupAssignmentSerializer(NetBoxModelSerializer): class Meta: model = FHRPGroupAssignment fields = [ - 'id', 'url', 'display_url', 'display', 'group', 'interface_type', 'interface_id', 'interface', + 'id', 'url', 'display', 'group', 'interface_type', 'interface_id', 'interface', 'priority', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'group', 'interface_type', 'interface_id', 'priority') diff --git a/netbox/tenancy/api/nested_serializers.py b/netbox/tenancy/api/nested_serializers.py index 7c2403a3fa3..d88e969aabd 100644 --- a/netbox/tenancy/api/nested_serializers.py +++ b/netbox/tenancy/api/nested_serializers.py @@ -68,10 +68,9 @@ class Meta: class NestedContactAssignmentSerializer(WritableNestedSerializer): - display_url = serializers.CharField(allow_null=True, read_only=True) contact = NestedContactSerializer() role = NestedContactRoleSerializer class Meta: model = ContactAssignment - fields = ['id', 'url', 'display_url', 'display', 'contact', 'role', 'priority'] + fields = ['id', 'url', 'display', 'contact', 'role', 'priority'] diff --git a/netbox/tenancy/api/serializers_/contacts.py b/netbox/tenancy/api/serializers_/contacts.py index 8009cb63fc7..b19622e1469 100644 --- a/netbox/tenancy/api/serializers_/contacts.py +++ b/netbox/tenancy/api/serializers_/contacts.py @@ -55,7 +55,6 @@ class Meta: class ContactAssignmentSerializer(NetBoxModelSerializer): - display_url = serializers.CharField(allow_null=True, read_only=True) object_type = ContentTypeField( queryset=ContentType.objects.all() ) @@ -67,7 +66,7 @@ class ContactAssignmentSerializer(NetBoxModelSerializer): class Meta: model = ContactAssignment fields = [ - 'id', 'url', 'display_url', 'display', 'object_type', 'object_id', 'object', 'contact', 'role', 'priority', + 'id', 'url', 'display', 'object_type', 'object_id', 'object', 'contact', 'role', 'priority', 'tags', 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'contact', 'role', 'priority') From 0447572d5bf0616f57743da977898048c0055f62 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Thu, 20 Jun 2024 09:34:03 -0700 Subject: [PATCH 15/16] 15156 review changes --- netbox/netbox/api/serializers/base.py | 40 +--------------------- netbox/netbox/api/serializers/fields.py | 45 +++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 39 deletions(-) create mode 100644 netbox/netbox/api/serializers/fields.py diff --git a/netbox/netbox/api/serializers/base.py b/netbox/netbox/api/serializers/base.py index 46f06544bfd..622e54a635c 100644 --- a/netbox/netbox/api/serializers/base.py +++ b/netbox/netbox/api/serializers/base.py @@ -6,6 +6,7 @@ from drf_spectacular.types import OpenApiTypes from utilities.api import get_related_object_by_attrs +from .fields import NetBoxAPIHyperlinkedIdentityField, NetBoxURLHyperlinkedIdentityField __all__ = ( 'BaseModelSerializer', @@ -13,45 +14,6 @@ ) -class BaseNetBoxHyperlinkedIdentityField(serializers.HyperlinkedIdentityField): - """ - Overrides HyperlinkedIdentityField to use standard NetBox view naming - instead of passing in the view_name. Initialize with a blank view_name - and it will get replaced in the get_url call. Derived classes must - define a get_view_name. - """ - def get_url(self, obj, view_name, request, format): - """ - Given an object, return the URL that hyperlinks to the object. - - May raise a `NoReverseMatch` if the `view_name` and `lookup_field` - attributes are not configured to correctly match the URL conf. - """ - # Unsaved objects will not yet have a valid URL. - if hasattr(obj, 'pk') and obj.pk in (None, ''): - return None - - lookup_value = getattr(obj, self.lookup_field) - kwargs = {self.lookup_url_kwarg: lookup_value} - - model_name = self.parent.Meta.model._meta.model_name - app_name = self.parent.Meta.model._meta.app_label - view_name = self.get_view_name(app_name, model_name) - return self.reverse(view_name, kwargs=kwargs, request=request, format=format) - - -class NetBoxAPIHyperlinkedIdentityField(BaseNetBoxHyperlinkedIdentityField): - - def get_view_name(self, app_name, model_name): - return f'{app_name}-api:{model_name}-detail' - - -class NetBoxURLHyperlinkedIdentityField(BaseNetBoxHyperlinkedIdentityField): - - def get_view_name(self, app_name, model_name): - return f'{app_name}:{model_name}' - - class BaseModelSerializer(serializers.ModelSerializer): url = NetBoxAPIHyperlinkedIdentityField(view_name="") display_url = NetBoxURLHyperlinkedIdentityField(view_name="") diff --git a/netbox/netbox/api/serializers/fields.py b/netbox/netbox/api/serializers/fields.py new file mode 100644 index 00000000000..d03344bef28 --- /dev/null +++ b/netbox/netbox/api/serializers/fields.py @@ -0,0 +1,45 @@ +from rest_framework import serializers + +__all__ = ( + 'NetBoxAPIHyperlinkedIdentityField', + 'NetBoxURLHyperlinkedIdentityField', +) + + +class BaseNetBoxHyperlinkedIdentityField(serializers.HyperlinkedIdentityField): + """ + Overrides HyperlinkedIdentityField to use standard NetBox view naming + instead of passing in the view_name. Initialize with a blank view_name + and it will get replaced in the get_url call. Derived classes must + define a get_view_name. + """ + def get_url(self, obj, view_name, request, format): + """ + Given an object, return the URL that hyperlinks to the object. + + May raise a `NoReverseMatch` if the `view_name` and `lookup_field` + attributes are not configured to correctly match the URL conf. + """ + # Unsaved objects will not yet have a valid URL. + if hasattr(obj, 'pk') and obj.pk in (None, ''): + return None + + lookup_value = getattr(obj, self.lookup_field) + kwargs = {self.lookup_url_kwarg: lookup_value} + + model_name = self.parent.Meta.model._meta.model_name + app_name = self.parent.Meta.model._meta.app_label + view_name = self.get_view_name(app_name, model_name) + return self.reverse(view_name, kwargs=kwargs, request=request, format=format) + + +class NetBoxAPIHyperlinkedIdentityField(BaseNetBoxHyperlinkedIdentityField): + + def get_view_name(self, app_name, model_name): + return f'{app_name}-api:{model_name}-detail' + + +class NetBoxURLHyperlinkedIdentityField(BaseNetBoxHyperlinkedIdentityField): + + def get_view_name(self, app_name, model_name): + return f'{app_name}:{model_name}' From 7362fd8a972044c2943ae7195a62c25a70aeb267 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Thu, 20 Jun 2024 09:40:42 -0700 Subject: [PATCH 16/16] 15156 review changes --- netbox/netbox/api/serializers/base.py | 4 ++-- netbox/netbox/api/serializers/fields.py | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/netbox/netbox/api/serializers/base.py b/netbox/netbox/api/serializers/base.py index 622e54a635c..8115fe020a5 100644 --- a/netbox/netbox/api/serializers/base.py +++ b/netbox/netbox/api/serializers/base.py @@ -15,8 +15,8 @@ class BaseModelSerializer(serializers.ModelSerializer): - url = NetBoxAPIHyperlinkedIdentityField(view_name="") - display_url = NetBoxURLHyperlinkedIdentityField(view_name="") + url = NetBoxAPIHyperlinkedIdentityField() + display_url = NetBoxURLHyperlinkedIdentityField() display = serializers.SerializerMethodField(read_only=True) def __init__(self, *args, nested=False, fields=None, **kwargs): diff --git a/netbox/netbox/api/serializers/fields.py b/netbox/netbox/api/serializers/fields.py index d03344bef28..4fee3604376 100644 --- a/netbox/netbox/api/serializers/fields.py +++ b/netbox/netbox/api/serializers/fields.py @@ -13,6 +13,9 @@ class BaseNetBoxHyperlinkedIdentityField(serializers.HyperlinkedIdentityField): and it will get replaced in the get_url call. Derived classes must define a get_view_name. """ + def __init__(self, *args, **kwargs): + super().__init__(view_name="", *args, **kwargs) + def get_url(self, obj, view_name, request, format): """ Given an object, return the URL that hyperlinks to the object. @@ -32,6 +35,11 @@ def get_url(self, obj, view_name, request, format): view_name = self.get_view_name(app_name, model_name) return self.reverse(view_name, kwargs=kwargs, request=request, format=format) + def get_view_name(self, app_name, model_name): + raise NotImplementedError(_('{class_name} must implement get_view_name()').format( + class_name=self.__class__.__name__ + )) + class NetBoxAPIHyperlinkedIdentityField(BaseNetBoxHyperlinkedIdentityField):