From 4613b69c2829c1f51c846b13d75f075ea70e9d0d Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 1 Jul 2020 11:50:31 -0400 Subject: [PATCH] Extend GetReturnURLMixin to automatically resolve default return URL for querysets --- netbox/circuits/views.py | 13 ------ netbox/dcim/views.py | 84 ---------------------------------- netbox/extras/views.py | 9 ---- netbox/ipam/views.py | 38 --------------- netbox/secrets/views.py | 7 --- netbox/tenancy/views.py | 8 ---- netbox/utilities/views.py | 15 ++++-- netbox/virtualization/views.py | 17 ------- 8 files changed, 12 insertions(+), 179 deletions(-) diff --git a/netbox/circuits/views.py b/netbox/circuits/views.py index f100dd3c7..83b6fcd81 100644 --- a/netbox/circuits/views.py +++ b/netbox/circuits/views.py @@ -60,19 +60,16 @@ class ProviderEditView(ObjectEditView): queryset = Provider.objects.all() model_form = forms.ProviderForm template_name = 'circuits/provider_edit.html' - default_return_url = 'circuits:provider_list' class ProviderDeleteView(ObjectDeleteView): queryset = Provider.objects.all() - default_return_url = 'circuits:provider_list' class ProviderBulkImportView(BulkImportView): queryset = Provider.objects.all() model_form = forms.ProviderCSVForm table = tables.ProviderTable - default_return_url = 'circuits:provider_list' class ProviderBulkEditView(BulkEditView): @@ -80,14 +77,12 @@ class ProviderBulkEditView(BulkEditView): filterset = filters.ProviderFilterSet table = tables.ProviderTable form = forms.ProviderBulkEditForm - default_return_url = 'circuits:provider_list' class ProviderBulkDeleteView(BulkDeleteView): queryset = Provider.objects.annotate(count_circuits=Count('circuits')) filterset = filters.ProviderFilterSet table = tables.ProviderTable - default_return_url = 'circuits:provider_list' # @@ -102,20 +97,17 @@ class CircuitTypeListView(ObjectListView): class CircuitTypeEditView(ObjectEditView): queryset = CircuitType.objects.all() model_form = forms.CircuitTypeForm - default_return_url = 'circuits:circuittype_list' class CircuitTypeBulkImportView(BulkImportView): queryset = CircuitType.objects.all() model_form = forms.CircuitTypeCSVForm table = tables.CircuitTypeTable - default_return_url = 'circuits:circuittype_list' class CircuitTypeBulkDeleteView(BulkDeleteView): queryset = CircuitType.objects.annotate(circuit_count=Count('circuits')) table = tables.CircuitTypeTable - default_return_url = 'circuits:circuittype_list' # @@ -165,19 +157,16 @@ class CircuitEditView(ObjectEditView): queryset = Circuit.objects.all() model_form = forms.CircuitForm template_name = 'circuits/circuit_edit.html' - default_return_url = 'circuits:circuit_list' class CircuitDeleteView(ObjectDeleteView): queryset = Circuit.objects.all() - default_return_url = 'circuits:circuit_list' class CircuitBulkImportView(BulkImportView): queryset = Circuit.objects.all() model_form = forms.CircuitCSVForm table = tables.CircuitTable - default_return_url = 'circuits:circuit_list' class CircuitBulkEditView(BulkEditView): @@ -185,14 +174,12 @@ class CircuitBulkEditView(BulkEditView): filterset = filters.CircuitFilterSet table = tables.CircuitTable form = forms.CircuitBulkEditForm - default_return_url = 'circuits:circuit_list' class CircuitBulkDeleteView(BulkDeleteView): queryset = Circuit.objects.prefetch_related('provider', 'type', 'tenant').prefetch_related('terminations__site') filterset = filters.CircuitFilterSet table = tables.CircuitTable - default_return_url = 'circuits:circuit_list' class CircuitSwapTerminations(ObjectEditView): diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 864665701..3edc9b061 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -120,21 +120,18 @@ class RegionListView(ObjectListView): class RegionEditView(ObjectEditView): queryset = Region.objects.all() model_form = forms.RegionForm - default_return_url = 'dcim:region_list' class RegionBulkImportView(BulkImportView): queryset = Region.objects.all() model_form = forms.RegionCSVForm table = tables.RegionTable - default_return_url = 'dcim:region_list' class RegionBulkDeleteView(BulkDeleteView): queryset = Region.objects.all() filterset = filters.RegionFilterSet table = tables.RegionTable - default_return_url = 'dcim:region_list' # @@ -179,19 +176,16 @@ class SiteEditView(ObjectEditView): queryset = Site.objects.all() model_form = forms.SiteForm template_name = 'dcim/site_edit.html' - default_return_url = 'dcim:site_list' class SiteDeleteView(ObjectDeleteView): queryset = Site.objects.all() - default_return_url = 'dcim:site_list' class SiteBulkImportView(BulkImportView): queryset = Site.objects.all() model_form = forms.SiteCSVForm table = tables.SiteTable - default_return_url = 'dcim:site_list' class SiteBulkEditView(BulkEditView): @@ -199,14 +193,12 @@ class SiteBulkEditView(BulkEditView): filterset = filters.SiteFilterSet table = tables.SiteTable form = forms.SiteBulkEditForm - default_return_url = 'dcim:site_list' class SiteBulkDeleteView(BulkDeleteView): queryset = Site.objects.prefetch_related('region', 'tenant') filterset = filters.SiteFilterSet table = tables.SiteTable - default_return_url = 'dcim:site_list' # @@ -229,21 +221,18 @@ class RackGroupListView(ObjectListView): class RackGroupEditView(ObjectEditView): queryset = RackGroup.objects.all() model_form = forms.RackGroupForm - default_return_url = 'dcim:rackgroup_list' class RackGroupBulkImportView(BulkImportView): queryset = RackGroup.objects.all() model_form = forms.RackGroupCSVForm table = tables.RackGroupTable - default_return_url = 'dcim:rackgroup_list' class RackGroupBulkDeleteView(BulkDeleteView): queryset = RackGroup.objects.prefetch_related('site').annotate(rack_count=Count('racks')) filterset = filters.RackGroupFilterSet table = tables.RackGroupTable - default_return_url = 'dcim:rackgroup_list' # @@ -258,20 +247,17 @@ class RackRoleListView(ObjectListView): class RackRoleEditView(ObjectEditView): queryset = RackRole.objects.all() model_form = forms.RackRoleForm - default_return_url = 'dcim:rackrole_list' class RackRoleBulkImportView(BulkImportView): queryset = RackRole.objects.all() model_form = forms.RackRoleCSVForm table = tables.RackRoleTable - default_return_url = 'dcim:rackrole_list' class RackRoleBulkDeleteView(BulkDeleteView): queryset = RackRole.objects.annotate(rack_count=Count('racks')) table = tables.RackRoleTable - default_return_url = 'dcim:rackrole_list' # @@ -363,19 +349,16 @@ class RackEditView(ObjectEditView): queryset = Rack.objects.all() model_form = forms.RackForm template_name = 'dcim/rack_edit.html' - default_return_url = 'dcim:rack_list' class RackDeleteView(ObjectDeleteView): queryset = Rack.objects.all() - default_return_url = 'dcim:rack_list' class RackBulkImportView(BulkImportView): queryset = Rack.objects.all() model_form = forms.RackCSVForm table = tables.RackTable - default_return_url = 'dcim:rack_list' class RackBulkEditView(BulkEditView): @@ -383,14 +366,12 @@ class RackBulkEditView(BulkEditView): filterset = filters.RackFilterSet table = tables.RackTable form = forms.RackBulkEditForm - default_return_url = 'dcim:rack_list' class RackBulkDeleteView(BulkDeleteView): queryset = Rack.objects.prefetch_related('site', 'group', 'tenant', 'role') filterset = filters.RackFilterSet table = tables.RackTable - default_return_url = 'dcim:rack_list' # @@ -421,7 +402,6 @@ class RackReservationEditView(ObjectEditView): queryset = RackReservation.objects.all() model_form = forms.RackReservationForm template_name = 'dcim/rackreservation_edit.html' - default_return_url = 'dcim:rackreservation_list' def alter_obj(self, obj, request, args, kwargs): if not obj.pk: @@ -433,14 +413,12 @@ class RackReservationEditView(ObjectEditView): class RackReservationDeleteView(ObjectDeleteView): queryset = RackReservation.objects.all() - default_return_url = 'dcim:rackreservation_list' class RackReservationImportView(BulkImportView): queryset = RackReservation.objects.all() model_form = forms.RackReservationCSVForm table = tables.RackReservationTable - default_return_url = 'dcim:rackreservation_list' def _save_obj(self, obj_form, request): """ @@ -458,14 +436,12 @@ class RackReservationBulkEditView(BulkEditView): filterset = filters.RackReservationFilterSet table = tables.RackReservationTable form = forms.RackReservationBulkEditForm - default_return_url = 'dcim:rackreservation_list' class RackReservationBulkDeleteView(BulkDeleteView): queryset = RackReservation.objects.prefetch_related('rack', 'user') filterset = filters.RackReservationFilterSet table = tables.RackReservationTable - default_return_url = 'dcim:rackreservation_list' # @@ -484,20 +460,17 @@ class ManufacturerListView(ObjectListView): class ManufacturerEditView(ObjectEditView): queryset = Manufacturer.objects.all() model_form = forms.ManufacturerForm - default_return_url = 'dcim:manufacturer_list' class ManufacturerBulkImportView(BulkImportView): queryset = Manufacturer.objects.all() model_form = forms.ManufacturerCSVForm table = tables.ManufacturerTable - default_return_url = 'dcim:manufacturer_list' class ManufacturerBulkDeleteView(BulkDeleteView): queryset = Manufacturer.objects.annotate(devicetype_count=Count('device_types')) table = tables.ManufacturerTable - default_return_url = 'dcim:manufacturer_list' # @@ -580,12 +553,10 @@ class DeviceTypeEditView(ObjectEditView): queryset = DeviceType.objects.all() model_form = forms.DeviceTypeForm template_name = 'dcim/devicetype_edit.html' - default_return_url = 'dcim:devicetype_list' class DeviceTypeDeleteView(ObjectDeleteView): queryset = DeviceType.objects.all() - default_return_url = 'dcim:devicetype_list' class DeviceTypeImportView(ObjectImportView): @@ -612,7 +583,6 @@ class DeviceTypeImportView(ObjectImportView): ('front-ports', forms.FrontPortTemplateImportForm), ('device-bays', forms.DeviceBayTemplateImportForm), )) - default_return_url = 'dcim:devicetype_import' class DeviceTypeBulkEditView(BulkEditView): @@ -620,14 +590,12 @@ class DeviceTypeBulkEditView(BulkEditView): filterset = filters.DeviceTypeFilterSet table = tables.DeviceTypeTable form = forms.DeviceTypeBulkEditForm - default_return_url = 'dcim:devicetype_list' class DeviceTypeBulkDeleteView(BulkDeleteView): queryset = DeviceType.objects.prefetch_related('manufacturer').annotate(instance_count=Count('instances')) filterset = filters.DeviceTypeFilterSet table = tables.DeviceTypeTable - default_return_url = 'dcim:devicetype_list' # @@ -890,20 +858,17 @@ class DeviceRoleListView(ObjectListView): class DeviceRoleEditView(ObjectEditView): queryset = DeviceRole.objects.all() model_form = forms.DeviceRoleForm - default_return_url = 'dcim:devicerole_list' class DeviceRoleBulkImportView(BulkImportView): queryset = DeviceRole.objects.all() model_form = forms.DeviceRoleCSVForm table = tables.DeviceRoleTable - default_return_url = 'dcim:devicerole_list' class DeviceRoleBulkDeleteView(BulkDeleteView): queryset = DeviceRole.objects.all() table = tables.DeviceRoleTable - default_return_url = 'dcim:devicerole_list' # @@ -918,20 +883,17 @@ class PlatformListView(ObjectListView): class PlatformEditView(ObjectEditView): queryset = Platform.objects.all() model_form = forms.PlatformForm - default_return_url = 'dcim:platform_list' class PlatformBulkImportView(BulkImportView): queryset = Platform.objects.all() model_form = forms.PlatformCSVForm table = tables.PlatformTable - default_return_url = 'dcim:platform_list' class PlatformBulkDeleteView(BulkDeleteView): queryset = Platform.objects.all() table = tables.PlatformTable - default_return_url = 'dcim:platform_list' # @@ -1118,12 +1080,10 @@ class DeviceEditView(ObjectEditView): queryset = Device.objects.all() model_form = forms.DeviceForm template_name = 'dcim/device_edit.html' - default_return_url = 'dcim:device_list' class DeviceDeleteView(ObjectDeleteView): queryset = Device.objects.all() - default_return_url = 'dcim:device_list' class DeviceBulkImportView(BulkImportView): @@ -1131,7 +1091,6 @@ class DeviceBulkImportView(BulkImportView): model_form = forms.DeviceCSVForm table = tables.DeviceImportTable template_name = 'dcim/device_import.html' - default_return_url = 'dcim:device_list' class ChildDeviceBulkImportView(BulkImportView): @@ -1139,7 +1098,6 @@ class ChildDeviceBulkImportView(BulkImportView): model_form = forms.ChildDeviceCSVForm table = tables.DeviceImportTable template_name = 'dcim/device_import_child.html' - default_return_url = 'dcim:device_list' def _save_obj(self, obj_form, request): @@ -1158,14 +1116,12 @@ class DeviceBulkEditView(BulkEditView): filterset = filters.DeviceFilterSet table = tables.DeviceTable form = forms.DeviceBulkEditForm - default_return_url = 'dcim:device_list' class DeviceBulkDeleteView(BulkDeleteView): queryset = Device.objects.prefetch_related('tenant', 'site', 'rack', 'device_role', 'device_type__manufacturer') filterset = filters.DeviceFilterSet table = tables.DeviceTable - default_return_url = 'dcim:device_list' # @@ -1204,7 +1160,6 @@ class ConsolePortBulkImportView(BulkImportView): queryset = ConsolePort.objects.all() model_form = forms.ConsolePortCSVForm table = tables.ConsolePortTable - default_return_url = 'dcim:consoleport_list' class ConsolePortBulkEditView(BulkEditView): @@ -1226,7 +1181,6 @@ class ConsolePortBulkDeleteView(BulkDeleteView): queryset = ConsolePort.objects.all() filterset = filters.ConsolePortFilterSet table = tables.ConsolePortTable - default_return_url = 'dcim:consoleport_list' # @@ -1265,7 +1219,6 @@ class ConsoleServerPortBulkImportView(BulkImportView): queryset = ConsoleServerPort.objects.all() model_form = forms.ConsoleServerPortCSVForm table = tables.ConsoleServerPortTable - default_return_url = 'dcim:consoleserverport_list' class ConsoleServerPortBulkEditView(BulkEditView): @@ -1287,7 +1240,6 @@ class ConsoleServerPortBulkDeleteView(BulkDeleteView): queryset = ConsoleServerPort.objects.all() filterset = filters.ConsoleServerPortFilterSet table = tables.ConsoleServerPortTable - default_return_url = 'dcim:consoleserverport_list' # @@ -1326,7 +1278,6 @@ class PowerPortBulkImportView(BulkImportView): queryset = PowerPort.objects.all() model_form = forms.PowerPortCSVForm table = tables.PowerPortTable - default_return_url = 'dcim:powerport_list' class PowerPortBulkEditView(BulkEditView): @@ -1348,7 +1299,6 @@ class PowerPortBulkDeleteView(BulkDeleteView): queryset = PowerPort.objects.all() filterset = filters.PowerPortFilterSet table = tables.PowerPortTable - default_return_url = 'dcim:powerport_list' # @@ -1387,7 +1337,6 @@ class PowerOutletBulkImportView(BulkImportView): queryset = PowerOutlet.objects.all() model_form = forms.PowerOutletCSVForm table = tables.PowerOutletTable - default_return_url = 'dcim:poweroutlet_list' class PowerOutletBulkEditView(BulkEditView): @@ -1409,7 +1358,6 @@ class PowerOutletBulkDeleteView(BulkDeleteView): queryset = PowerOutlet.objects.all() filterset = filters.PowerOutletFilterSet table = tables.PowerOutletTable - default_return_url = 'dcim:poweroutlet_list' # @@ -1481,7 +1429,6 @@ class InterfaceBulkImportView(BulkImportView): queryset = Interface.objects.all() model_form = forms.InterfaceCSVForm table = tables.InterfaceTable - default_return_url = 'dcim:interface_list' class InterfaceBulkEditView(BulkEditView): @@ -1503,7 +1450,6 @@ class InterfaceBulkDeleteView(BulkDeleteView): queryset = Interface.objects.all() filterset = filters.InterfaceFilterSet table = tables.InterfaceTable - default_return_url = 'dcim:interface_list' # @@ -1542,7 +1488,6 @@ class FrontPortBulkImportView(BulkImportView): queryset = FrontPort.objects.all() model_form = forms.FrontPortCSVForm table = tables.FrontPortTable - default_return_url = 'dcim:frontport_list' class FrontPortBulkEditView(BulkEditView): @@ -1564,7 +1509,6 @@ class FrontPortBulkDeleteView(BulkDeleteView): queryset = FrontPort.objects.all() filterset = filters.FrontPortFilterSet table = tables.FrontPortTable - default_return_url = 'dcim:frontport_list' # @@ -1603,7 +1547,6 @@ class RearPortBulkImportView(BulkImportView): queryset = RearPort.objects.all() model_form = forms.RearPortCSVForm table = tables.RearPortTable - default_return_url = 'dcim:rearport_list' class RearPortBulkEditView(BulkEditView): @@ -1625,7 +1568,6 @@ class RearPortBulkDeleteView(BulkDeleteView): queryset = RearPort.objects.all() filterset = filters.RearPortFilterSet table = tables.RearPortTable - default_return_url = 'dcim:rearport_list' # @@ -1731,7 +1673,6 @@ class DeviceBayBulkImportView(BulkImportView): queryset = DeviceBay.objects.all() model_form = forms.DeviceBayCSVForm table = tables.DeviceBayTable - default_return_url = 'dcim:devicebay_list' class DeviceBayBulkEditView(BulkEditView): @@ -1749,7 +1690,6 @@ class DeviceBayBulkDeleteView(BulkDeleteView): queryset = DeviceBay.objects.all() filterset = filters.DeviceBayFilterSet table = tables.DeviceBayTable - default_return_url = 'dcim:devicebay_list' # @@ -1901,7 +1841,6 @@ class CableTraceView(ObjectView): class CableCreateView(ObjectEditView): queryset = Cable.objects.all() template_name = 'dcim/cable_connect.html' - default_return_url = 'dcim:cable_list' def dispatch(self, request, *args, **kwargs): @@ -1959,19 +1898,16 @@ class CableEditView(ObjectEditView): queryset = Cable.objects.all() model_form = forms.CableForm template_name = 'dcim/cable_edit.html' - default_return_url = 'dcim:cable_list' class CableDeleteView(ObjectDeleteView): queryset = Cable.objects.all() - default_return_url = 'dcim:cable_list' class CableBulkImportView(BulkImportView): queryset = Cable.objects.all() model_form = forms.CableCSVForm table = tables.CableTable - default_return_url = 'dcim:cable_list' class CableBulkEditView(BulkEditView): @@ -1979,14 +1915,12 @@ class CableBulkEditView(BulkEditView): filterset = filters.CableFilterSet table = tables.CableTable form = forms.CableBulkEditForm - default_return_url = 'dcim:cable_list' class CableBulkDeleteView(BulkDeleteView): queryset = Cable.objects.prefetch_related('termination_a', 'termination_b') filterset = filters.CableFilterSet table = tables.CableTable - default_return_url = 'dcim:cable_list' # @@ -2122,7 +2056,6 @@ class InventoryItemBulkImportView(BulkImportView): queryset = InventoryItem.objects.all() model_form = forms.InventoryItemCSVForm table = tables.InventoryItemTable - default_return_url = 'dcim:inventoryitem_list' class InventoryItemBulkEditView(BulkEditView): @@ -2130,14 +2063,12 @@ class InventoryItemBulkEditView(BulkEditView): filterset = filters.InventoryItemFilterSet table = tables.InventoryItemTable form = forms.InventoryItemBulkEditForm - default_return_url = 'dcim:inventoryitem_list' class InventoryItemBulkDeleteView(BulkDeleteView): queryset = InventoryItem.objects.prefetch_related('device', 'manufacturer') table = tables.InventoryItemTable template_name = 'dcim/inventoryitem_bulk_delete.html' - default_return_url = 'dcim:inventoryitem_list' # @@ -2169,7 +2100,6 @@ class VirtualChassisCreateView(ObjectEditView): queryset = VirtualChassis.objects.all() model_form = forms.VirtualChassisCreateForm template_name = 'dcim/virtualchassis_add.html' - default_return_url = 'dcim:virtualchassis_list' class VirtualChassisEditView(ObjectPermissionRequiredMixin, GetReturnURLMixin, View): @@ -2242,7 +2172,6 @@ class VirtualChassisEditView(ObjectPermissionRequiredMixin, GetReturnURLMixin, V class VirtualChassisDeleteView(ObjectDeleteView): queryset = VirtualChassis.objects.all() - default_return_url = 'dcim:device_list' class VirtualChassisAddMemberView(ObjectPermissionRequiredMixin, GetReturnURLMixin, View): @@ -2356,7 +2285,6 @@ class VirtualChassisBulkImportView(BulkImportView): queryset = VirtualChassis.objects.all() model_form = forms.VirtualChassisCSVForm table = tables.VirtualChassisTable - default_return_url = 'dcim:virtualchassis_list' class VirtualChassisBulkEditView(BulkEditView): @@ -2364,14 +2292,12 @@ class VirtualChassisBulkEditView(BulkEditView): filterset = filters.VirtualChassisFilterSet table = tables.VirtualChassisTable form = forms.VirtualChassisBulkEditForm - default_return_url = 'dcim:virtualchassis_list' class VirtualChassisBulkDeleteView(BulkDeleteView): queryset = VirtualChassis.objects.all() filterset = filters.VirtualChassisFilterSet table = tables.VirtualChassisTable - default_return_url = 'dcim:virtualchassis_list' # @@ -2411,19 +2337,16 @@ class PowerPanelView(ObjectView): class PowerPanelEditView(ObjectEditView): queryset = PowerPanel.objects.all() model_form = forms.PowerPanelForm - default_return_url = 'dcim:powerpanel_list' class PowerPanelDeleteView(ObjectDeleteView): queryset = PowerPanel.objects.all() - default_return_url = 'dcim:powerpanel_list' class PowerPanelBulkImportView(BulkImportView): queryset = PowerPanel.objects.all() model_form = forms.PowerPanelCSVForm table = tables.PowerPanelTable - default_return_url = 'dcim:powerpanel_list' class PowerPanelBulkEditView(BulkEditView): @@ -2431,7 +2354,6 @@ class PowerPanelBulkEditView(BulkEditView): filterset = filters.PowerPanelFilterSet table = tables.PowerPanelTable form = forms.PowerPanelBulkEditForm - default_return_url = 'dcim:powerpanel_list' class PowerPanelBulkDeleteView(BulkDeleteView): @@ -2442,7 +2364,6 @@ class PowerPanelBulkDeleteView(BulkDeleteView): ) filterset = filters.PowerPanelFilterSet table = tables.PowerPanelTable - default_return_url = 'dcim:powerpanel_list' # @@ -2474,19 +2395,16 @@ class PowerFeedEditView(ObjectEditView): queryset = PowerFeed.objects.all() model_form = forms.PowerFeedForm template_name = 'dcim/powerfeed_edit.html' - default_return_url = 'dcim:powerfeed_list' class PowerFeedDeleteView(ObjectDeleteView): queryset = PowerFeed.objects.all() - default_return_url = 'dcim:powerfeed_list' class PowerFeedBulkImportView(BulkImportView): queryset = PowerFeed.objects.all() model_form = forms.PowerFeedCSVForm table = tables.PowerFeedTable - default_return_url = 'dcim:powerfeed_list' class PowerFeedBulkEditView(BulkEditView): @@ -2494,11 +2412,9 @@ class PowerFeedBulkEditView(BulkEditView): filterset = filters.PowerFeedFilterSet table = tables.PowerFeedTable form = forms.PowerFeedBulkEditForm - default_return_url = 'dcim:powerfeed_list' class PowerFeedBulkDeleteView(BulkDeleteView): queryset = PowerFeed.objects.prefetch_related('power_panel', 'rack') filterset = filters.PowerFeedFilterSet table = tables.PowerFeedTable - default_return_url = 'dcim:powerfeed_list' diff --git a/netbox/extras/views.py b/netbox/extras/views.py index 55064b5cf..879ca89d0 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -70,20 +70,17 @@ class TagView(ObjectView): class TagEditView(ObjectEditView): queryset = Tag.objects.all() model_form = forms.TagForm - default_return_url = 'extras:tag_list' template_name = 'extras/tag_edit.html' class TagDeleteView(ObjectDeleteView): queryset = Tag.objects.all() - default_return_url = 'extras:tag_list' class TagBulkImportView(BulkImportView): queryset = Tag.objects.all() model_form = forms.TagCSVForm table = tables.TagTable - default_return_url = 'extras:tag_list' class TagBulkEditView(BulkEditView): @@ -94,7 +91,6 @@ class TagBulkEditView(BulkEditView): ) table = tables.TagTable form = forms.TagBulkEditForm - default_return_url = 'extras:tag_list' class TagBulkDeleteView(BulkDeleteView): @@ -104,7 +100,6 @@ class TagBulkDeleteView(BulkDeleteView): 'name' ) table = tables.TagTable - default_return_url = 'extras:tag_list' # @@ -156,7 +151,6 @@ class ConfigContextView(ObjectView): class ConfigContextEditView(ObjectEditView): queryset = ConfigContext.objects.all() model_form = forms.ConfigContextForm - default_return_url = 'extras:configcontext_list' template_name = 'extras/configcontext_edit.html' @@ -165,18 +159,15 @@ class ConfigContextBulkEditView(BulkEditView): filterset = filters.ConfigContextFilterSet table = tables.ConfigContextTable form = forms.ConfigContextBulkEditForm - default_return_url = 'extras:configcontext_list' class ConfigContextDeleteView(ObjectDeleteView): queryset = ConfigContext.objects.all() - default_return_url = 'extras:configcontext_list' class ConfigContextBulkDeleteView(BulkDeleteView): queryset = ConfigContext.objects.all() table = tables.ConfigContextTable - default_return_url = 'extras:configcontext_list' class ObjectConfigContextView(ObjectView): diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index e33cb3c6e..81e210958 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -48,19 +48,16 @@ class VRFEditView(ObjectEditView): queryset = VRF.objects.all() model_form = forms.VRFForm template_name = 'ipam/vrf_edit.html' - default_return_url = 'ipam:vrf_list' class VRFDeleteView(ObjectDeleteView): queryset = VRF.objects.all() - default_return_url = 'ipam:vrf_list' class VRFBulkImportView(BulkImportView): queryset = VRF.objects.all() model_form = forms.VRFCSVForm table = tables.VRFTable - default_return_url = 'ipam:vrf_list' class VRFBulkEditView(BulkEditView): @@ -68,14 +65,12 @@ class VRFBulkEditView(BulkEditView): filterset = filters.VRFFilterSet table = tables.VRFTable form = forms.VRFBulkEditForm - default_return_url = 'ipam:vrf_list' class VRFBulkDeleteView(BulkDeleteView): queryset = VRF.objects.prefetch_related('tenant') filterset = filters.VRFFilterSet table = tables.VRFTable - default_return_url = 'ipam:vrf_list' # @@ -163,21 +158,18 @@ class RIRListView(ObjectListView): class RIREditView(ObjectEditView): queryset = RIR.objects.all() model_form = forms.RIRForm - default_return_url = 'ipam:rir_list' class RIRBulkImportView(BulkImportView): queryset = RIR.objects.all() model_form = forms.RIRCSVForm table = tables.RIRTable - default_return_url = 'ipam:rir_list' class RIRBulkDeleteView(BulkDeleteView): queryset = RIR.objects.annotate(aggregate_count=Count('aggregates')) filterset = filters.RIRFilterSet table = tables.RIRTable - default_return_url = 'ipam:rir_list' # @@ -259,19 +251,16 @@ class AggregateEditView(ObjectEditView): queryset = Aggregate.objects.all() model_form = forms.AggregateForm template_name = 'ipam/aggregate_edit.html' - default_return_url = 'ipam:aggregate_list' class AggregateDeleteView(ObjectDeleteView): queryset = Aggregate.objects.all() - default_return_url = 'ipam:aggregate_list' class AggregateBulkImportView(BulkImportView): queryset = Aggregate.objects.all() model_form = forms.AggregateCSVForm table = tables.AggregateTable - default_return_url = 'ipam:aggregate_list' class AggregateBulkEditView(BulkEditView): @@ -279,14 +268,12 @@ class AggregateBulkEditView(BulkEditView): filterset = filters.AggregateFilterSet table = tables.AggregateTable form = forms.AggregateBulkEditForm - default_return_url = 'ipam:aggregate_list' class AggregateBulkDeleteView(BulkDeleteView): queryset = Aggregate.objects.prefetch_related('rir') filterset = filters.AggregateFilterSet table = tables.AggregateTable - default_return_url = 'ipam:aggregate_list' # @@ -301,20 +288,17 @@ class RoleListView(ObjectListView): class RoleEditView(ObjectEditView): queryset = Role.objects.all() model_form = forms.RoleForm - default_return_url = 'ipam:role_list' class RoleBulkImportView(BulkImportView): queryset = Role.objects.all() model_form = forms.RoleCSVForm table = tables.RoleTable - default_return_url = 'ipam:role_list' class RoleBulkDeleteView(BulkDeleteView): queryset = Role.objects.all() table = tables.RoleTable - default_return_url = 'ipam:role_list' # @@ -470,20 +454,17 @@ class PrefixEditView(ObjectEditView): queryset = Prefix.objects.all() model_form = forms.PrefixForm template_name = 'ipam/prefix_edit.html' - default_return_url = 'ipam:prefix_list' class PrefixDeleteView(ObjectDeleteView): queryset = Prefix.objects.all() template_name = 'ipam/prefix_delete.html' - default_return_url = 'ipam:prefix_list' class PrefixBulkImportView(BulkImportView): queryset = Prefix.objects.all() model_form = forms.PrefixCSVForm table = tables.PrefixTable - default_return_url = 'ipam:prefix_list' class PrefixBulkEditView(BulkEditView): @@ -491,14 +472,12 @@ class PrefixBulkEditView(BulkEditView): filterset = filters.PrefixFilterSet table = tables.PrefixTable form = forms.PrefixBulkEditForm - default_return_url = 'ipam:prefix_list' class PrefixBulkDeleteView(BulkDeleteView): queryset = Prefix.objects.prefetch_related('site', 'vrf__tenant', 'tenant', 'vlan', 'role') filterset = filters.PrefixFilterSet table = tables.PrefixTable - default_return_url = 'ipam:prefix_list' # @@ -569,7 +548,6 @@ class IPAddressEditView(ObjectEditView): queryset = IPAddress.objects.all() model_form = forms.IPAddressForm template_name = 'ipam/ipaddress_edit.html' - default_return_url = 'ipam:ipaddress_list' def alter_obj(self, obj, request, url_args, url_kwargs): @@ -630,7 +608,6 @@ class IPAddressAssignView(ObjectView): class IPAddressDeleteView(ObjectDeleteView): queryset = IPAddress.objects.all() - default_return_url = 'ipam:ipaddress_list' class IPAddressBulkCreateView(BulkCreateView): @@ -639,14 +616,12 @@ class IPAddressBulkCreateView(BulkCreateView): model_form = forms.IPAddressBulkAddForm pattern_target = 'address' template_name = 'ipam/ipaddress_bulk_add.html' - default_return_url = 'ipam:ipaddress_list' class IPAddressBulkImportView(BulkImportView): queryset = IPAddress.objects.all() model_form = forms.IPAddressCSVForm table = tables.IPAddressTable - default_return_url = 'ipam:ipaddress_list' class IPAddressBulkEditView(BulkEditView): @@ -654,14 +629,12 @@ class IPAddressBulkEditView(BulkEditView): filterset = filters.IPAddressFilterSet table = tables.IPAddressTable form = forms.IPAddressBulkEditForm - default_return_url = 'ipam:ipaddress_list' class IPAddressBulkDeleteView(BulkDeleteView): queryset = IPAddress.objects.prefetch_related('vrf__tenant', 'tenant') filterset = filters.IPAddressFilterSet table = tables.IPAddressTable - default_return_url = 'ipam:ipaddress_list' # @@ -678,21 +651,18 @@ class VLANGroupListView(ObjectListView): class VLANGroupEditView(ObjectEditView): queryset = VLANGroup.objects.all() model_form = forms.VLANGroupForm - default_return_url = 'ipam:vlangroup_list' class VLANGroupBulkImportView(BulkImportView): queryset = VLANGroup.objects.all() model_form = forms.VLANGroupCSVForm table = tables.VLANGroupTable - default_return_url = 'ipam:vlangroup_list' class VLANGroupBulkDeleteView(BulkDeleteView): queryset = VLANGroup.objects.prefetch_related('site').annotate(vlan_count=Count('vlans')) filterset = filters.VLANGroupFilterSet table = tables.VLANGroupTable - default_return_url = 'ipam:vlangroup_list' class VLANGroupVLANsView(ObjectView): @@ -789,19 +759,16 @@ class VLANEditView(ObjectEditView): queryset = VLAN.objects.all() model_form = forms.VLANForm template_name = 'ipam/vlan_edit.html' - default_return_url = 'ipam:vlan_list' class VLANDeleteView(ObjectDeleteView): queryset = VLAN.objects.all() - default_return_url = 'ipam:vlan_list' class VLANBulkImportView(BulkImportView): queryset = VLAN.objects.all() model_form = forms.VLANCSVForm table = tables.VLANTable - default_return_url = 'ipam:vlan_list' class VLANBulkEditView(BulkEditView): @@ -809,14 +776,12 @@ class VLANBulkEditView(BulkEditView): filterset = filters.VLANFilterSet table = tables.VLANTable form = forms.VLANBulkEditForm - default_return_url = 'ipam:vlan_list' class VLANBulkDeleteView(BulkDeleteView): queryset = VLAN.objects.prefetch_related('site', 'group', 'tenant', 'role') filterset = filters.VLANFilterSet table = tables.VLANTable - default_return_url = 'ipam:vlan_list' # @@ -863,7 +828,6 @@ class ServiceBulkImportView(BulkImportView): queryset = Service.objects.all() model_form = forms.ServiceCSVForm table = tables.ServiceTable - default_return_url = 'ipam:service_list' class ServiceDeleteView(ObjectDeleteView): @@ -875,11 +839,9 @@ class ServiceBulkEditView(BulkEditView): filterset = filters.ServiceFilterSet table = tables.ServiceTable form = forms.ServiceBulkEditForm - default_return_url = 'ipam:service_list' class ServiceBulkDeleteView(BulkDeleteView): queryset = Service.objects.prefetch_related('device', 'virtual_machine') filterset = filters.ServiceFilterSet table = tables.ServiceTable - default_return_url = 'ipam:service_list' diff --git a/netbox/secrets/views.py b/netbox/secrets/views.py index a5aabaecd..fec7c65d1 100644 --- a/netbox/secrets/views.py +++ b/netbox/secrets/views.py @@ -36,20 +36,17 @@ class SecretRoleListView(ObjectListView): class SecretRoleEditView(ObjectEditView): queryset = SecretRole.objects.all() model_form = forms.SecretRoleForm - default_return_url = 'secrets:secretrole_list' class SecretRoleBulkImportView(BulkImportView): queryset = SecretRole.objects.all() model_form = forms.SecretRoleCSVForm table = tables.SecretRoleTable - default_return_url = 'secrets:secretrole_list' class SecretRoleBulkDeleteView(BulkDeleteView): queryset = SecretRole.objects.annotate(secret_count=Count('secrets')) table = tables.SecretRoleTable - default_return_url = 'secrets:secretrole_list' # @@ -147,7 +144,6 @@ class SecretEditView(ObjectEditView): class SecretDeleteView(ObjectDeleteView): queryset = Secret.objects.all() - default_return_url = 'secrets:secret_list' class SecretBulkImportView(BulkImportView): @@ -155,7 +151,6 @@ class SecretBulkImportView(BulkImportView): model_form = forms.SecretCSVForm table = tables.SecretTable template_name = 'secrets/secret_import.html' - default_return_url = 'secrets:secret_list' widget_attrs = {'class': 'requires-session-key'} master_key = None @@ -203,11 +198,9 @@ class SecretBulkEditView(BulkEditView): filterset = filters.SecretFilterSet table = tables.SecretTable form = forms.SecretBulkEditForm - default_return_url = 'secrets:secret_list' class SecretBulkDeleteView(BulkDeleteView): queryset = Secret.objects.prefetch_related('role', 'device') filterset = filters.SecretFilterSet table = tables.SecretTable - default_return_url = 'secrets:secret_list' diff --git a/netbox/tenancy/views.py b/netbox/tenancy/views.py index a82b231f5..26b1ce027 100644 --- a/netbox/tenancy/views.py +++ b/netbox/tenancy/views.py @@ -30,20 +30,17 @@ class TenantGroupListView(ObjectListView): class TenantGroupEditView(ObjectEditView): queryset = TenantGroup.objects.all() model_form = forms.TenantGroupForm - default_return_url = 'tenancy:tenantgroup_list' class TenantGroupBulkImportView(BulkImportView): queryset = TenantGroup.objects.all() model_form = forms.TenantGroupCSVForm table = tables.TenantGroupTable - default_return_url = 'tenancy:tenantgroup_list' class TenantGroupBulkDeleteView(BulkDeleteView): queryset = TenantGroup.objects.annotate(tenant_count=Count('tenants')) table = tables.TenantGroupTable - default_return_url = 'tenancy:tenantgroup_list' # @@ -87,19 +84,16 @@ class TenantEditView(ObjectEditView): queryset = Tenant.objects.all() model_form = forms.TenantForm template_name = 'tenancy/tenant_edit.html' - default_return_url = 'tenancy:tenant_list' class TenantDeleteView(ObjectDeleteView): queryset = Tenant.objects.all() - default_return_url = 'tenancy:tenant_list' class TenantBulkImportView(BulkImportView): queryset = Tenant.objects.all() model_form = forms.TenantCSVForm table = tables.TenantTable - default_return_url = 'tenancy:tenant_list' class TenantBulkEditView(BulkEditView): @@ -107,11 +101,9 @@ class TenantBulkEditView(BulkEditView): filterset = filters.TenantFilterSet table = tables.TenantTable form = forms.TenantBulkEditForm - default_return_url = 'tenancy:tenant_list' class TenantBulkDeleteView(BulkDeleteView): queryset = Tenant.objects.prefetch_related('group') filterset = filters.TenantFilterSet table = tables.TenantTable - default_return_url = 'tenancy:tenant_list' diff --git a/netbox/utilities/views.py b/netbox/utilities/views.py index 6596660ce..f06fb622b 100644 --- a/netbox/utilities/views.py +++ b/netbox/utilities/views.py @@ -16,6 +16,7 @@ from django.shortcuts import get_object_or_404, redirect, render from django.template import loader from django.template.exceptions import TemplateDoesNotExist from django.urls import reverse +from django.urls.exceptions import NoReverseMatch from django.utils.decorators import method_decorator from django.utils.html import escape from django.utils.http import is_safe_url @@ -86,7 +87,7 @@ class ObjectPermissionRequiredMixin(AccessMixin): return super().dispatch(request, *args, **kwargs) -class GetReturnURLMixin(object): +class GetReturnURLMixin: """ Provides logic for determining where a user should be redirected after processing a form. """ @@ -101,13 +102,21 @@ class GetReturnURLMixin(object): return query_param # Next, check if the object being modified (if any) has an absolute URL. - elif obj is not None and obj.pk and hasattr(obj, 'get_absolute_url'): + if obj is not None and obj.pk and hasattr(obj, 'get_absolute_url'): return obj.get_absolute_url() # Fall back to the default URL (if specified) for the view. - elif self.default_return_url is not None: + if self.default_return_url is not None: return reverse(self.default_return_url) + # Attempt to dynamically resolve the list view for the object + if hasattr(self, 'queryset'): + model_opts = self.queryset.model._meta + try: + return reverse(f'{model_opts.app_label}:{model_opts.model_name}_list') + except NoReverseMatch: + pass + # If all else fails, return home. Ideally this should never happen. return reverse('home') diff --git a/netbox/virtualization/views.py b/netbox/virtualization/views.py index fadd614c3..478fead94 100644 --- a/netbox/virtualization/views.py +++ b/netbox/virtualization/views.py @@ -29,20 +29,17 @@ class ClusterTypeListView(ObjectListView): class ClusterTypeEditView(ObjectEditView): queryset = ClusterType.objects.all() model_form = forms.ClusterTypeForm - default_return_url = 'virtualization:clustertype_list' class ClusterTypeBulkImportView(BulkImportView): queryset = ClusterType.objects.all() model_form = forms.ClusterTypeCSVForm table = tables.ClusterTypeTable - default_return_url = 'virtualization:clustertype_list' class ClusterTypeBulkDeleteView(BulkDeleteView): queryset = ClusterType.objects.annotate(cluster_count=Count('clusters')) table = tables.ClusterTypeTable - default_return_url = 'virtualization:clustertype_list' # @@ -57,20 +54,17 @@ class ClusterGroupListView(ObjectListView): class ClusterGroupEditView(ObjectEditView): queryset = ClusterGroup.objects.all() model_form = forms.ClusterGroupForm - default_return_url = 'virtualization:clustergroup_list' class ClusterGroupBulkImportView(BulkImportView): queryset = ClusterGroup.objects.all() model_form = forms.ClusterGroupCSVForm table = tables.ClusterGroupTable - default_return_url = 'virtualization:clustergroup_list' class ClusterGroupBulkDeleteView(BulkDeleteView): queryset = ClusterGroup.objects.annotate(cluster_count=Count('clusters')) table = tables.ClusterGroupTable - default_return_url = 'virtualization:clustergroup_list' # @@ -114,14 +108,12 @@ class ClusterEditView(ObjectEditView): class ClusterDeleteView(ObjectDeleteView): queryset = Cluster.objects.all() - default_return_url = 'virtualization:cluster_list' class ClusterBulkImportView(BulkImportView): queryset = Cluster.objects.all() model_form = forms.ClusterCSVForm table = tables.ClusterTable - default_return_url = 'virtualization:cluster_list' class ClusterBulkEditView(BulkEditView): @@ -129,14 +121,12 @@ class ClusterBulkEditView(BulkEditView): filterset = filters.ClusterFilterSet table = tables.ClusterTable form = forms.ClusterBulkEditForm - default_return_url = 'virtualization:cluster_list' class ClusterBulkDeleteView(BulkDeleteView): queryset = Cluster.objects.prefetch_related('type', 'group', 'site') filterset = filters.ClusterFilterSet table = tables.ClusterTable - default_return_url = 'virtualization:cluster_list' class ClusterAddDevicesView(ObjectEditView): @@ -266,19 +256,16 @@ class VirtualMachineEditView(ObjectEditView): queryset = VirtualMachine.objects.all() model_form = forms.VirtualMachineForm template_name = 'virtualization/virtualmachine_edit.html' - default_return_url = 'virtualization:virtualmachine_list' class VirtualMachineDeleteView(ObjectDeleteView): queryset = VirtualMachine.objects.all() - default_return_url = 'virtualization:virtualmachine_list' class VirtualMachineBulkImportView(BulkImportView): queryset = VirtualMachine.objects.all() model_form = forms.VirtualMachineCSVForm table = tables.VirtualMachineTable - default_return_url = 'virtualization:virtualmachine_list' class VirtualMachineBulkEditView(BulkEditView): @@ -286,14 +273,12 @@ class VirtualMachineBulkEditView(BulkEditView): filterset = filters.VirtualMachineFilterSet table = tables.VirtualMachineTable form = forms.VirtualMachineBulkEditForm - default_return_url = 'virtualization:virtualmachine_list' class VirtualMachineBulkDeleteView(BulkDeleteView): queryset = VirtualMachine.objects.prefetch_related('cluster', 'tenant', 'role') filterset = filters.VirtualMachineFilterSet table = tables.VirtualMachineTable - default_return_url = 'virtualization:virtualmachine_list' # @@ -364,7 +349,6 @@ class VMInterfaceBulkImportView(BulkImportView): queryset = VMInterface.objects.all() model_form = forms.VMInterfaceCSVForm table = tables.VMInterfaceTable - default_return_url = 'virtualization:vminterface_list' class VMInterfaceBulkEditView(BulkEditView): @@ -395,4 +379,3 @@ class VirtualMachineBulkAddInterfaceView(BulkComponentCreateView): model_form = forms.VMInterfaceForm filterset = filters.VirtualMachineFilterSet table = tables.VirtualMachineTable - default_return_url = 'virtualization:virtualmachine_list'