From 6a9b50f95db660415af4f94fe7bfc4923b104aff Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 26 Feb 2021 17:23:23 -0500 Subject: [PATCH] Closes #5873: Use numeric IDs in all object URLs --- docs/release-notes/version-2.11.md | 1 + netbox/circuits/models.py | 2 +- netbox/circuits/tables.py | 7 +++-- netbox/circuits/urls.py | 14 +++++----- netbox/dcim/models/sites.py | 2 +- netbox/dcim/tables/devices.py | 4 +-- netbox/dcim/tables/devicetypes.py | 2 +- netbox/dcim/tables/power.py | 5 ++-- netbox/dcim/tables/racks.py | 6 ++--- netbox/dcim/urls.py | 26 +++++++++---------- netbox/extras/tables.py | 2 +- netbox/extras/urls.py | 6 ++--- netbox/ipam/tables.py | 18 ++++++------- netbox/ipam/urls.py | 12 ++++----- netbox/secrets/tables.py | 2 +- netbox/secrets/urls.py | 6 ++--- netbox/templates/circuits/circuit.html | 2 +- .../circuits/inc/circuit_termination.html | 2 +- netbox/templates/circuits/provider.html | 2 +- netbox/templates/dcim/device.html | 4 +-- netbox/templates/dcim/devicetype.html | 4 +-- netbox/templates/dcim/rack.html | 2 +- netbox/templates/dcim/rackreservation.html | 2 +- netbox/templates/dcim/site.html | 2 +- netbox/templates/extras/tag.html | 2 +- netbox/templates/ipam/prefix.html | 2 +- netbox/templates/ipam/vlan.html | 2 +- netbox/templates/ipam/vlangroup_vlans.html | 2 +- netbox/templates/tenancy/tenant.html | 2 +- netbox/tenancy/models.py | 2 +- netbox/tenancy/tables.py | 4 +-- netbox/tenancy/urls.py | 14 +++++----- netbox/utilities/tables.py | 10 +++---- netbox/utilities/templatetags/buttons.py | 22 +++------------- netbox/utilities/testing/views.py | 10 +------ netbox/virtualization/tables.py | 4 +-- netbox/virtualization/urls.py | 12 ++++----- 37 files changed, 97 insertions(+), 126 deletions(-) diff --git a/docs/release-notes/version-2.11.md b/docs/release-notes/version-2.11.md index 4c12ed40a..1dcf49759 100644 --- a/docs/release-notes/version-2.11.md +++ b/docs/release-notes/version-2.11.md @@ -11,3 +11,4 @@ ### Other Changes * [#1638](https://github.com/netbox-community/netbox/issues/1638) - Migrate all primary keys to 64-bit integers +* [#5873](https://github.com/netbox-community/netbox/issues/5873) - Use numeric IDs in all object URLs diff --git a/netbox/circuits/models.py b/netbox/circuits/models.py index e371df547..693fe5ae6 100644 --- a/netbox/circuits/models.py +++ b/netbox/circuits/models.py @@ -79,7 +79,7 @@ class Provider(PrimaryModel): return self.name def get_absolute_url(self): - return reverse('circuits:provider', args=[self.slug]) + return reverse('circuits:provider', args=[self.pk]) def to_csv(self): return ( diff --git a/netbox/circuits/tables.py b/netbox/circuits/tables.py index 782b02394..e4b859d3c 100644 --- a/netbox/circuits/tables.py +++ b/netbox/circuits/tables.py @@ -39,7 +39,7 @@ class CircuitTypeTable(BaseTable): circuit_count = tables.Column( verbose_name='Circuits' ) - actions = ButtonsColumn(CircuitType, pk_field='slug') + actions = ButtonsColumn(CircuitType) class Meta(BaseTable.Meta): model = CircuitType @@ -56,9 +56,8 @@ class CircuitTable(BaseTable): cid = tables.LinkColumn( verbose_name='ID' ) - provider = tables.LinkColumn( - viewname='circuits:provider', - args=[Accessor('provider__slug')] + provider = tables.Column( + linkify=True ) status = ChoiceFieldColumn() tenant = tables.TemplateColumn( diff --git a/netbox/circuits/urls.py b/netbox/circuits/urls.py index d757fd90d..a8306efa8 100644 --- a/netbox/circuits/urls.py +++ b/netbox/circuits/urls.py @@ -14,19 +14,19 @@ urlpatterns = [ path('providers/import/', views.ProviderBulkImportView.as_view(), name='provider_import'), path('providers/edit/', views.ProviderBulkEditView.as_view(), name='provider_bulk_edit'), path('providers/delete/', views.ProviderBulkDeleteView.as_view(), name='provider_bulk_delete'), - path('providers//', views.ProviderView.as_view(), name='provider'), - path('providers//edit/', views.ProviderEditView.as_view(), name='provider_edit'), - path('providers//delete/', views.ProviderDeleteView.as_view(), name='provider_delete'), - path('providers//changelog/', ObjectChangeLogView.as_view(), name='provider_changelog', kwargs={'model': Provider}), + path('providers//', views.ProviderView.as_view(), name='provider'), + path('providers//edit/', views.ProviderEditView.as_view(), name='provider_edit'), + path('providers//delete/', views.ProviderDeleteView.as_view(), name='provider_delete'), + path('providers//changelog/', ObjectChangeLogView.as_view(), name='provider_changelog', kwargs={'model': Provider}), # Circuit types path('circuit-types/', views.CircuitTypeListView.as_view(), name='circuittype_list'), path('circuit-types/add/', views.CircuitTypeEditView.as_view(), name='circuittype_add'), path('circuit-types/import/', views.CircuitTypeBulkImportView.as_view(), name='circuittype_import'), path('circuit-types/delete/', views.CircuitTypeBulkDeleteView.as_view(), name='circuittype_bulk_delete'), - path('circuit-types//edit/', views.CircuitTypeEditView.as_view(), name='circuittype_edit'), - path('circuit-types//delete/', views.CircuitTypeDeleteView.as_view(), name='circuittype_delete'), - path('circuit-types//changelog/', ObjectChangeLogView.as_view(), name='circuittype_changelog', kwargs={'model': CircuitType}), + path('circuit-types//edit/', views.CircuitTypeEditView.as_view(), name='circuittype_edit'), + path('circuit-types//delete/', views.CircuitTypeDeleteView.as_view(), name='circuittype_delete'), + path('circuit-types//changelog/', ObjectChangeLogView.as_view(), name='circuittype_changelog', kwargs={'model': CircuitType}), # Circuits path('circuits/', views.CircuitListView.as_view(), name='circuit_list'), diff --git a/netbox/dcim/models/sites.py b/netbox/dcim/models/sites.py index 92d8e1b26..417e0b914 100644 --- a/netbox/dcim/models/sites.py +++ b/netbox/dcim/models/sites.py @@ -192,7 +192,7 @@ class Site(PrimaryModel): return self.name def get_absolute_url(self): - return reverse('dcim:site', args=[self.slug]) + return reverse('dcim:site', args=[self.pk]) def to_csv(self): return ( diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index edd9e7a43..20e04e7cc 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -61,7 +61,7 @@ class DeviceRoleTable(BaseTable): ) color = ColorColumn() vm_role = BooleanColumn() - actions = ButtonsColumn(DeviceRole, pk_field='slug') + actions = ButtonsColumn(DeviceRole) class Meta(BaseTable.Meta): model = DeviceRole @@ -85,7 +85,7 @@ class PlatformTable(BaseTable): url_params={'platform': 'slug'}, verbose_name='VMs' ) - actions = ButtonsColumn(Platform, pk_field='slug') + actions = ButtonsColumn(Platform) class Meta(BaseTable.Meta): model = Platform diff --git a/netbox/dcim/tables/devicetypes.py b/netbox/dcim/tables/devicetypes.py index c4d618cd7..c5b8bb70d 100644 --- a/netbox/dcim/tables/devicetypes.py +++ b/netbox/dcim/tables/devicetypes.py @@ -37,7 +37,7 @@ class ManufacturerTable(BaseTable): verbose_name='Platforms' ) slug = tables.Column() - actions = ButtonsColumn(Manufacturer, pk_field='slug') + actions = ButtonsColumn(Manufacturer) class Meta(BaseTable.Meta): model = Manufacturer diff --git a/netbox/dcim/tables/power.py b/netbox/dcim/tables/power.py index ae5c2a5c8..6d6e2541b 100644 --- a/netbox/dcim/tables/power.py +++ b/netbox/dcim/tables/power.py @@ -19,9 +19,8 @@ __all__ = ( class PowerPanelTable(BaseTable): pk = ToggleColumn() name = tables.LinkColumn() - site = tables.LinkColumn( - viewname='dcim:site', - args=[Accessor('site__slug')] + site = tables.Column( + linkify=True ) powerfeed_count = LinkedCountColumn( viewname='dcim:powerfeed_list', diff --git a/netbox/dcim/tables/racks.py b/netbox/dcim/tables/racks.py index 775e90076..1ac0d17bb 100644 --- a/netbox/dcim/tables/racks.py +++ b/netbox/dcim/tables/racks.py @@ -29,10 +29,8 @@ class RackGroupTable(BaseTable): orderable=False, attrs={'td': {'class': 'text-nowrap'}} ) - site = tables.LinkColumn( - viewname='dcim:site', - args=[Accessor('site__slug')], - verbose_name='Site' + site = tables.Column( + linkify=True ) rack_count = tables.Column( verbose_name='Racks' diff --git a/netbox/dcim/urls.py b/netbox/dcim/urls.py index d167ebdb7..6cf61df24 100644 --- a/netbox/dcim/urls.py +++ b/netbox/dcim/urls.py @@ -27,10 +27,10 @@ urlpatterns = [ path('sites/import/', views.SiteBulkImportView.as_view(), name='site_import'), path('sites/edit/', views.SiteBulkEditView.as_view(), name='site_bulk_edit'), path('sites/delete/', views.SiteBulkDeleteView.as_view(), name='site_bulk_delete'), - path('sites//', views.SiteView.as_view(), name='site'), - path('sites//edit/', views.SiteEditView.as_view(), name='site_edit'), - path('sites//delete/', views.SiteDeleteView.as_view(), name='site_delete'), - path('sites//changelog/', ObjectChangeLogView.as_view(), name='site_changelog', kwargs={'model': Site}), + path('sites//', views.SiteView.as_view(), name='site'), + path('sites//edit/', views.SiteEditView.as_view(), name='site_edit'), + path('sites//delete/', views.SiteDeleteView.as_view(), name='site_delete'), + path('sites//changelog/', ObjectChangeLogView.as_view(), name='site_changelog', kwargs={'model': Site}), path('sites//images/add/', ImageAttachmentEditView.as_view(), name='site_add_image', kwargs={'model': Site}), # Rack groups @@ -80,9 +80,9 @@ urlpatterns = [ path('manufacturers/add/', views.ManufacturerEditView.as_view(), name='manufacturer_add'), path('manufacturers/import/', views.ManufacturerBulkImportView.as_view(), name='manufacturer_import'), path('manufacturers/delete/', views.ManufacturerBulkDeleteView.as_view(), name='manufacturer_bulk_delete'), - path('manufacturers//edit/', views.ManufacturerEditView.as_view(), name='manufacturer_edit'), - path('manufacturers//delete/', views.ManufacturerDeleteView.as_view(), name='manufacturer_delete'), - path('manufacturers//changelog/', ObjectChangeLogView.as_view(), name='manufacturer_changelog', kwargs={'model': Manufacturer}), + path('manufacturers//edit/', views.ManufacturerEditView.as_view(), name='manufacturer_edit'), + path('manufacturers//delete/', views.ManufacturerDeleteView.as_view(), name='manufacturer_delete'), + path('manufacturers//changelog/', ObjectChangeLogView.as_view(), name='manufacturer_changelog', kwargs={'model': Manufacturer}), # Device types path('device-types/', views.DeviceTypeListView.as_view(), name='devicetype_list'), @@ -164,18 +164,18 @@ urlpatterns = [ path('device-roles/add/', views.DeviceRoleEditView.as_view(), name='devicerole_add'), path('device-roles/import/', views.DeviceRoleBulkImportView.as_view(), name='devicerole_import'), path('device-roles/delete/', views.DeviceRoleBulkDeleteView.as_view(), name='devicerole_bulk_delete'), - path('device-roles//edit/', views.DeviceRoleEditView.as_view(), name='devicerole_edit'), - path('device-roles//delete/', views.DeviceRoleDeleteView.as_view(), name='devicerole_delete'), - path('device-roles//changelog/', ObjectChangeLogView.as_view(), name='devicerole_changelog', kwargs={'model': DeviceRole}), + path('device-roles//edit/', views.DeviceRoleEditView.as_view(), name='devicerole_edit'), + path('device-roles//delete/', views.DeviceRoleDeleteView.as_view(), name='devicerole_delete'), + path('device-roles//changelog/', ObjectChangeLogView.as_view(), name='devicerole_changelog', kwargs={'model': DeviceRole}), # Platforms path('platforms/', views.PlatformListView.as_view(), name='platform_list'), path('platforms/add/', views.PlatformEditView.as_view(), name='platform_add'), path('platforms/import/', views.PlatformBulkImportView.as_view(), name='platform_import'), path('platforms/delete/', views.PlatformBulkDeleteView.as_view(), name='platform_bulk_delete'), - path('platforms//edit/', views.PlatformEditView.as_view(), name='platform_edit'), - path('platforms//delete/', views.PlatformDeleteView.as_view(), name='platform_delete'), - path('platforms//changelog/', ObjectChangeLogView.as_view(), name='platform_changelog', kwargs={'model': Platform}), + path('platforms//edit/', views.PlatformEditView.as_view(), name='platform_edit'), + path('platforms//delete/', views.PlatformDeleteView.as_view(), name='platform_delete'), + path('platforms//changelog/', ObjectChangeLogView.as_view(), name='platform_changelog', kwargs={'model': Platform}), # Devices path('devices/', views.DeviceListView.as_view(), name='device_list'), diff --git a/netbox/extras/tables.py b/netbox/extras/tables.py index cccb56c0a..7aeddb48f 100644 --- a/netbox/extras/tables.py +++ b/netbox/extras/tables.py @@ -37,7 +37,7 @@ OBJECTCHANGE_REQUEST_ID = """ class TagTable(BaseTable): pk = ToggleColumn() color = ColorColumn() - actions = ButtonsColumn(Tag, pk_field='slug') + actions = ButtonsColumn(Tag) class Meta(BaseTable.Meta): model = Tag diff --git a/netbox/extras/urls.py b/netbox/extras/urls.py index 36077dc7a..d2f0a2eb2 100644 --- a/netbox/extras/urls.py +++ b/netbox/extras/urls.py @@ -13,9 +13,9 @@ urlpatterns = [ path('tags/import/', views.TagBulkImportView.as_view(), name='tag_import'), path('tags/edit/', views.TagBulkEditView.as_view(), name='tag_bulk_edit'), path('tags/delete/', views.TagBulkDeleteView.as_view(), name='tag_bulk_delete'), - path('tags//edit/', views.TagEditView.as_view(), name='tag_edit'), - path('tags//delete/', views.TagDeleteView.as_view(), name='tag_delete'), - path('tags//changelog/', views.ObjectChangeLogView.as_view(), name='tag_changelog', kwargs={'model': Tag}), + path('tags//edit/', views.TagEditView.as_view(), name='tag_edit'), + path('tags//delete/', views.TagDeleteView.as_view(), name='tag_delete'), + path('tags//changelog/', views.ObjectChangeLogView.as_view(), name='tag_changelog', kwargs={'model': Tag}), # Config contexts path('config-contexts/', views.ConfigContextListView.as_view(), name='configcontext_list'), diff --git a/netbox/ipam/tables.py b/netbox/ipam/tables.py index 86d7e21eb..8101a581d 100644 --- a/netbox/ipam/tables.py +++ b/netbox/ipam/tables.py @@ -111,9 +111,9 @@ VLAN_MEMBER_TAGGED = """ TENANT_LINK = """ {% if record.tenant %} - {{ record.tenant }} + {{ record.tenant }} {% elif record.vrf.tenant %} - {{ record.vrf.tenant }}* + {{ record.vrf.tenant }}* {% else %} — {% endif %} @@ -191,7 +191,7 @@ class RIRTable(BaseTable): url_params={'rir': 'slug'}, verbose_name='Aggregates' ) - actions = ButtonsColumn(RIR, pk_field='slug') + actions = ButtonsColumn(RIR) class Meta(BaseTable.Meta): model = RIR @@ -254,7 +254,7 @@ class RoleTable(BaseTable): url_params={'role': 'slug'}, verbose_name='VLANs' ) - actions = ButtonsColumn(Role, pk_field='slug') + actions = ButtonsColumn(Role) class Meta(BaseTable.Meta): model = Role @@ -444,9 +444,8 @@ class InterfaceIPAddressTable(BaseTable): class VLANGroupTable(BaseTable): pk = ToggleColumn() name = tables.Column(linkify=True) - site = tables.LinkColumn( - viewname='dcim:site', - args=[Accessor('site__slug')] + site = tables.Column( + linkify=True ) vlan_count = LinkedCountColumn( viewname='ipam:vlan_list', @@ -474,9 +473,8 @@ class VLANTable(BaseTable): template_code=VLAN_LINK, verbose_name='ID' ) - site = tables.LinkColumn( - viewname='dcim:site', - args=[Accessor('site__slug')] + site = tables.Column( + linkify=True ) group = tables.LinkColumn( viewname='ipam:vlangroup_vlans', diff --git a/netbox/ipam/urls.py b/netbox/ipam/urls.py index 9b0dc581b..db0eec157 100644 --- a/netbox/ipam/urls.py +++ b/netbox/ipam/urls.py @@ -34,9 +34,9 @@ urlpatterns = [ path('rirs/add/', views.RIREditView.as_view(), name='rir_add'), path('rirs/import/', views.RIRBulkImportView.as_view(), name='rir_import'), path('rirs/delete/', views.RIRBulkDeleteView.as_view(), name='rir_bulk_delete'), - path('rirs//edit/', views.RIREditView.as_view(), name='rir_edit'), - path('rirs//delete/', views.RIRDeleteView.as_view(), name='rir_delete'), - path('vrfs//changelog/', ObjectChangeLogView.as_view(), name='rir_changelog', kwargs={'model': RIR}), + path('rirs//edit/', views.RIREditView.as_view(), name='rir_edit'), + path('rirs//delete/', views.RIRDeleteView.as_view(), name='rir_delete'), + path('rirs//changelog/', ObjectChangeLogView.as_view(), name='rir_changelog', kwargs={'model': RIR}), # Aggregates path('aggregates/', views.AggregateListView.as_view(), name='aggregate_list'), @@ -54,9 +54,9 @@ urlpatterns = [ path('roles/add/', views.RoleEditView.as_view(), name='role_add'), path('roles/import/', views.RoleBulkImportView.as_view(), name='role_import'), path('roles/delete/', views.RoleBulkDeleteView.as_view(), name='role_bulk_delete'), - path('roles//edit/', views.RoleEditView.as_view(), name='role_edit'), - path('roles//delete/', views.RoleDeleteView.as_view(), name='role_delete'), - path('roles//changelog/', ObjectChangeLogView.as_view(), name='role_changelog', kwargs={'model': Role}), + path('roles//edit/', views.RoleEditView.as_view(), name='role_edit'), + path('roles//delete/', views.RoleDeleteView.as_view(), name='role_delete'), + path('roles//changelog/', ObjectChangeLogView.as_view(), name='role_changelog', kwargs={'model': Role}), # Prefixes path('prefixes/', views.PrefixListView.as_view(), name='prefix_list'), diff --git a/netbox/secrets/tables.py b/netbox/secrets/tables.py index 0d8559a2b..dd91985ec 100644 --- a/netbox/secrets/tables.py +++ b/netbox/secrets/tables.py @@ -16,7 +16,7 @@ class SecretRoleTable(BaseTable): url_params={'role': 'slug'}, verbose_name='Secrets' ) - actions = ButtonsColumn(SecretRole, pk_field='slug') + actions = ButtonsColumn(SecretRole) class Meta(BaseTable.Meta): model = SecretRole diff --git a/netbox/secrets/urls.py b/netbox/secrets/urls.py index 9dbb5d044..62a285875 100644 --- a/netbox/secrets/urls.py +++ b/netbox/secrets/urls.py @@ -12,9 +12,9 @@ urlpatterns = [ path('secret-roles/add/', views.SecretRoleEditView.as_view(), name='secretrole_add'), path('secret-roles/import/', views.SecretRoleBulkImportView.as_view(), name='secretrole_import'), path('secret-roles/delete/', views.SecretRoleBulkDeleteView.as_view(), name='secretrole_bulk_delete'), - path('secret-roles//edit/', views.SecretRoleEditView.as_view(), name='secretrole_edit'), - path('secret-roles//delete/', views.SecretRoleDeleteView.as_view(), name='secretrole_delete'), - path('secret-roles//changelog/', ObjectChangeLogView.as_view(), name='secretrole_changelog', kwargs={'model': SecretRole}), + path('secret-roles//edit/', views.SecretRoleEditView.as_view(), name='secretrole_edit'), + path('secret-roles//delete/', views.SecretRoleDeleteView.as_view(), name='secretrole_delete'), + path('secret-roles//changelog/', ObjectChangeLogView.as_view(), name='secretrole_changelog', kwargs={'model': SecretRole}), # Secrets path('secrets/', views.SecretListView.as_view(), name='secret_list'), diff --git a/netbox/templates/circuits/circuit.html b/netbox/templates/circuits/circuit.html index c104b154b..47125da14 100644 --- a/netbox/templates/circuits/circuit.html +++ b/netbox/templates/circuits/circuit.html @@ -74,7 +74,7 @@ Provider - {{ object.provider }} + {{ object.provider }} diff --git a/netbox/templates/circuits/inc/circuit_termination.html b/netbox/templates/circuits/inc/circuit_termination.html index 477788931..e4854e5ab 100644 --- a/netbox/templates/circuits/inc/circuit_termination.html +++ b/netbox/templates/circuits/inc/circuit_termination.html @@ -32,7 +32,7 @@ {% if termination.site.region %} {{ termination.site.region }} / {% endif %} - {{ termination.site }} + {{ termination.site }} diff --git a/netbox/templates/circuits/provider.html b/netbox/templates/circuits/provider.html index 8778c3ac2..7fa512ec6 100644 --- a/netbox/templates/circuits/provider.html +++ b/netbox/templates/circuits/provider.html @@ -51,7 +51,7 @@ {% if perms.extras.view_objectchange %} {% endif %} diff --git a/netbox/templates/dcim/device.html b/netbox/templates/dcim/device.html index 55be343ac..917384b98 100644 --- a/netbox/templates/dcim/device.html +++ b/netbox/templates/dcim/device.html @@ -23,7 +23,7 @@ {% if object.site.region %} {{ object.site.region }} / {% endif %} - {{ object.site }} + {{ object.site }} @@ -74,7 +74,7 @@ Device Type - {{ object.device_type.display_name }} ({{ object.device_type.u_height }}U) + {{ object.device_type.display_name }} ({{ object.device_type.u_height }}U) diff --git a/netbox/templates/dcim/devicetype.html b/netbox/templates/dcim/devicetype.html index 6bc970174..110d42c04 100644 --- a/netbox/templates/dcim/devicetype.html +++ b/netbox/templates/dcim/devicetype.html @@ -55,10 +55,10 @@ {% clone_button object %} {% endif %} {% if perms.dcim.change_devicetype %} - {% edit_button object use_pk=True %} + {% edit_button object %} {% endif %} {% if perms.dcim.delete_devicetype %} - {% delete_button object use_pk=True %} + {% delete_button object %} {% endif %}

{{ object.manufacturer }} {{ object.model }}

diff --git a/netbox/templates/dcim/rack.html b/netbox/templates/dcim/rack.html index 6a00308f3..9c0d72a04 100644 --- a/netbox/templates/dcim/rack.html +++ b/netbox/templates/dcim/rack.html @@ -85,7 +85,7 @@ {% if object.site.region %} {{ object.site.region }} / {% endif %} - {{ object.site }} + {{ object.site }} diff --git a/netbox/templates/dcim/rackreservation.html b/netbox/templates/dcim/rackreservation.html index 5273b2a39..4760f4192 100644 --- a/netbox/templates/dcim/rackreservation.html +++ b/netbox/templates/dcim/rackreservation.html @@ -68,7 +68,7 @@ {% if rack.site.region %} {{ rack.site.region }} / {% endif %} - {{ rack.site }} + {{ rack.site }} diff --git a/netbox/templates/dcim/site.html b/netbox/templates/dcim/site.html index a0e713fcf..0ffc7e265 100644 --- a/netbox/templates/dcim/site.html +++ b/netbox/templates/dcim/site.html @@ -56,7 +56,7 @@ {% if perms.extras.view_objectchange %} {% endif %} diff --git a/netbox/templates/extras/tag.html b/netbox/templates/extras/tag.html index 2ad7cf814..2cee8f882 100644 --- a/netbox/templates/extras/tag.html +++ b/netbox/templates/extras/tag.html @@ -44,7 +44,7 @@ {% if perms.extras.view_objectchange %} {% endif %} diff --git a/netbox/templates/ipam/prefix.html b/netbox/templates/ipam/prefix.html index 4b382636b..d195affb2 100644 --- a/netbox/templates/ipam/prefix.html +++ b/netbox/templates/ipam/prefix.html @@ -129,7 +129,7 @@ {% if object.site.region %} {{ object.site.region }} / {% endif %} - {{ object.site }} + {{ object.site }} {% else %} None {% endif %} diff --git a/netbox/templates/ipam/vlan.html b/netbox/templates/ipam/vlan.html index d2967ca56..52286e29d 100644 --- a/netbox/templates/ipam/vlan.html +++ b/netbox/templates/ipam/vlan.html @@ -81,7 +81,7 @@ {% if object.site.region %} {{ object.site.region }} / {% endif %} - {{ object.site }} + {{ object.site }} {% else %} None {% endif %} diff --git a/netbox/templates/ipam/vlangroup_vlans.html b/netbox/templates/ipam/vlangroup_vlans.html index 490b7ab2c..ffb75d3b8 100644 --- a/netbox/templates/ipam/vlangroup_vlans.html +++ b/netbox/templates/ipam/vlangroup_vlans.html @@ -8,7 +8,7 @@ diff --git a/netbox/templates/tenancy/tenant.html b/netbox/templates/tenancy/tenant.html index e2e66e6b2..00044f1c3 100644 --- a/netbox/templates/tenancy/tenant.html +++ b/netbox/templates/tenancy/tenant.html @@ -51,7 +51,7 @@ {% if perms.extras.view_objectchange %} {% endif %} diff --git a/netbox/tenancy/models.py b/netbox/tenancy/models.py index e83f4bdd2..757afb09e 100644 --- a/netbox/tenancy/models.py +++ b/netbox/tenancy/models.py @@ -105,7 +105,7 @@ class Tenant(PrimaryModel): return self.name def get_absolute_url(self): - return reverse('tenancy:tenant', args=[self.slug]) + return reverse('tenancy:tenant', args=[self.pk]) def to_csv(self): return ( diff --git a/netbox/tenancy/tables.py b/netbox/tenancy/tables.py index 9e8be6b18..8872a7012 100644 --- a/netbox/tenancy/tables.py +++ b/netbox/tenancy/tables.py @@ -12,7 +12,7 @@ MPTT_LINK = """ COL_TENANT = """ {% if record.tenant %} - {{ record.tenant }} + {{ record.tenant }} {% else %} — {% endif %} @@ -35,7 +35,7 @@ class TenantGroupTable(BaseTable): url_params={'group': 'slug'}, verbose_name='Tenants' ) - actions = ButtonsColumn(TenantGroup, pk_field='slug') + actions = ButtonsColumn(TenantGroup) class Meta(BaseTable.Meta): model = TenantGroup diff --git a/netbox/tenancy/urls.py b/netbox/tenancy/urls.py index 372308bb8..c07df97a6 100644 --- a/netbox/tenancy/urls.py +++ b/netbox/tenancy/urls.py @@ -12,9 +12,9 @@ urlpatterns = [ path('tenant-groups/add/', views.TenantGroupEditView.as_view(), name='tenantgroup_add'), path('tenant-groups/import/', views.TenantGroupBulkImportView.as_view(), name='tenantgroup_import'), path('tenant-groups/delete/', views.TenantGroupBulkDeleteView.as_view(), name='tenantgroup_bulk_delete'), - path('tenant-groups//edit/', views.TenantGroupEditView.as_view(), name='tenantgroup_edit'), - path('tenant-groups//delete/', views.TenantGroupDeleteView.as_view(), name='tenantgroup_delete'), - path('tenant-groups//changelog/', ObjectChangeLogView.as_view(), name='tenantgroup_changelog', kwargs={'model': TenantGroup}), + path('tenant-groups//edit/', views.TenantGroupEditView.as_view(), name='tenantgroup_edit'), + path('tenant-groups//delete/', views.TenantGroupDeleteView.as_view(), name='tenantgroup_delete'), + path('tenant-groups//changelog/', ObjectChangeLogView.as_view(), name='tenantgroup_changelog', kwargs={'model': TenantGroup}), # Tenants path('tenants/', views.TenantListView.as_view(), name='tenant_list'), @@ -22,9 +22,9 @@ urlpatterns = [ path('tenants/import/', views.TenantBulkImportView.as_view(), name='tenant_import'), path('tenants/edit/', views.TenantBulkEditView.as_view(), name='tenant_bulk_edit'), path('tenants/delete/', views.TenantBulkDeleteView.as_view(), name='tenant_bulk_delete'), - path('tenants//', views.TenantView.as_view(), name='tenant'), - path('tenants//edit/', views.TenantEditView.as_view(), name='tenant_edit'), - path('tenants//delete/', views.TenantDeleteView.as_view(), name='tenant_delete'), - path('tenants//changelog/', ObjectChangeLogView.as_view(), name='tenant_changelog', kwargs={'model': Tenant}), + path('tenants//', views.TenantView.as_view(), name='tenant'), + path('tenants//edit/', views.TenantEditView.as_view(), name='tenant_edit'), + path('tenants//delete/', views.TenantDeleteView.as_view(), name='tenant_delete'), + path('tenants//changelog/', ObjectChangeLogView.as_view(), name='tenant_changelog', kwargs={'model': Tenant}), ] diff --git a/netbox/utilities/tables.py b/netbox/utilities/tables.py index bf087f2c9..f2f567783 100644 --- a/netbox/utilities/tables.py +++ b/netbox/utilities/tables.py @@ -147,24 +147,23 @@ class ButtonsColumn(tables.TemplateColumn): # Note that braces are escaped to allow for string formatting prior to template rendering template_code = """ {{% if "changelog" in buttons %}} - + {{% endif %}} {{% if "edit" in buttons and perms.{app_label}.change_{model_name} %}} - + {{% endif %}} {{% if "delete" in buttons and perms.{app_label}.delete_{model_name} %}} - + {{% endif %}} """ - def __init__(self, model, *args, pk_field='pk', buttons=None, prepend_template=None, return_url_extra='', - **kwargs): + def __init__(self, model, *args, buttons=None, prepend_template=None, return_url_extra='', **kwargs): if prepend_template: prepend_template = prepend_template.replace('{', '{{') prepend_template = prepend_template.replace('}', '}}') @@ -173,7 +172,6 @@ class ButtonsColumn(tables.TemplateColumn): template_code = self.template_code.format( app_label=model._meta.app_label, model_name=model._meta.model_name, - pk_field=pk_field, buttons=buttons ) diff --git a/netbox/utilities/templatetags/buttons.py b/netbox/utilities/templatetags/buttons.py index e7f00cacf..c486dd2e5 100644 --- a/netbox/utilities/templatetags/buttons.py +++ b/netbox/utilities/templatetags/buttons.py @@ -40,16 +40,9 @@ def clone_button(instance): @register.inclusion_tag('buttons/edit.html') -def edit_button(instance, use_pk=False): +def edit_button(instance): viewname = _get_viewname(instance, 'edit') - - # Assign kwargs - if hasattr(instance, 'slug') and not use_pk: - kwargs = {'slug': instance.slug} - else: - kwargs = {'pk': instance.pk} - - url = reverse(viewname, kwargs=kwargs) + url = reverse(viewname, kwargs={'pk': instance.pk}) return { 'url': url, @@ -57,16 +50,9 @@ def edit_button(instance, use_pk=False): @register.inclusion_tag('buttons/delete.html') -def delete_button(instance, use_pk=False): +def delete_button(instance): viewname = _get_viewname(instance, 'delete') - - # Assign kwargs - if hasattr(instance, 'slug') and not use_pk: - kwargs = {'slug': instance.slug} - else: - kwargs = {'pk': instance.pk} - - url = reverse(viewname, kwargs=kwargs) + url = reverse(viewname, kwargs={'pk': instance.pk}) return { 'url': url, diff --git a/netbox/utilities/testing/views.py b/netbox/utilities/testing/views.py index d380996b7..89bac51cf 100644 --- a/netbox/utilities/testing/views.py +++ b/netbox/utilities/testing/views.py @@ -5,7 +5,7 @@ from django.core.exceptions import FieldDoesNotExist, ObjectDoesNotExist from django.db.models import ManyToManyField from django.forms.models import model_to_dict from django.test import Client, TestCase as _TestCase, override_settings -from django.urls import reverse, NoReverseMatch +from django.urls import reverse from django.utils.text import slugify from netaddr import IPNetwork from taggit.managers import TaggableManager @@ -205,14 +205,6 @@ class ModelViewTestCase(ModelTestCase): if instance is None: return reverse(url_format.format(action)) - # Attempt to resolve using slug as the unique identifier if one exists - if hasattr(self.model, 'slug'): - try: - return reverse(url_format.format(action), kwargs={'slug': instance.slug}) - except NoReverseMatch: - pass - - # Default to using the numeric PK to retrieve the URL for an object return reverse(url_format.format(action), kwargs={'pk': instance.pk}) diff --git a/netbox/virtualization/tables.py b/netbox/virtualization/tables.py index 34a070623..808832224 100644 --- a/netbox/virtualization/tables.py +++ b/netbox/virtualization/tables.py @@ -36,7 +36,7 @@ class ClusterTypeTable(BaseTable): cluster_count = tables.Column( verbose_name='Clusters' ) - actions = ButtonsColumn(ClusterType, pk_field='slug') + actions = ButtonsColumn(ClusterType) class Meta(BaseTable.Meta): model = ClusterType @@ -54,7 +54,7 @@ class ClusterGroupTable(BaseTable): cluster_count = tables.Column( verbose_name='Clusters' ) - actions = ButtonsColumn(ClusterGroup, pk_field='slug') + actions = ButtonsColumn(ClusterGroup) class Meta(BaseTable.Meta): model = ClusterGroup diff --git a/netbox/virtualization/urls.py b/netbox/virtualization/urls.py index 3d6f07566..703f99b65 100644 --- a/netbox/virtualization/urls.py +++ b/netbox/virtualization/urls.py @@ -13,18 +13,18 @@ urlpatterns = [ path('cluster-types/add/', views.ClusterTypeEditView.as_view(), name='clustertype_add'), path('cluster-types/import/', views.ClusterTypeBulkImportView.as_view(), name='clustertype_import'), path('cluster-types/delete/', views.ClusterTypeBulkDeleteView.as_view(), name='clustertype_bulk_delete'), - path('cluster-types//edit/', views.ClusterTypeEditView.as_view(), name='clustertype_edit'), - path('cluster-types//delete/', views.ClusterTypeDeleteView.as_view(), name='clustertype_delete'), - path('cluster-types//changelog/', ObjectChangeLogView.as_view(), name='clustertype_changelog', kwargs={'model': ClusterType}), + path('cluster-types//edit/', views.ClusterTypeEditView.as_view(), name='clustertype_edit'), + path('cluster-types//delete/', views.ClusterTypeDeleteView.as_view(), name='clustertype_delete'), + path('cluster-types//changelog/', ObjectChangeLogView.as_view(), name='clustertype_changelog', kwargs={'model': ClusterType}), # Cluster groups path('cluster-groups/', views.ClusterGroupListView.as_view(), name='clustergroup_list'), path('cluster-groups/add/', views.ClusterGroupEditView.as_view(), name='clustergroup_add'), path('cluster-groups/import/', views.ClusterGroupBulkImportView.as_view(), name='clustergroup_import'), path('cluster-groups/delete/', views.ClusterGroupBulkDeleteView.as_view(), name='clustergroup_bulk_delete'), - path('cluster-groups//edit/', views.ClusterGroupEditView.as_view(), name='clustergroup_edit'), - path('cluster-groups//delete/', views.ClusterGroupDeleteView.as_view(), name='clustergroup_delete'), - path('cluster-groups//changelog/', ObjectChangeLogView.as_view(), name='clustergroup_changelog', kwargs={'model': ClusterGroup}), + path('cluster-groups//edit/', views.ClusterGroupEditView.as_view(), name='clustergroup_edit'), + path('cluster-groups//delete/', views.ClusterGroupDeleteView.as_view(), name='clustergroup_delete'), + path('cluster-groups//changelog/', ObjectChangeLogView.as_view(), name='clustergroup_changelog', kwargs={'model': ClusterGroup}), # Clusters path('clusters/', views.ClusterListView.as_view(), name='cluster_list'),