diff --git a/docs/plugins/development/rest-api.md b/docs/plugins/development/rest-api.md index ea195dafc..1563ae1c5 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 36254dc8b..37e91105b 100644 --- a/netbox/circuits/api/nested_serializers.py +++ b/netbox/circuits/api/nested_serializers.py @@ -21,10 +21,11 @@ __all__ = [ 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 NestedProviderNetworkSerializer(WritableNestedSerializer): ) 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 NestedProviderSerializer(WritableNestedSerializer): 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 NestedProviderAccountSerializer(WritableNestedSerializer): ) 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 a0d0e5e13..d431416a5 100644 --- a/netbox/circuits/api/serializers_/circuits.py +++ b/netbox/circuits/api/serializers_/circuits.py @@ -19,6 +19,7 @@ __all__ = ( 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 fa4489787..6e9eee1f0 100644 --- a/netbox/circuits/api/serializers_/providers.py +++ b/netbox/circuits/api/serializers_/providers.py @@ -16,6 +16,7 @@ __all__ = ( 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 efb748ee0..28a8b1e70 100644 --- a/netbox/core/api/nested_serializers.py +++ b/netbox/core/api/nested_serializers.py @@ -15,22 +15,25 @@ __all__ = ( 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 e60d8d95b..0832a06e1 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 84afa3627..2edf60949 100644 --- a/netbox/core/api/serializers_/jobs.py +++ b/netbox/core/api/serializers_/jobs.py @@ -13,6 +13,7 @@ __all__ = ( 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 bcb141a71..a59316be8 100644 --- a/netbox/dcim/api/nested_serializers.py +++ b/netbox/dcim/api/nested_serializers.py @@ -58,12 +58,13 @@ __all__ = [ ) 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 NestedRegionSerializer(WritableNestedSerializer): ) 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 NestedSiteSerializer(WritableNestedSerializer): ) 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 NestedLocationSerializer(WritableNestedSerializer): ) 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 NestedRackRoleSerializer(WritableNestedSerializer): ) 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 @@ class NestedRackReservationSerializer(WritableNestedSerializer): ) 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 NestedManufacturerSerializer(WritableNestedSerializer): ) 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 NestedModuleTypeSerializer(WritableNestedSerializer): 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 NestedInventoryItemTemplateSerializer(WritableNestedSerializer): ) 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 NestedDeviceRoleSerializer(WritableNestedSerializer): ) 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 NestedInventoryItemSerializer(WritableNestedSerializer): ) 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 NestedInventoryItemRoleSerializer(WritableNestedSerializer): 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 NestedCableSerializer(WritableNestedSerializer): ) 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 NestedVirtualChassisSerializer(WritableNestedSerializer): ) 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 94a125d0c..bd408aa66 100644 --- a/netbox/dcim/api/serializers_/cables.py +++ b/netbox/dcim/api/serializers_/cables.py @@ -22,6 +22,7 @@ __all__ = ( 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 fd32d95d0..11d2a362a 100644 --- a/netbox/dcim/api/serializers_/device_components.py +++ b/netbox/dcim/api/serializers_/device_components.py @@ -42,6 +42,7 @@ __all__ = ( 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 ConsoleServerPortSerializer(NetBoxModelSerializer, CabledObjectSerializer, 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 ConsolePortSerializer(NetBoxModelSerializer, CabledObjectSerializer, Conne 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 PowerPortSerializer(NetBoxModelSerializer, CabledObjectSerializer, Connect 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 PowerOutletSerializer(NetBoxModelSerializer, CabledObjectSerializer, Conne 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 @@ class InterfaceSerializer(NetBoxModelSerializer, CabledObjectSerializer, Connect 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 FrontPortSerializer(NetBoxModelSerializer, CabledObjectSerializer): 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 edfac3072..c3e46fbbd 100644 --- a/netbox/dcim/api/serializers_/devices.py +++ b/netbox/dcim/api/serializers_/devices.py @@ -30,6 +30,7 @@ __all__ = ( 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 @@ class DeviceWithConfigContextSerializer(DeviceSerializer): 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 ca737ce38..72fe88622 100644 --- a/netbox/dcim/api/serializers_/devicetype_components.py +++ b/netbox/dcim/api/serializers_/devicetype_components.py @@ -33,6 +33,7 @@ __all__ = ( 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 a5830fa90..1b685b368 100644 --- a/netbox/dcim/api/serializers_/devicetypes.py +++ b/netbox/dcim/api/serializers_/devicetypes.py @@ -18,6 +18,7 @@ __all__ = ( 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 fd50fe97d..814c05177 100644 --- a/netbox/dcim/api/serializers_/manufacturers.py +++ b/netbox/dcim/api/serializers_/manufacturers.py @@ -11,6 +11,7 @@ __all__ = ( 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 7365404eb..3de1e88f7 100644 --- a/netbox/dcim/api/serializers_/platforms.py +++ b/netbox/dcim/api/serializers_/platforms.py @@ -13,6 +13,7 @@ __all__ = ( 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 dddd54906..a83dda0e4 100644 --- a/netbox/dcim/api/serializers_/power.py +++ b/netbox/dcim/api/serializers_/power.py @@ -18,6 +18,7 @@ __all__ = ( 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 a6754cba0..2483208d1 100644 --- a/netbox/dcim/api/serializers_/racks.py +++ b/netbox/dcim/api/serializers_/racks.py @@ -21,6 +21,7 @@ __all__ = ( 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 41f8f377d..fbb2799a6 100644 --- a/netbox/dcim/api/serializers_/roles.py +++ b/netbox/dcim/api/serializers_/roles.py @@ -13,6 +13,7 @@ __all__ = ( 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 60e1477e5..4e23b1a09 100644 --- a/netbox/dcim/api/serializers_/sites.py +++ b/netbox/dcim/api/serializers_/sites.py @@ -20,34 +20,37 @@ __all__ = ( 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 5a5917119..a033bc0ab 100644 --- a/netbox/dcim/api/serializers_/virtualchassis.py +++ b/netbox/dcim/api/serializers_/virtualchassis.py @@ -11,6 +11,7 @@ __all__ = ( 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 4bada494f..17901c73c 100644 --- a/netbox/extras/api/nested_serializers.py +++ b/netbox/extras/api/nested_serializers.py @@ -23,98 +23,110 @@ __all__ = [ 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 bcf3a24ec..adb8d6f1e 100644 --- a/netbox/extras/api/serializers_/attachments.py +++ b/netbox/extras/api/serializers_/attachments.py @@ -15,6 +15,7 @@ __all__ = ( 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 7a2d4d6aa..0b85a68cd 100644 --- a/netbox/extras/api/serializers_/bookmarks.py +++ b/netbox/extras/api/serializers_/bookmarks.py @@ -15,6 +15,7 @@ __all__ = ( 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 46fb901ff..e312a866a 100644 --- a/netbox/extras/api/serializers_/change_logging.py +++ b/netbox/extras/api/serializers_/change_logging.py @@ -16,6 +16,7 @@ __all__ = ( 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 e9688f254..747330140 100644 --- a/netbox/extras/api/serializers_/configcontexts.py +++ b/netbox/extras/api/serializers_/configcontexts.py @@ -21,6 +21,7 @@ __all__ = ( 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 935214478..fd8ef8c02 100644 --- a/netbox/extras/api/serializers_/configtemplates.py +++ b/netbox/extras/api/serializers_/configtemplates.py @@ -12,6 +12,7 @@ __all__ = ( 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 082047e94..a765faf4b 100644 --- a/netbox/extras/api/serializers_/customfields.py +++ b/netbox/extras/api/serializers_/customfields.py @@ -17,6 +17,7 @@ __all__ = ( 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 8635ea2a0..9ee321f65 100644 --- a/netbox/extras/api/serializers_/customlinks.py +++ b/netbox/extras/api/serializers_/customlinks.py @@ -12,6 +12,7 @@ __all__ = ( 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 469da3e8c..7fd2cf3e1 100644 --- a/netbox/extras/api/serializers_/events.py +++ b/netbox/extras/api/serializers_/events.py @@ -22,6 +22,7 @@ __all__ = ( 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 @@ class EventRuleSerializer(NetBoxModelSerializer): 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 43cc061a7..e5b7b4737 100644 --- a/netbox/extras/api/serializers_/exporttemplates.py +++ b/netbox/extras/api/serializers_/exporttemplates.py @@ -13,6 +13,7 @@ __all__ = ( 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 1a44e7e2e..2a31dccc3 100644 --- a/netbox/extras/api/serializers_/journaling.py +++ b/netbox/extras/api/serializers_/journaling.py @@ -17,6 +17,7 @@ __all__ = ( 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 8e4806652..7587901cd 100644 --- a/netbox/extras/api/serializers_/objecttypes.py +++ b/netbox/extras/api/serializers_/objecttypes.py @@ -10,7 +10,8 @@ __all__ = ( 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 9e26f0c30..7358a76d6 100644 --- a/netbox/extras/api/serializers_/savedfilters.py +++ b/netbox/extras/api/serializers_/savedfilters.py @@ -12,6 +12,7 @@ __all__ = ( 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 b2a8ef29d..f5f9947b3 100644 --- a/netbox/extras/api/serializers_/scripts.py +++ b/netbox/extras/api/serializers_/scripts.py @@ -15,6 +15,7 @@ __all__ = ( 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 9d91ba5e1..21a02f7fa 100644 --- a/netbox/extras/api/serializers_/tags.py +++ b/netbox/extras/api/serializers_/tags.py @@ -12,6 +12,7 @@ __all__ = ( 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 4d4a77bef..d3526e439 100644 --- a/netbox/ipam/api/nested_serializers.py +++ b/netbox/ipam/api/nested_serializers.py @@ -32,10 +32,11 @@ __all__ = [ 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 NestedASNRangeSerializer(WritableNestedSerializer): 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 NestedASNSerializer(WritableNestedSerializer): ) 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 NestedVRFSerializer(WritableNestedSerializer): 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 NestedRouteTargetSerializer(WritableNestedSerializer): ) 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 NestedAggregateSerializer(WritableNestedSerializer): 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 NestedFHRPGroupAssignmentSerializer(WritableNestedSerializer): ) 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 NestedRoleSerializer(WritableNestedSerializer): ) 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 NestedVLANSerializer(WritableNestedSerializer): 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 NestedPrefixSerializer(WritableNestedSerializer): 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 NestedIPRangeSerializer(WritableNestedSerializer): 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 NestedIPAddressSerializer(WritableNestedSerializer): 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 9a8ab5b00..615b93bf8 100644 --- a/netbox/ipam/api/serializers_/asns.py +++ b/netbox/ipam/api/serializers_/asns.py @@ -15,6 +15,7 @@ __all__ = ( 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 9bf1d4548..f2da9767c 100644 --- a/netbox/ipam/api/serializers_/fhrpgroups.py +++ b/netbox/ipam/api/serializers_/fhrpgroups.py @@ -16,19 +16,21 @@ __all__ = ( 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 7c53d68ca..ab53d3619 100644 --- a/netbox/ipam/api/serializers_/ip.py +++ b/netbox/ipam/api/serializers_/ip.py @@ -30,6 +30,7 @@ __all__ = ( 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 @@ class AvailablePrefixSerializer(serializers.Serializer): 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 IPRangeSerializer(NetBoxModelSerializer): 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 8208b8074..26026b87b 100644 --- a/netbox/ipam/api/serializers_/roles.py +++ b/netbox/ipam/api/serializers_/roles.py @@ -11,6 +11,7 @@ __all__ = ( 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 407739667..10ba32250 100644 --- a/netbox/ipam/api/serializers_/services.py +++ b/netbox/ipam/api/serializers_/services.py @@ -16,19 +16,21 @@ __all__ = ( 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 f35d294cf..5deba3dae 100644 --- a/netbox/ipam/api/serializers_/vlans.py +++ b/netbox/ipam/api/serializers_/vlans.py @@ -23,6 +23,7 @@ __all__ = ( 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 @@ class VLANGroupSerializer(NetBoxModelSerializer): 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 fdb5f98ab..6c3878261 100644 --- a/netbox/ipam/api/serializers_/vrfs.py +++ b/netbox/ipam/api/serializers_/vrfs.py @@ -13,19 +13,21 @@ __all__ = ( 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 e43fd7428..c39701e95 100644 --- a/netbox/netbox/api/serializers/nested.py +++ b/netbox/netbox/api/serializers/nested.py @@ -24,7 +24,8 @@ class WritableNestedSerializer(BaseModelSerializer): # 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 d2d76d96c..4125dd154 100644 --- a/netbox/tenancy/api/nested_serializers.py +++ b/netbox/tenancy/api/nested_serializers.py @@ -23,20 +23,22 @@ __all__ = [ ) 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 NestedTenantSerializer(WritableNestedSerializer): ) 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 857479958..d315abff6 100644 --- a/netbox/tenancy/api/serializers_/contacts.py +++ b/netbox/tenancy/api/serializers_/contacts.py @@ -20,44 +20,49 @@ __all__ = ( 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 3ff489be1..5beaa807d 100644 --- a/netbox/tenancy/api/serializers_/tenants.py +++ b/netbox/tenancy/api/serializers_/tenants.py @@ -13,20 +13,22 @@ __all__ = ( 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 2ab5d3aa5..d6f9dbb5c 100644 --- a/netbox/users/api/nested_serializers.py +++ b/netbox/users/api/nested_serializers.py @@ -18,18 +18,20 @@ __all__ = [ 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 @@ class NestedUserSerializer(WritableNestedSerializer): 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 6d9581525..8534fb8f1 100644 --- a/netbox/users/api/serializers_/permissions.py +++ b/netbox/users/api/serializers_/permissions.py @@ -13,6 +13,7 @@ __all__ = ( 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 65e1e7111..b0c3ffd89 100644 --- a/netbox/users/api/serializers_/tokens.py +++ b/netbox/users/api/serializers_/tokens.py @@ -16,6 +16,7 @@ __all__ = ( 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 2273b2d5a..13541207b 100644 --- a/netbox/users/api/serializers_/users.py +++ b/netbox/users/api/serializers_/users.py @@ -16,6 +16,7 @@ __all__ = ( 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 0c7a10918..accba4b8a 100644 --- a/netbox/virtualization/api/nested_serializers.py +++ b/netbox/virtualization/api/nested_serializers.py @@ -24,11 +24,12 @@ __all__ = [ ) 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 NestedClusterTypeSerializer(WritableNestedSerializer): ) 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 NestedClusterGroupSerializer(WritableNestedSerializer): ) 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 NestedClusterSerializer(WritableNestedSerializer): 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 5765ff614..c5a256984 100644 --- a/netbox/virtualization/api/serializers_/clusters.py +++ b/netbox/virtualization/api/serializers_/clusters.py @@ -16,6 +16,7 @@ __all__ = ( 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 53146e44a..6af0b3442 100644 --- a/netbox/virtualization/api/serializers_/virtualmachines.py +++ b/netbox/virtualization/api/serializers_/virtualmachines.py @@ -30,6 +30,7 @@ __all__ = ( 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 @@ class VirtualMachineWithConfigContextSerializer(VirtualMachineSerializer): 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 @@ class VMInterfaceSerializer(NetBoxModelSerializer): 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 c91dcb40a..385bbe2a5 100644 --- a/netbox/vpn/api/nested_serializers.py +++ b/netbox/vpn/api/nested_serializers.py @@ -24,81 +24,103 @@ __all__ = ( ) 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 NestedIPSecProfileSerializer(WritableNestedSerializer): 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 3ee30b754..0f625f8a0 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 3b78d50c9..6c5faa6e2 100644 --- a/netbox/vpn/api/serializers_/l2vpn.py +++ b/netbox/vpn/api/serializers_/l2vpn.py @@ -19,6 +19,7 @@ __all__ = ( 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 7146f964d..e2fa53459 100644 --- a/netbox/vpn/api/serializers_/tunnels.py +++ b/netbox/vpn/api/serializers_/tunnels.py @@ -24,6 +24,7 @@ __all__ = ( 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 53f2a6354..d8ea12fa3 100644 --- a/netbox/wireless/api/nested_serializers.py +++ b/netbox/wireless/api/nested_serializers.py @@ -16,25 +16,28 @@ __all__ = ( ) 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 a47a2d92c..ff41485c7 100644 --- a/netbox/wireless/api/serializers_/wirelesslans.py +++ b/netbox/wireless/api/serializers_/wirelesslans.py @@ -16,20 +16,22 @@ __all__ = ( 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 3a7f88856..cd9d90b3a 100644 --- a/netbox/wireless/api/serializers_/wirelesslinks.py +++ b/netbox/wireless/api/serializers_/wirelesslinks.py @@ -15,6 +15,7 @@ __all__ = ( 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')