Standardized naming of return_url for all object views

This commit is contained in:
Jeremy Stretch 2017-01-23 14:07:26 -05:00
parent b70eca7661
commit 52420945b2
42 changed files with 181 additions and 179 deletions

View File

@ -47,7 +47,7 @@ class ProviderEditView(PermissionRequiredMixin, ObjectEditView):
model = Provider model = Provider
form_class = forms.ProviderForm form_class = forms.ProviderForm
template_name = 'circuits/provider_edit.html' template_name = 'circuits/provider_edit.html'
obj_list_url = 'circuits:provider_list' default_return_url = 'circuits:provider_list'
class ProviderDeleteView(PermissionRequiredMixin, ObjectDeleteView): class ProviderDeleteView(PermissionRequiredMixin, ObjectDeleteView):
@ -61,7 +61,7 @@ class ProviderBulkImportView(PermissionRequiredMixin, BulkImportView):
form = forms.ProviderImportForm form = forms.ProviderImportForm
table = tables.ProviderTable table = tables.ProviderTable
template_name = 'circuits/provider_import.html' template_name = 'circuits/provider_import.html'
obj_list_url = 'circuits:provider_list' default_return_url = 'circuits:provider_list'
class ProviderBulkEditView(PermissionRequiredMixin, BulkEditView): class ProviderBulkEditView(PermissionRequiredMixin, BulkEditView):
@ -70,14 +70,14 @@ class ProviderBulkEditView(PermissionRequiredMixin, BulkEditView):
filter = filters.ProviderFilter filter = filters.ProviderFilter
form = forms.ProviderBulkEditForm form = forms.ProviderBulkEditForm
template_name = 'circuits/provider_bulk_edit.html' template_name = 'circuits/provider_bulk_edit.html'
default_redirect_url = 'circuits:provider_list' default_return_url = 'circuits:provider_list'
class ProviderBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class ProviderBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'circuits.delete_provider' permission_required = 'circuits.delete_provider'
cls = Provider cls = Provider
filter = filters.ProviderFilter filter = filters.ProviderFilter
default_redirect_url = 'circuits:provider_list' default_return_url = 'circuits:provider_list'
# #
@ -103,7 +103,7 @@ class CircuitTypeEditView(PermissionRequiredMixin, ObjectEditView):
class CircuitTypeBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class CircuitTypeBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'circuits.delete_circuittype' permission_required = 'circuits.delete_circuittype'
cls = CircuitType cls = CircuitType
default_redirect_url = 'circuits:circuittype_list' default_return_url = 'circuits:circuittype_list'
# #
@ -138,7 +138,7 @@ class CircuitEditView(PermissionRequiredMixin, ObjectEditView):
form_class = forms.CircuitForm form_class = forms.CircuitForm
fields_initial = ['provider'] fields_initial = ['provider']
template_name = 'circuits/circuit_edit.html' template_name = 'circuits/circuit_edit.html'
obj_list_url = 'circuits:circuit_list' default_return_url = 'circuits:circuit_list'
class CircuitDeleteView(PermissionRequiredMixin, ObjectDeleteView): class CircuitDeleteView(PermissionRequiredMixin, ObjectDeleteView):
@ -152,7 +152,7 @@ class CircuitBulkImportView(PermissionRequiredMixin, BulkImportView):
form = forms.CircuitImportForm form = forms.CircuitImportForm
table = tables.CircuitTable table = tables.CircuitTable
template_name = 'circuits/circuit_import.html' template_name = 'circuits/circuit_import.html'
obj_list_url = 'circuits:circuit_list' default_return_url = 'circuits:circuit_list'
class CircuitBulkEditView(PermissionRequiredMixin, BulkEditView): class CircuitBulkEditView(PermissionRequiredMixin, BulkEditView):
@ -161,14 +161,14 @@ class CircuitBulkEditView(PermissionRequiredMixin, BulkEditView):
filter = filters.CircuitFilter filter = filters.CircuitFilter
form = forms.CircuitBulkEditForm form = forms.CircuitBulkEditForm
template_name = 'circuits/circuit_bulk_edit.html' template_name = 'circuits/circuit_bulk_edit.html'
default_redirect_url = 'circuits:circuit_list' default_return_url = 'circuits:circuit_list'
class CircuitBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class CircuitBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'circuits.delete_circuit' permission_required = 'circuits.delete_circuit'
cls = Circuit cls = Circuit
filter = filters.CircuitFilter filter = filters.CircuitFilter
default_redirect_url = 'circuits:circuit_list' default_return_url = 'circuits:circuit_list'
@permission_required('circuits.change_circuittermination') @permission_required('circuits.change_circuittermination')
@ -212,7 +212,7 @@ def circuit_terminations_swap(request, pk):
'form': form, 'form': form,
'panel_class': 'default', 'panel_class': 'default',
'button_class': 'primary', 'button_class': 'primary',
'cancel_url': circuit.get_absolute_url(), 'return_url': circuit.get_absolute_url(),
}) })

View File

@ -71,7 +71,7 @@ class ComponentCreateView(View):
'parent': parent, 'parent': parent,
'component_type': self.model._meta.verbose_name, 'component_type': self.model._meta.verbose_name,
'form': self.form(initial=request.GET), 'form': self.form(initial=request.GET),
'cancel_url': parent.get_absolute_url(), 'return_url': parent.get_absolute_url(),
}) })
def post(self, request, pk): def post(self, request, pk):
@ -112,7 +112,7 @@ class ComponentCreateView(View):
'parent': parent, 'parent': parent,
'component_type': self.model._meta.verbose_name, 'component_type': self.model._meta.verbose_name,
'form': form, 'form': form,
'cancel_url': parent.get_absolute_url(), 'return_url': parent.get_absolute_url(),
}) })
@ -122,6 +122,12 @@ class ComponentEditView(ObjectEditView):
return obj.device.get_absolute_url() return obj.device.get_absolute_url()
class ComponentDeleteView(ObjectDeleteView):
def get_return_url(self, obj):
return obj.device.get_absolute_url()
# #
# Sites # Sites
# #
@ -163,7 +169,7 @@ class SiteEditView(PermissionRequiredMixin, ObjectEditView):
model = Site model = Site
form_class = forms.SiteForm form_class = forms.SiteForm
template_name = 'dcim/site_edit.html' template_name = 'dcim/site_edit.html'
obj_list_url = 'dcim:site_list' default_return_url = 'dcim:site_list'
class SiteDeleteView(PermissionRequiredMixin, ObjectDeleteView): class SiteDeleteView(PermissionRequiredMixin, ObjectDeleteView):
@ -177,7 +183,7 @@ class SiteBulkImportView(PermissionRequiredMixin, BulkImportView):
form = forms.SiteImportForm form = forms.SiteImportForm
table = tables.SiteTable table = tables.SiteTable
template_name = 'dcim/site_import.html' template_name = 'dcim/site_import.html'
obj_list_url = 'dcim:site_list' default_return_url = 'dcim:site_list'
class SiteBulkEditView(PermissionRequiredMixin, BulkEditView): class SiteBulkEditView(PermissionRequiredMixin, BulkEditView):
@ -186,7 +192,7 @@ class SiteBulkEditView(PermissionRequiredMixin, BulkEditView):
filter = filters.SiteFilter filter = filters.SiteFilter
form = forms.SiteBulkEditForm form = forms.SiteBulkEditForm
template_name = 'dcim/site_bulk_edit.html' template_name = 'dcim/site_bulk_edit.html'
default_redirect_url = 'dcim:site_list' default_return_url = 'dcim:site_list'
# #
@ -215,7 +221,7 @@ class RackGroupBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'dcim.delete_rackgroup' permission_required = 'dcim.delete_rackgroup'
cls = RackGroup cls = RackGroup
filter = filters.RackGroupFilter filter = filters.RackGroupFilter
default_redirect_url = 'dcim:rackgroup_list' default_return_url = 'dcim:rackgroup_list'
# #
@ -241,7 +247,7 @@ class RackRoleEditView(PermissionRequiredMixin, ObjectEditView):
class RackRoleBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class RackRoleBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'dcim.delete_rackrole' permission_required = 'dcim.delete_rackrole'
cls = RackRole cls = RackRole
default_redirect_url = 'dcim:rackrole_list' default_return_url = 'dcim:rackrole_list'
# #
@ -282,7 +288,7 @@ class RackEditView(PermissionRequiredMixin, ObjectEditView):
model = Rack model = Rack
form_class = forms.RackForm form_class = forms.RackForm
template_name = 'dcim/rack_edit.html' template_name = 'dcim/rack_edit.html'
obj_list_url = 'dcim:rack_list' default_return_url = 'dcim:rack_list'
class RackDeleteView(PermissionRequiredMixin, ObjectDeleteView): class RackDeleteView(PermissionRequiredMixin, ObjectDeleteView):
@ -296,7 +302,7 @@ class RackBulkImportView(PermissionRequiredMixin, BulkImportView):
form = forms.RackImportForm form = forms.RackImportForm
table = tables.RackImportTable table = tables.RackImportTable
template_name = 'dcim/rack_import.html' template_name = 'dcim/rack_import.html'
obj_list_url = 'dcim:rack_list' default_return_url = 'dcim:rack_list'
class RackBulkEditView(PermissionRequiredMixin, BulkEditView): class RackBulkEditView(PermissionRequiredMixin, BulkEditView):
@ -305,14 +311,14 @@ class RackBulkEditView(PermissionRequiredMixin, BulkEditView):
filter = filters.RackFilter filter = filters.RackFilter
form = forms.RackBulkEditForm form = forms.RackBulkEditForm
template_name = 'dcim/rack_bulk_edit.html' template_name = 'dcim/rack_bulk_edit.html'
default_redirect_url = 'dcim:rack_list' default_return_url = 'dcim:rack_list'
class RackBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class RackBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'dcim.delete_rack' permission_required = 'dcim.delete_rack'
cls = Rack cls = Rack
filter = filters.RackFilter filter = filters.RackFilter
default_redirect_url = 'dcim:rack_list' default_return_url = 'dcim:rack_list'
# #
@ -338,7 +344,7 @@ class ManufacturerEditView(PermissionRequiredMixin, ObjectEditView):
class ManufacturerBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class ManufacturerBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'dcim.delete_manufacturer' permission_required = 'dcim.delete_manufacturer'
cls = Manufacturer cls = Manufacturer
default_redirect_url = 'dcim:manufacturer_list' default_return_url = 'dcim:manufacturer_list'
# #
@ -408,7 +414,7 @@ class DeviceTypeEditView(PermissionRequiredMixin, ObjectEditView):
model = DeviceType model = DeviceType
form_class = forms.DeviceTypeForm form_class = forms.DeviceTypeForm
template_name = 'dcim/devicetype_edit.html' template_name = 'dcim/devicetype_edit.html'
obj_list_url = 'dcim:devicetype_list' default_return_url = 'dcim:devicetype_list'
class DeviceTypeDeleteView(PermissionRequiredMixin, ObjectDeleteView): class DeviceTypeDeleteView(PermissionRequiredMixin, ObjectDeleteView):
@ -423,14 +429,14 @@ class DeviceTypeBulkEditView(PermissionRequiredMixin, BulkEditView):
filter = filters.DeviceTypeFilter filter = filters.DeviceTypeFilter
form = forms.DeviceTypeBulkEditForm form = forms.DeviceTypeBulkEditForm
template_name = 'dcim/devicetype_bulk_edit.html' template_name = 'dcim/devicetype_bulk_edit.html'
default_redirect_url = 'dcim:devicetype_list' default_return_url = 'dcim:devicetype_list'
class DeviceTypeBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class DeviceTypeBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'dcim.delete_devicetype' permission_required = 'dcim.delete_devicetype'
cls = DeviceType cls = DeviceType
filter = filters.DeviceTypeFilter filter = filters.DeviceTypeFilter
default_redirect_url = 'dcim:devicetype_list' default_return_url = 'dcim:devicetype_list'
# #
@ -560,7 +566,7 @@ class DeviceRoleEditView(PermissionRequiredMixin, ObjectEditView):
class DeviceRoleBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class DeviceRoleBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'dcim.delete_devicerole' permission_required = 'dcim.delete_devicerole'
cls = DeviceRole cls = DeviceRole
default_redirect_url = 'dcim:devicerole_list' default_return_url = 'dcim:devicerole_list'
# #
@ -586,7 +592,7 @@ class PlatformEditView(PermissionRequiredMixin, ObjectEditView):
class PlatformBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class PlatformBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'dcim.delete_platform' permission_required = 'dcim.delete_platform'
cls = Platform cls = Platform
default_redirect_url = 'dcim:platform_list' default_return_url = 'dcim:platform_list'
# #
@ -678,7 +684,7 @@ class DeviceEditView(PermissionRequiredMixin, ObjectEditView):
form_class = forms.DeviceForm form_class = forms.DeviceForm
fields_initial = ['site', 'rack', 'position', 'face', 'device_bay'] fields_initial = ['site', 'rack', 'position', 'face', 'device_bay']
template_name = 'dcim/device_edit.html' template_name = 'dcim/device_edit.html'
obj_list_url = 'dcim:device_list' default_return_url = 'dcim:device_list'
class DeviceDeleteView(PermissionRequiredMixin, ObjectDeleteView): class DeviceDeleteView(PermissionRequiredMixin, ObjectDeleteView):
@ -692,7 +698,7 @@ class DeviceBulkImportView(PermissionRequiredMixin, BulkImportView):
form = forms.DeviceImportForm form = forms.DeviceImportForm
table = tables.DeviceImportTable table = tables.DeviceImportTable
template_name = 'dcim/device_import.html' template_name = 'dcim/device_import.html'
obj_list_url = 'dcim:device_list' default_return_url = 'dcim:device_list'
class ChildDeviceBulkImportView(PermissionRequiredMixin, BulkImportView): class ChildDeviceBulkImportView(PermissionRequiredMixin, BulkImportView):
@ -700,7 +706,7 @@ class ChildDeviceBulkImportView(PermissionRequiredMixin, BulkImportView):
form = forms.ChildDeviceImportForm form = forms.ChildDeviceImportForm
table = tables.DeviceImportTable table = tables.DeviceImportTable
template_name = 'dcim/device_import_child.html' template_name = 'dcim/device_import_child.html'
obj_list_url = 'dcim:device_list' default_return_url = 'dcim:device_list'
def save_obj(self, obj): def save_obj(self, obj):
# Inherent rack from parent device # Inherent rack from parent device
@ -718,14 +724,14 @@ class DeviceBulkEditView(PermissionRequiredMixin, BulkEditView):
filter = filters.DeviceFilter filter = filters.DeviceFilter
form = forms.DeviceBulkEditForm form = forms.DeviceBulkEditForm
template_name = 'dcim/device_bulk_edit.html' template_name = 'dcim/device_bulk_edit.html'
default_redirect_url = 'dcim:device_list' default_return_url = 'dcim:device_list'
class DeviceBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class DeviceBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'dcim.delete_device' permission_required = 'dcim.delete_device'
cls = Device cls = Device
filter = filters.DeviceFilter filter = filters.DeviceFilter
default_redirect_url = 'dcim:device_list' default_return_url = 'dcim:device_list'
def device_inventory(request, pk): def device_inventory(request, pk):
@ -790,7 +796,7 @@ def consoleport_connect(request, pk):
return render(request, 'dcim/consoleport_connect.html', { return render(request, 'dcim/consoleport_connect.html', {
'consoleport': consoleport, 'consoleport': consoleport,
'form': form, 'form': form,
'cancel_url': reverse('dcim:device', kwargs={'pk': consoleport.device.pk}), 'return_url': reverse('dcim:device', kwargs={'pk': consoleport.device.pk}),
}) })
@ -819,7 +825,7 @@ def consoleport_disconnect(request, pk):
return render(request, 'dcim/consoleport_disconnect.html', { return render(request, 'dcim/consoleport_disconnect.html', {
'consoleport': consoleport, 'consoleport': consoleport,
'form': form, 'form': form,
'cancel_url': reverse('dcim:device', kwargs={'pk': consoleport.device.pk}), 'return_url': reverse('dcim:device', kwargs={'pk': consoleport.device.pk}),
}) })
@ -829,7 +835,7 @@ class ConsolePortEditView(PermissionRequiredMixin, ComponentEditView):
form_class = forms.ConsolePortForm form_class = forms.ConsolePortForm
class ConsolePortDeleteView(PermissionRequiredMixin, ObjectDeleteView): class ConsolePortDeleteView(PermissionRequiredMixin, ComponentDeleteView):
permission_required = 'dcim.delete_consoleport' permission_required = 'dcim.delete_consoleport'
model = ConsolePort model = ConsolePort
@ -886,7 +892,7 @@ def consoleserverport_connect(request, pk):
return render(request, 'dcim/consoleserverport_connect.html', { return render(request, 'dcim/consoleserverport_connect.html', {
'consoleserverport': consoleserverport, 'consoleserverport': consoleserverport,
'form': form, 'form': form,
'cancel_url': reverse('dcim:device', kwargs={'pk': consoleserverport.device.pk}), 'return_url': reverse('dcim:device', kwargs={'pk': consoleserverport.device.pk}),
}) })
@ -916,7 +922,7 @@ def consoleserverport_disconnect(request, pk):
return render(request, 'dcim/consoleserverport_disconnect.html', { return render(request, 'dcim/consoleserverport_disconnect.html', {
'consoleserverport': consoleserverport, 'consoleserverport': consoleserverport,
'form': form, 'form': form,
'cancel_url': reverse('dcim:device', kwargs={'pk': consoleserverport.device.pk}), 'return_url': reverse('dcim:device', kwargs={'pk': consoleserverport.device.pk}),
}) })
@ -926,7 +932,7 @@ class ConsoleServerPortEditView(PermissionRequiredMixin, ComponentEditView):
form_class = forms.ConsoleServerPortForm form_class = forms.ConsoleServerPortForm
class ConsoleServerPortDeleteView(PermissionRequiredMixin, ObjectDeleteView): class ConsoleServerPortDeleteView(PermissionRequiredMixin, ComponentDeleteView):
permission_required = 'dcim.delete_consoleserverport' permission_required = 'dcim.delete_consoleserverport'
model = ConsoleServerPort model = ConsoleServerPort
@ -976,7 +982,7 @@ def powerport_connect(request, pk):
return render(request, 'dcim/powerport_connect.html', { return render(request, 'dcim/powerport_connect.html', {
'powerport': powerport, 'powerport': powerport,
'form': form, 'form': form,
'cancel_url': reverse('dcim:device', kwargs={'pk': powerport.device.pk}), 'return_url': reverse('dcim:device', kwargs={'pk': powerport.device.pk}),
}) })
@ -1005,7 +1011,7 @@ def powerport_disconnect(request, pk):
return render(request, 'dcim/powerport_disconnect.html', { return render(request, 'dcim/powerport_disconnect.html', {
'powerport': powerport, 'powerport': powerport,
'form': form, 'form': form,
'cancel_url': reverse('dcim:device', kwargs={'pk': powerport.device.pk}), 'return_url': reverse('dcim:device', kwargs={'pk': powerport.device.pk}),
}) })
@ -1015,7 +1021,7 @@ class PowerPortEditView(PermissionRequiredMixin, ComponentEditView):
form_class = forms.PowerPortForm form_class = forms.PowerPortForm
class PowerPortDeleteView(PermissionRequiredMixin, ObjectDeleteView): class PowerPortDeleteView(PermissionRequiredMixin, ComponentDeleteView):
permission_required = 'dcim.delete_powerport' permission_required = 'dcim.delete_powerport'
model = PowerPort model = PowerPort
@ -1072,7 +1078,7 @@ def poweroutlet_connect(request, pk):
return render(request, 'dcim/poweroutlet_connect.html', { return render(request, 'dcim/poweroutlet_connect.html', {
'poweroutlet': poweroutlet, 'poweroutlet': poweroutlet,
'form': form, 'form': form,
'cancel_url': reverse('dcim:device', kwargs={'pk': poweroutlet.device.pk}), 'return_url': reverse('dcim:device', kwargs={'pk': poweroutlet.device.pk}),
}) })
@ -1101,7 +1107,7 @@ def poweroutlet_disconnect(request, pk):
return render(request, 'dcim/poweroutlet_disconnect.html', { return render(request, 'dcim/poweroutlet_disconnect.html', {
'poweroutlet': poweroutlet, 'poweroutlet': poweroutlet,
'form': form, 'form': form,
'cancel_url': reverse('dcim:device', kwargs={'pk': poweroutlet.device.pk}), 'return_url': reverse('dcim:device', kwargs={'pk': poweroutlet.device.pk}),
}) })
@ -1111,7 +1117,7 @@ class PowerOutletEditView(PermissionRequiredMixin, ComponentEditView):
form_class = forms.PowerOutletForm form_class = forms.PowerOutletForm
class PowerOutletDeleteView(PermissionRequiredMixin, ObjectDeleteView): class PowerOutletDeleteView(PermissionRequiredMixin, ComponentDeleteView):
permission_required = 'dcim.delete_poweroutlet' permission_required = 'dcim.delete_poweroutlet'
model = PowerOutlet model = PowerOutlet
@ -1141,7 +1147,7 @@ class InterfaceEditView(PermissionRequiredMixin, ComponentEditView):
form_class = forms.InterfaceForm form_class = forms.InterfaceForm
class InterfaceDeleteView(PermissionRequiredMixin, ObjectDeleteView): class InterfaceDeleteView(PermissionRequiredMixin, ComponentDeleteView):
permission_required = 'dcim.delete_interface' permission_required = 'dcim.delete_interface'
model = Interface model = Interface
@ -1179,7 +1185,7 @@ class DeviceBayEditView(PermissionRequiredMixin, ComponentEditView):
form_class = forms.DeviceBayForm form_class = forms.DeviceBayForm
class DeviceBayDeleteView(PermissionRequiredMixin, ObjectDeleteView): class DeviceBayDeleteView(PermissionRequiredMixin, ComponentDeleteView):
permission_required = 'dcim.delete_devicebay' permission_required = 'dcim.delete_devicebay'
model = DeviceBay model = DeviceBay
@ -1206,7 +1212,7 @@ def devicebay_populate(request, pk):
return render(request, 'dcim/devicebay_populate.html', { return render(request, 'dcim/devicebay_populate.html', {
'device_bay': device_bay, 'device_bay': device_bay,
'form': form, 'form': form,
'cancel_url': reverse('dcim:device', kwargs={'pk': device_bay.device.pk}), 'return_url': reverse('dcim:device', kwargs={'pk': device_bay.device.pk}),
}) })
@ -1230,7 +1236,7 @@ def devicebay_depopulate(request, pk):
return render(request, 'dcim/devicebay_depopulate.html', { return render(request, 'dcim/devicebay_depopulate.html', {
'device_bay': device_bay, 'device_bay': device_bay,
'form': form, 'form': form,
'cancel_url': reverse('dcim:device', kwargs={'pk': device_bay.device.pk}), 'return_url': reverse('dcim:device', kwargs={'pk': device_bay.device.pk}),
}) })
@ -1305,7 +1311,7 @@ class DeviceBulkAddComponentView(View):
'form': form, 'form': form,
'component_name': self.model._meta.verbose_name_plural, 'component_name': self.model._meta.verbose_name_plural,
'selected_devices': selected_devices, 'selected_devices': selected_devices,
'cancel_url': reverse('dcim:device_list'), 'return_url': reverse('dcim:device_list'),
}) })
@ -1387,7 +1393,7 @@ def interfaceconnection_add(request, pk):
return render(request, 'dcim/interfaceconnection_edit.html', { return render(request, 'dcim/interfaceconnection_edit.html', {
'device': device, 'device': device,
'form': form, 'form': form,
'cancel_url': reverse('dcim:device', kwargs={'pk': device.pk}), 'return_url': reverse('dcim:device', kwargs={'pk': device.pk}),
}) })
@ -1419,15 +1425,15 @@ def interfaceconnection_delete(request, pk):
# Determine where to direct user upon cancellation # Determine where to direct user upon cancellation
if device_id: if device_id:
cancel_url = reverse('dcim:device', kwargs={'pk': device_id}) return_url = reverse('dcim:device', kwargs={'pk': device_id})
else: else:
cancel_url = reverse('dcim:device_list') return_url = reverse('dcim:device_list')
return render(request, 'dcim/interfaceconnection_delete.html', { return render(request, 'dcim/interfaceconnection_delete.html', {
'interfaceconnection': interfaceconnection, 'interfaceconnection': interfaceconnection,
'device_id': device_id, 'device_id': device_id,
'form': form, 'form': form,
'cancel_url': cancel_url, 'return_url': return_url,
}) })
@ -1506,7 +1512,7 @@ def ipaddress_assign(request, pk):
return render(request, 'dcim/ipaddress_assign.html', { return render(request, 'dcim/ipaddress_assign.html', {
'device': device, 'device': device,
'form': form, 'form': form,
'cancel_url': reverse('dcim:device', kwargs={'pk': device.pk}), 'return_url': reverse('dcim:device', kwargs={'pk': device.pk}),
}) })
@ -1525,6 +1531,6 @@ class ModuleEditView(PermissionRequiredMixin, ComponentEditView):
return obj return obj
class ModuleDeleteView(PermissionRequiredMixin, ObjectDeleteView): class ModuleDeleteView(PermissionRequiredMixin, ComponentDeleteView):
permission_required = 'dcim.delete_module' permission_required = 'dcim.delete_module'
model = Module model = Module

View File

@ -118,7 +118,7 @@ class VRFEditView(PermissionRequiredMixin, ObjectEditView):
model = VRF model = VRF
form_class = forms.VRFForm form_class = forms.VRFForm
template_name = 'ipam/vrf_edit.html' template_name = 'ipam/vrf_edit.html'
obj_list_url = 'ipam:vrf_list' default_return_url = 'ipam:vrf_list'
class VRFDeleteView(PermissionRequiredMixin, ObjectDeleteView): class VRFDeleteView(PermissionRequiredMixin, ObjectDeleteView):
@ -132,7 +132,7 @@ class VRFBulkImportView(PermissionRequiredMixin, BulkImportView):
form = forms.VRFImportForm form = forms.VRFImportForm
table = tables.VRFTable table = tables.VRFTable
template_name = 'ipam/vrf_import.html' template_name = 'ipam/vrf_import.html'
obj_list_url = 'ipam:vrf_list' default_return_url = 'ipam:vrf_list'
class VRFBulkEditView(PermissionRequiredMixin, BulkEditView): class VRFBulkEditView(PermissionRequiredMixin, BulkEditView):
@ -141,14 +141,14 @@ class VRFBulkEditView(PermissionRequiredMixin, BulkEditView):
filter = filters.VRFFilter filter = filters.VRFFilter
form = forms.VRFBulkEditForm form = forms.VRFBulkEditForm
template_name = 'ipam/vrf_bulk_edit.html' template_name = 'ipam/vrf_bulk_edit.html'
default_redirect_url = 'ipam:vrf_list' default_return_url = 'ipam:vrf_list'
class VRFBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class VRFBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'ipam.delete_vrf' permission_required = 'ipam.delete_vrf'
cls = VRF cls = VRF
filter = filters.VRFFilter filter = filters.VRFFilter
default_redirect_url = 'ipam:vrf_list' default_return_url = 'ipam:vrf_list'
# #
@ -253,7 +253,7 @@ class RIRBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'ipam.delete_rir' permission_required = 'ipam.delete_rir'
cls = RIR cls = RIR
filter = filters.RIRFilter filter = filters.RIRFilter
default_redirect_url = 'ipam:rir_list' default_return_url = 'ipam:rir_list'
# #
@ -311,7 +311,7 @@ class AggregateEditView(PermissionRequiredMixin, ObjectEditView):
model = Aggregate model = Aggregate
form_class = forms.AggregateForm form_class = forms.AggregateForm
template_name = 'ipam/aggregate_edit.html' template_name = 'ipam/aggregate_edit.html'
obj_list_url = 'ipam:aggregate_list' default_return_url = 'ipam:aggregate_list'
class AggregateDeleteView(PermissionRequiredMixin, ObjectDeleteView): class AggregateDeleteView(PermissionRequiredMixin, ObjectDeleteView):
@ -325,7 +325,7 @@ class AggregateBulkImportView(PermissionRequiredMixin, BulkImportView):
form = forms.AggregateImportForm form = forms.AggregateImportForm
table = tables.AggregateTable table = tables.AggregateTable
template_name = 'ipam/aggregate_import.html' template_name = 'ipam/aggregate_import.html'
obj_list_url = 'ipam:aggregate_list' default_return_url = 'ipam:aggregate_list'
class AggregateBulkEditView(PermissionRequiredMixin, BulkEditView): class AggregateBulkEditView(PermissionRequiredMixin, BulkEditView):
@ -334,14 +334,14 @@ class AggregateBulkEditView(PermissionRequiredMixin, BulkEditView):
filter = filters.AggregateFilter filter = filters.AggregateFilter
form = forms.AggregateBulkEditForm form = forms.AggregateBulkEditForm
template_name = 'ipam/aggregate_bulk_edit.html' template_name = 'ipam/aggregate_bulk_edit.html'
default_redirect_url = 'ipam:aggregate_list' default_return_url = 'ipam:aggregate_list'
class AggregateBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class AggregateBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'ipam.delete_aggregate' permission_required = 'ipam.delete_aggregate'
cls = Aggregate cls = Aggregate
filter = filters.AggregateFilter filter = filters.AggregateFilter
default_redirect_url = 'ipam:aggregate_list' default_return_url = 'ipam:aggregate_list'
# #
@ -367,7 +367,7 @@ class RoleEditView(PermissionRequiredMixin, ObjectEditView):
class RoleBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class RoleBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'ipam.delete_role' permission_required = 'ipam.delete_role'
cls = Role cls = Role
default_redirect_url = 'ipam:role_list' default_return_url = 'ipam:role_list'
# #
@ -444,14 +444,14 @@ class PrefixEditView(PermissionRequiredMixin, ObjectEditView):
form_class = forms.PrefixForm form_class = forms.PrefixForm
template_name = 'ipam/prefix_edit.html' template_name = 'ipam/prefix_edit.html'
fields_initial = ['vrf', 'tenant', 'site', 'prefix', 'vlan'] fields_initial = ['vrf', 'tenant', 'site', 'prefix', 'vlan']
obj_list_url = 'ipam:prefix_list' default_return_url = 'ipam:prefix_list'
class PrefixDeleteView(PermissionRequiredMixin, ObjectDeleteView): class PrefixDeleteView(PermissionRequiredMixin, ObjectDeleteView):
permission_required = 'ipam.delete_prefix' permission_required = 'ipam.delete_prefix'
model = Prefix model = Prefix
default_return_url = 'ipam:prefix_list'
template_name = 'ipam/prefix_delete.html' template_name = 'ipam/prefix_delete.html'
default_return_url = 'ipam:prefix_list'
class PrefixBulkImportView(PermissionRequiredMixin, BulkImportView): class PrefixBulkImportView(PermissionRequiredMixin, BulkImportView):
@ -459,7 +459,7 @@ class PrefixBulkImportView(PermissionRequiredMixin, BulkImportView):
form = forms.PrefixImportForm form = forms.PrefixImportForm
table = tables.PrefixTable table = tables.PrefixTable
template_name = 'ipam/prefix_import.html' template_name = 'ipam/prefix_import.html'
obj_list_url = 'ipam:prefix_list' default_return_url = 'ipam:prefix_list'
class PrefixBulkEditView(PermissionRequiredMixin, BulkEditView): class PrefixBulkEditView(PermissionRequiredMixin, BulkEditView):
@ -468,14 +468,14 @@ class PrefixBulkEditView(PermissionRequiredMixin, BulkEditView):
filter = filters.PrefixFilter filter = filters.PrefixFilter
form = forms.PrefixBulkEditForm form = forms.PrefixBulkEditForm
template_name = 'ipam/prefix_bulk_edit.html' template_name = 'ipam/prefix_bulk_edit.html'
default_redirect_url = 'ipam:prefix_list' default_return_url = 'ipam:prefix_list'
class PrefixBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class PrefixBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'ipam.delete_prefix' permission_required = 'ipam.delete_prefix'
cls = Prefix cls = Prefix
filter = filters.PrefixFilter filter = filters.PrefixFilter
default_redirect_url = 'ipam:prefix_list' default_return_url = 'ipam:prefix_list'
def prefix_ipaddresses(request, pk): def prefix_ipaddresses(request, pk):
@ -569,7 +569,7 @@ def ipaddress_assign(request, pk):
return render(request, 'ipam/ipaddress_assign.html', { return render(request, 'ipam/ipaddress_assign.html', {
'ipaddress': ipaddress, 'ipaddress': ipaddress,
'form': form, 'form': form,
'cancel_url': reverse('ipam:ipaddress', kwargs={'pk': ipaddress.pk}), 'return_url': reverse('ipam:ipaddress', kwargs={'pk': ipaddress.pk}),
}) })
@ -602,7 +602,7 @@ def ipaddress_remove(request, pk):
return render(request, 'ipam/ipaddress_unassign.html', { return render(request, 'ipam/ipaddress_unassign.html', {
'ipaddress': ipaddress, 'ipaddress': ipaddress,
'form': form, 'form': form,
'cancel_url': reverse('ipam:ipaddress', kwargs={'pk': ipaddress.pk}), 'return_url': reverse('ipam:ipaddress', kwargs={'pk': ipaddress.pk}),
}) })
@ -612,7 +612,7 @@ class IPAddressEditView(PermissionRequiredMixin, ObjectEditView):
form_class = forms.IPAddressForm form_class = forms.IPAddressForm
fields_initial = ['address', 'vrf'] fields_initial = ['address', 'vrf']
template_name = 'ipam/ipaddress_edit.html' template_name = 'ipam/ipaddress_edit.html'
obj_list_url = 'ipam:ipaddress_list' default_return_url = 'ipam:ipaddress_list'
class IPAddressDeleteView(PermissionRequiredMixin, ObjectDeleteView): class IPAddressDeleteView(PermissionRequiredMixin, ObjectDeleteView):
@ -626,7 +626,7 @@ class IPAddressBulkAddView(PermissionRequiredMixin, BulkAddView):
form = forms.IPAddressBulkAddForm form = forms.IPAddressBulkAddForm
model = IPAddress model = IPAddress
template_name = 'ipam/ipaddress_bulk_add.html' template_name = 'ipam/ipaddress_bulk_add.html'
redirect_url = 'ipam:ipaddress_list' default_return_url = 'ipam:ipaddress_list'
class IPAddressBulkImportView(PermissionRequiredMixin, BulkImportView): class IPAddressBulkImportView(PermissionRequiredMixin, BulkImportView):
@ -634,7 +634,7 @@ class IPAddressBulkImportView(PermissionRequiredMixin, BulkImportView):
form = forms.IPAddressImportForm form = forms.IPAddressImportForm
table = tables.IPAddressTable table = tables.IPAddressTable
template_name = 'ipam/ipaddress_import.html' template_name = 'ipam/ipaddress_import.html'
obj_list_url = 'ipam:ipaddress_list' default_return_url = 'ipam:ipaddress_list'
def save_obj(self, obj): def save_obj(self, obj):
obj.save() obj.save()
@ -658,14 +658,14 @@ class IPAddressBulkEditView(PermissionRequiredMixin, BulkEditView):
filter = filters.IPAddressFilter filter = filters.IPAddressFilter
form = forms.IPAddressBulkEditForm form = forms.IPAddressBulkEditForm
template_name = 'ipam/ipaddress_bulk_edit.html' template_name = 'ipam/ipaddress_bulk_edit.html'
default_redirect_url = 'ipam:ipaddress_list' default_return_url = 'ipam:ipaddress_list'
class IPAddressBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class IPAddressBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'ipam.delete_ipaddress' permission_required = 'ipam.delete_ipaddress'
cls = IPAddress cls = IPAddress
filter = filters.IPAddressFilter filter = filters.IPAddressFilter
default_redirect_url = 'ipam:ipaddress_list' default_return_url = 'ipam:ipaddress_list'
# #
@ -694,7 +694,7 @@ class VLANGroupBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'ipam.delete_vlangroup' permission_required = 'ipam.delete_vlangroup'
cls = VLANGroup cls = VLANGroup
filter = filters.VLANGroupFilter filter = filters.VLANGroupFilter
default_redirect_url = 'ipam:vlangroup_list' default_return_url = 'ipam:vlangroup_list'
# #
@ -727,7 +727,7 @@ class VLANEditView(PermissionRequiredMixin, ObjectEditView):
model = VLAN model = VLAN
form_class = forms.VLANForm form_class = forms.VLANForm
template_name = 'ipam/vlan_edit.html' template_name = 'ipam/vlan_edit.html'
obj_list_url = 'ipam:vlan_list' default_return_url = 'ipam:vlan_list'
class VLANDeleteView(PermissionRequiredMixin, ObjectDeleteView): class VLANDeleteView(PermissionRequiredMixin, ObjectDeleteView):
@ -741,7 +741,7 @@ class VLANBulkImportView(PermissionRequiredMixin, BulkImportView):
form = forms.VLANImportForm form = forms.VLANImportForm
table = tables.VLANTable table = tables.VLANTable
template_name = 'ipam/vlan_import.html' template_name = 'ipam/vlan_import.html'
obj_list_url = 'ipam:vlan_list' default_return_url = 'ipam:vlan_list'
class VLANBulkEditView(PermissionRequiredMixin, BulkEditView): class VLANBulkEditView(PermissionRequiredMixin, BulkEditView):
@ -750,14 +750,14 @@ class VLANBulkEditView(PermissionRequiredMixin, BulkEditView):
filter = filters.VLANFilter filter = filters.VLANFilter
form = forms.VLANBulkEditForm form = forms.VLANBulkEditForm
template_name = 'ipam/vlan_bulk_edit.html' template_name = 'ipam/vlan_bulk_edit.html'
default_redirect_url = 'ipam:vlan_list' default_return_url = 'ipam:vlan_list'
class VLANBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class VLANBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'ipam.delete_vlan' permission_required = 'ipam.delete_vlan'
cls = VLAN cls = VLAN
filter = filters.VLANFilter filter = filters.VLANFilter
default_redirect_url = 'ipam:vlan_list' default_return_url = 'ipam:vlan_list'
# #

View File

@ -38,7 +38,7 @@ class SecretRoleEditView(PermissionRequiredMixin, ObjectEditView):
class SecretRoleBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class SecretRoleBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'secrets.delete_secretrole' permission_required = 'secrets.delete_secretrole'
cls = SecretRole cls = SecretRole
default_redirect_url = 'secrets:secretrole_list' default_return_url = 'secrets:secretrole_list'
# #
@ -103,7 +103,7 @@ def secret_add(request, pk):
return render(request, 'secrets/secret_edit.html', { return render(request, 'secrets/secret_edit.html', {
'secret': secret, 'secret': secret,
'form': form, 'form': form,
'cancel_url': device.get_absolute_url(), 'return_url': device.get_absolute_url(),
}) })
@ -145,7 +145,7 @@ def secret_edit(request, pk):
return render(request, 'secrets/secret_edit.html', { return render(request, 'secrets/secret_edit.html', {
'secret': secret, 'secret': secret,
'form': form, 'form': form,
'cancel_url': reverse('secrets:secret', kwargs={'pk': secret.pk}), 'return_url': reverse('secrets:secret', kwargs={'pk': secret.pk}),
}) })
@ -195,7 +195,7 @@ def secret_import(request):
return render(request, 'secrets/secret_import.html', { return render(request, 'secrets/secret_import.html', {
'form': form, 'form': form,
'cancel_url': reverse('secrets:secret_list'), 'return_url': reverse('secrets:secret_list'),
}) })
@ -205,11 +205,11 @@ class SecretBulkEditView(PermissionRequiredMixin, BulkEditView):
filter = filters.SecretFilter filter = filters.SecretFilter
form = forms.SecretBulkEditForm form = forms.SecretBulkEditForm
template_name = 'secrets/secret_bulk_edit.html' template_name = 'secrets/secret_bulk_edit.html'
default_redirect_url = 'secrets:secret_list' default_return_url = 'secrets:secret_list'
class SecretBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class SecretBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'secrets.delete_secret' permission_required = 'secrets.delete_secret'
cls = Secret cls = Secret
filter = filters.SecretFilter filter = filters.SecretFilter
default_redirect_url = 'secrets:secret_list' default_return_url = 'secrets:secret_list'

View File

@ -13,7 +13,7 @@
{% render_form form %} {% render_form form %}
<div class="form-group"> <div class="form-group">
<button type="submit" class="btn btn-primary">Submit</button> <button type="submit" class="btn btn-primary">Submit</button>
<a href="{% url obj_list_url %}" class="btn btn-default">Cancel</a> <a href="{% url return_url %}" class="btn btn-default">Cancel</a>
</div> </div>
</form> </form>
</div> </div>

View File

@ -83,7 +83,7 @@
{% else %} {% else %}
<button type="submit" name="_create" class="btn btn-primary">Create</button> <button type="submit" name="_create" class="btn btn-primary">Create</button>
{% endif %} {% endif %}
<a href="{{ cancel_url }}" class="btn btn-default">Cancel</a> <a href="{{ return_url }}" class="btn btn-default">Cancel</a>
</div> </div>
</div> </div>
</form> </form>

View File

@ -13,7 +13,7 @@
{% render_form form %} {% render_form form %}
<div class="form-group"> <div class="form-group">
<button type="submit" class="btn btn-primary">Submit</button> <button type="submit" class="btn btn-primary">Submit</button>
<a href="{% url obj_list_url %}" class="btn btn-default">Cancel</a> <a href="{% url return_url %}" class="btn btn-default">Cancel</a>
</div> </div>
</form> </form>
</div> </div>

View File

@ -40,7 +40,7 @@
<div class="form-group"> <div class="form-group">
<div class="col-md-9 col-md-offset-3"> <div class="col-md-9 col-md-offset-3">
<button type="submit" name="_update" class="btn btn-primary">Connect</button> <button type="submit" name="_update" class="btn btn-primary">Connect</button>
<a href="{{ cancel_url }}" class="btn btn-default">Cancel</a> <a href="{{ return_url }}" class="btn btn-default">Cancel</a>
</div> </div>
</div> </div>
</div> </div>

View File

@ -40,7 +40,7 @@
<div class="form-group"> <div class="form-group">
<div class="col-md-9 col-md-offset-3"> <div class="col-md-9 col-md-offset-3">
<button type="submit" name="_update" class="btn btn-primary">Connect</button> <button type="submit" name="_update" class="btn btn-primary">Connect</button>
<a href="{{ cancel_url }}" class="btn btn-default">Cancel</a> <a href="{{ return_url }}" class="btn btn-default">Cancel</a>
</div> </div>
</div> </div>
</div> </div>

View File

@ -5,8 +5,8 @@
<h1>Add {{ component_name|title }}</h1> <h1>Add {{ component_name|title }}</h1>
<form action="." method="post" class="form form-horizontal"> <form action="." method="post" class="form form-horizontal">
{% csrf_token %} {% csrf_token %}
{% if request.POST.redirect_url %} {% if request.POST.return_url %}
<input type="hidden" name="redirect_url" value="{{ request.POST.redirect_url }}" /> <input type="hidden" name="return_url" value="{{ request.POST.return_url }}" />
{% endif %} {% endif %}
{% for field in form.hidden_fields %} {% for field in form.hidden_fields %}
{{ field }} {{ field }}
@ -51,7 +51,7 @@
<div class="form-group text-right"> <div class="form-group text-right">
<div class="col-md-12"> <div class="col-md-12">
<button type="submit" name="_create" class="btn btn-primary">Create</button> <button type="submit" name="_create" class="btn btn-primary">Create</button>
<a href="{{ cancel_url }}" class="btn btn-default">Cancel</a> <a href="{{ return_url }}" class="btn btn-default">Cancel</a>
</div> </div>
</div> </div>
</div> </div>

View File

@ -34,7 +34,7 @@
<div class="col-md-9 col-md-offset-3"> <div class="col-md-9 col-md-offset-3">
<button type="submit" name="_create" class="btn btn-primary">Create</button> <button type="submit" name="_create" class="btn btn-primary">Create</button>
<button type="submit" name="_addanother" class="btn btn-primary">Create and Add More</button> <button type="submit" name="_addanother" class="btn btn-primary">Create and Add More</button>
<a href="{{ cancel_url }}" class="btn btn-default">Cancel</a> <a href="{{ return_url }}" class="btn btn-default">Cancel</a>
</div> </div>
</div> </div>
</div> </div>

View File

@ -13,7 +13,7 @@
{% render_form form %} {% render_form form %}
<div class="form-group"> <div class="form-group">
<button type="submit" class="btn btn-primary">Submit</button> <button type="submit" class="btn btn-primary">Submit</button>
<a href="{% url obj_list_url %}" class="btn btn-default">Cancel</a> <a href="{% url return_url %}" class="btn btn-default">Cancel</a>
</div> </div>
</form> </form>
<h4>CSV Format</h4> <h4>CSV Format</h4>

View File

@ -13,7 +13,7 @@
{% render_form form %} {% render_form form %}
<div class="form-group"> <div class="form-group">
<button type="submit" class="btn btn-primary">Submit</button> <button type="submit" class="btn btn-primary">Submit</button>
<a href="{% url obj_list_url %}" class="btn btn-default">Cancel</a> <a href="{% url return_url %}" class="btn btn-default">Cancel</a>
</div> </div>
</form> </form>
<h4>CSV Format</h4> <h4>CSV Format</h4>

View File

@ -37,7 +37,7 @@
<div class="form-group"> <div class="form-group">
<div class="col-md-9 col-md-offset-3"> <div class="col-md-9 col-md-offset-3">
<button type="submit" name="_update" class="btn btn-primary">Save</button> <button type="submit" name="_update" class="btn btn-primary">Save</button>
<a href="{{ cancel_url }}" class="btn btn-default">Cancel</a> <a href="{{ return_url }}" class="btn btn-default">Cancel</a>
</div> </div>
</div> </div>
</div> </div>

View File

@ -33,7 +33,7 @@
<div class="form-group"> <div class="form-group">
<div class="col-md-9 col-md-offset-3"> <div class="col-md-9 col-md-offset-3">
<button type="submit" name="_update" class="btn btn-primary">Save</button> <button type="submit" name="_update" class="btn btn-primary">Save</button>
<a href="{{ cancel_url }}" class="btn btn-default">Cancel</a> <a href="{{ return_url }}" class="btn btn-default">Cancel</a>
</div> </div>
</div> </div>
</div> </div>

View File

@ -50,7 +50,7 @@
<i class="glyphicon glyphicon-trash" aria-hidden="true"></i> <i class="glyphicon glyphicon-trash" aria-hidden="true"></i>
</button> </button>
{% else %} {% else %}
<a href="{% url 'dcim:consoleport_delete' pk=cp.pk %}?return_url={{ device.get_absolute_url }}" class="btn btn-danger btn-xs"> <a href="{% url 'dcim:consoleport_delete' pk=cp.pk %}" class="btn btn-danger btn-xs">
<i class="glyphicon glyphicon-trash" aria-hidden="true" title="Delete port"></i> <i class="glyphicon glyphicon-trash" aria-hidden="true" title="Delete port"></i>
</a> </a>
{% endif %} {% endif %}

View File

@ -49,7 +49,7 @@
<i class="glyphicon glyphicon-trash" aria-hidden="true"></i> <i class="glyphicon glyphicon-trash" aria-hidden="true"></i>
</button> </button>
{% else %} {% else %}
<a href="{% url 'dcim:consoleserverport_delete' pk=csp.pk %}?return_url={{ device.get_absolute_url }}" class="btn btn-danger btn-xs"> <a href="{% url 'dcim:consoleserverport_delete' pk=csp.pk %}" class="btn btn-danger btn-xs">
<i class="glyphicon glyphicon-trash" aria-hidden="true" title="Delete port"></i> <i class="glyphicon glyphicon-trash" aria-hidden="true" title="Delete port"></i>
</a> </a>
{% endif %} {% endif %}

View File

@ -40,7 +40,7 @@
<i class="glyphicon glyphicon-trash" aria-hidden="true"></i> <i class="glyphicon glyphicon-trash" aria-hidden="true"></i>
</button> </button>
{% else %} {% else %}
<a href="{% url 'dcim:devicebay_delete' pk=devicebay.pk %}?return_url={{ device.get_absolute_url }}" class="btn btn-danger btn-xs"> <a href="{% url 'dcim:devicebay_delete' pk=devicebay.pk %}" class="btn btn-danger btn-xs">
<i class="glyphicon glyphicon-trash" aria-hidden="true" title="Delete device bay"></i> <i class="glyphicon glyphicon-trash" aria-hidden="true" title="Delete device bay"></i>
</a> </a>
{% endif %} {% endif %}

View File

@ -85,7 +85,7 @@
<i class="glyphicon glyphicon-trash" aria-hidden="true"></i> <i class="glyphicon glyphicon-trash" aria-hidden="true"></i>
</button> </button>
{% else %} {% else %}
<a href="{% url 'dcim:interface_delete' pk=iface.pk %}?return_url={{ device.get_absolute_url }}" class="btn btn-danger btn-xs" title="Delete interface"> <a href="{% url 'dcim:interface_delete' pk=iface.pk %}" class="btn btn-danger btn-xs" title="Delete interface">
<i class="glyphicon glyphicon-trash" aria-hidden="true"></i> <i class="glyphicon glyphicon-trash" aria-hidden="true"></i>
</a> </a>
{% endif %} {% endif %}

View File

@ -49,7 +49,7 @@
<i class="glyphicon glyphicon-trash" aria-hidden="true"></i> <i class="glyphicon glyphicon-trash" aria-hidden="true"></i>
</button> </button>
{% else %} {% else %}
<a href="{% url 'dcim:poweroutlet_delete' pk=po.pk %}?return_url={{ device.get_absolute_url }}" class="btn btn-danger btn-xs"> <a href="{% url 'dcim:poweroutlet_delete' pk=po.pk %}" class="btn btn-danger btn-xs">
<i class="glyphicon glyphicon-trash" aria-hidden="true" title="Delete outlet"></i> <i class="glyphicon glyphicon-trash" aria-hidden="true" title="Delete outlet"></i>
</a> </a>
{% endif %} {% endif %}

View File

@ -50,7 +50,7 @@
<i class="glyphicon glyphicon-trash" aria-hidden="true"></i> <i class="glyphicon glyphicon-trash" aria-hidden="true"></i>
</button> </button>
{% else %} {% else %}
<a href="{% url 'dcim:powerport_delete' pk=pp.pk %}?return_url={{ device.get_absolute_url }}" class="btn btn-danger btn-xs"> <a href="{% url 'dcim:powerport_delete' pk=pp.pk %}" class="btn btn-danger btn-xs">
<i class="glyphicon glyphicon-trash" aria-hidden="true" title="Delete port"></i> <i class="glyphicon glyphicon-trash" aria-hidden="true" title="Delete port"></i>
</a> </a>
{% endif %} {% endif %}

View File

@ -86,7 +86,7 @@
<div class="form-group"> <div class="form-group">
<button type="submit" name="_create" class="btn btn-primary">Connect</button> <button type="submit" name="_create" class="btn btn-primary">Connect</button>
<button type="submit" name="_addanother" class="btn btn-primary">Connect and Add Another</button> <button type="submit" name="_addanother" class="btn btn-primary">Connect and Add Another</button>
<a href="{{ cancel_url }}" class="btn btn-default">Cancel</a> <a href="{{ return_url }}" class="btn btn-default">Cancel</a>
</div> </div>
</div> </div>
</form> </form>

View File

@ -53,7 +53,7 @@
<div class="col-md-9 col-md-offset-3"> <div class="col-md-9 col-md-offset-3">
<button type="submit" name="_create" class="btn btn-primary">Create</button> <button type="submit" name="_create" class="btn btn-primary">Create</button>
<button type="submit" name="_addanother" class="btn btn-primary">Create and Add More</button> <button type="submit" name="_addanother" class="btn btn-primary">Create and Add More</button>
<a href="{{ cancel_url }}" class="btn btn-default">Cancel</a> <a href="{{ return_url }}" class="btn btn-default">Cancel</a>
</div> </div>
</div> </div>
</div> </div>

View File

@ -40,7 +40,7 @@
<div class="form-group"> <div class="form-group">
<div class="col-md-9 col-md-offset-3"> <div class="col-md-9 col-md-offset-3">
<button type="submit" name="_update" class="btn btn-primary">Connect</button> <button type="submit" name="_update" class="btn btn-primary">Connect</button>
<a href="{{ cancel_url }}" class="btn btn-default">Cancel</a> <a href="{{ return_url }}" class="btn btn-default">Cancel</a>
</div> </div>
</div> </div>
</div> </div>

View File

@ -40,7 +40,7 @@
<div class="form-group"> <div class="form-group">
<div class="col-md-9 col-md-offset-3"> <div class="col-md-9 col-md-offset-3">
<button type="submit" name="_update" class="btn btn-primary">Connect</button> <button type="submit" name="_update" class="btn btn-primary">Connect</button>
<a href="{{ cancel_url }}" class="btn btn-default">Cancel</a> <a href="{{ return_url }}" class="btn btn-default">Cancel</a>
</div> </div>
</div> </div>
</div> </div>

View File

@ -13,7 +13,7 @@
{% render_form form %} {% render_form form %}
<div class="form-group"> <div class="form-group">
<button type="submit" class="btn btn-primary">Submit</button> <button type="submit" class="btn btn-primary">Submit</button>
<a href="{% url obj_list_url %}" class="btn btn-default">Cancel</a> <a href="{% url return_url %}" class="btn btn-default">Cancel</a>
</div> </div>
</form> </form>
</div> </div>

View File

@ -13,7 +13,7 @@
{% render_form form %} {% render_form form %}
<div class="form-group"> <div class="form-group">
<button type="submit" class="btn btn-primary">Submit</button> <button type="submit" class="btn btn-primary">Submit</button>
<a href="{% url obj_list_url %}" class="btn btn-default">Cancel</a> <a href="{% url return_url %}" class="btn btn-default">Cancel</a>
</div> </div>
</form> </form>
</div> </div>

View File

@ -13,7 +13,7 @@
{% render_form form %} {% render_form form %}
<div class="form-group"> <div class="form-group">
<button type="submit" class="btn btn-primary">Submit</button> <button type="submit" class="btn btn-primary">Submit</button>
<a href="{% url obj_list_url %}" class="btn btn-default">Cancel</a> <a href="{% url return_url %}" class="btn btn-default">Cancel</a>
</div> </div>
</form> </form>
</div> </div>

View File

@ -59,7 +59,7 @@
<div class="form-group"> <div class="form-group">
<div class="col-md-9 col-md-offset-3"> <div class="col-md-9 col-md-offset-3">
<button type="submit" name="_assign" class="btn btn-primary">Assign</button> <button type="submit" name="_assign" class="btn btn-primary">Assign</button>
<a href="{{ cancel_url }}" class="btn btn-default">Cancel</a> <a href="{{ return_url }}" class="btn btn-default">Cancel</a>
</div> </div>
</div> </div>
</div> </div>

View File

@ -13,7 +13,7 @@
{% render_form form %} {% render_form form %}
<div class="form-group"> <div class="form-group">
<button type="submit" class="btn btn-primary">Submit</button> <button type="submit" class="btn btn-primary">Submit</button>
<a href="{% url obj_list_url %}" class="btn btn-default">Cancel</a> <a href="{% url return_url %}" class="btn btn-default">Cancel</a>
</div> </div>
</form> </form>
</div> </div>

View File

@ -13,7 +13,7 @@
{% render_form form %} {% render_form form %}
<div class="form-group"> <div class="form-group">
<button type="submit" class="btn btn-primary">Submit</button> <button type="submit" class="btn btn-primary">Submit</button>
<a href="{% url obj_list_url %}" class="btn btn-default">Cancel</a> <a href="{% url return_url %}" class="btn btn-default">Cancel</a>
</div> </div>
</form> </form>
</div> </div>

View File

@ -13,7 +13,7 @@
{% render_form form %} {% render_form form %}
<div class="form-group"> <div class="form-group">
<button type="submit" class="btn btn-primary">Submit</button> <button type="submit" class="btn btn-primary">Submit</button>
<a href="{% url obj_list_url %}" class="btn btn-default">Cancel</a> <a href="{% url return_url %}" class="btn btn-default">Cancel</a>
</div> </div>
</form> </form>
</div> </div>

View File

@ -13,7 +13,7 @@
{% render_form form %} {% render_form form %}
<div class="form-group"> <div class="form-group">
<button type="submit" class="btn btn-primary">Submit</button> <button type="submit" class="btn btn-primary">Submit</button>
<a href="{% url obj_list_url %}" class="btn btn-default">Cancel</a> <a href="{% url return_url %}" class="btn btn-default">Cancel</a>
</div> </div>
</form> </form>
</div> </div>

View File

@ -59,7 +59,7 @@
{% else %} {% else %}
<button type="submit" name="_create" class="btn btn-primary">Create</button> <button type="submit" name="_create" class="btn btn-primary">Create</button>
<button type="submit" name="_addanother" class="btn btn-primary">Create and Add Another</button> <button type="submit" name="_addanother" class="btn btn-primary">Create and Add Another</button>
<a href="{{ cancel_url }}" class="btn btn-default">Cancel</a> <a href="{{ return_url }}" class="btn btn-default">Cancel</a>
{% endif %} {% endif %}
</div> </div>
</div> </div>

View File

@ -22,7 +22,7 @@
{% render_form form %} {% render_form form %}
<div class="form-group"> <div class="form-group">
<button type="submit" class="btn btn-primary">Submit</button> <button type="submit" class="btn btn-primary">Submit</button>
<a href="{{ cancel_url }}" class="btn btn-default">Cancel</a> <a href="{{ return_url }}" class="btn btn-default">Cancel</a>
</div> </div>
</form> </form>
</div> </div>

View File

@ -13,7 +13,7 @@
{% render_form form %} {% render_form form %}
<div class="form-group"> <div class="form-group">
<button type="submit" class="btn btn-primary">Submit</button> <button type="submit" class="btn btn-primary">Submit</button>
<a href="{% url obj_list_url %}" class="btn btn-default">Cancel</a> <a href="{% url return_url %}" class="btn btn-default">Cancel</a>
</div> </div>
</form> </form>
</div> </div>

View File

@ -5,8 +5,8 @@
<h1>{% block title %}{% endblock %}</h1> <h1>{% block title %}{% endblock %}</h1>
<form action="." method="post" class="form form-horizontal"> <form action="." method="post" class="form form-horizontal">
{% csrf_token %} {% csrf_token %}
{% if request.POST.redirect_url %} {% if request.POST.return_url %}
<input type="hidden" name="redirect_url" value="{{ request.POST.redirect_url }}" /> <input type="hidden" name="return_url" value="{{ request.POST.return_url }}" />
{% endif %} {% endif %}
{% for field in form.hidden_fields %} {% for field in form.hidden_fields %}
{{ field }} {{ field }}
@ -44,7 +44,7 @@
<div class="form-group text-right"> <div class="form-group text-right">
<div class="col-md-12"> <div class="col-md-12">
<button type="submit" name="_apply" class="btn btn-primary">Apply</button> <button type="submit" name="_apply" class="btn btn-primary">Apply</button>
<a href="{{ cancel_url }}" class="btn btn-default">Cancel</a> <a href="{{ return_url }}" class="btn btn-default">Cancel</a>
</div> </div>
</div> </div>
</div> </div>

View File

@ -23,7 +23,7 @@
</div> </div>
<div class="text-right"> <div class="text-right">
<button type="submit" name="_confirm" class="btn btn-{{ button_class|default:"danger" }}">Confirm</button> <button type="submit" name="_confirm" class="btn btn-{{ button_class|default:"danger" }}">Confirm</button>
<a href="{{ cancel_url }}" class="btn btn-default">Cancel</a> <a href="{{ return_url }}" class="btn btn-default">Cancel</a>
</div> </div>
</div> </div>
</div> </div>

View File

@ -37,7 +37,7 @@
<button type="submit" name="_create" class="btn btn-primary">Create</button> <button type="submit" name="_create" class="btn btn-primary">Create</button>
<button type="submit" name="_addanother" class="btn btn-primary">Create and Add Another</button> <button type="submit" name="_addanother" class="btn btn-primary">Create and Add Another</button>
{% endif %} {% endif %}
<a href="{{ cancel_url }}" class="btn btn-default">Cancel</a> <a href="{{ return_url }}" class="btn btn-default">Cancel</a>
</div> </div>
</div> </div>
</form> </form>

View File

@ -3,7 +3,7 @@
{% if table.model|user_can_change:request.user or table.model|user_can_delete:request.user %} {% if table.model|user_can_change:request.user or table.model|user_can_delete:request.user %}
<form method="post" class="form form-horizontal"> <form method="post" class="form form-horizontal">
{% csrf_token %} {% csrf_token %}
<input type="hidden" name="redirect_url" value="{{ request.path }}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" /> <input type="hidden" name="return_url" value="{{ request.path }}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" />
{% if table.paginator.num_pages > 1 %} {% if table.paginator.num_pages > 1 %}
<div id="select_all_box" class="hidden panel panel-default"> <div id="select_all_box" class="hidden panel panel-default">
<div class="panel-body"> <div class="panel-body">

View File

@ -37,7 +37,7 @@ class TenantGroupEditView(PermissionRequiredMixin, ObjectEditView):
class TenantGroupBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class TenantGroupBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'tenancy.delete_tenantgroup' permission_required = 'tenancy.delete_tenantgroup'
cls = TenantGroup cls = TenantGroup
default_redirect_url = 'tenancy:tenantgroup_list' default_return_url = 'tenancy:tenantgroup_list'
# #
@ -85,7 +85,7 @@ class TenantEditView(PermissionRequiredMixin, ObjectEditView):
form_class = forms.TenantForm form_class = forms.TenantForm
fields_initial = ['group'] fields_initial = ['group']
template_name = 'tenancy/tenant_edit.html' template_name = 'tenancy/tenant_edit.html'
obj_list_url = 'tenancy:tenant_list' default_return_url = 'tenancy:tenant_list'
class TenantDeleteView(PermissionRequiredMixin, ObjectDeleteView): class TenantDeleteView(PermissionRequiredMixin, ObjectDeleteView):
@ -99,7 +99,7 @@ class TenantBulkImportView(PermissionRequiredMixin, BulkImportView):
form = forms.TenantImportForm form = forms.TenantImportForm
table = tables.TenantTable table = tables.TenantTable
template_name = 'tenancy/tenant_import.html' template_name = 'tenancy/tenant_import.html'
obj_list_url = 'tenancy:tenant_list' default_return_url = 'tenancy:tenant_list'
class TenantBulkEditView(PermissionRequiredMixin, BulkEditView): class TenantBulkEditView(PermissionRequiredMixin, BulkEditView):
@ -108,11 +108,11 @@ class TenantBulkEditView(PermissionRequiredMixin, BulkEditView):
filter = filters.TenantFilter filter = filters.TenantFilter
form = forms.TenantBulkEditForm form = forms.TenantBulkEditForm
template_name = 'tenancy/tenant_bulk_edit.html' template_name = 'tenancy/tenant_bulk_edit.html'
default_redirect_url = 'tenancy:tenant_list' default_return_url = 'tenancy:tenant_list'
class TenantBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class TenantBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'tenancy.delete_tenant' permission_required = 'tenancy.delete_tenant'
cls = Tenant cls = Tenant
filter = filters.TenantFilter filter = filters.TenantFilter
default_redirect_url = 'tenancy:tenant_list' default_return_url = 'tenancy:tenant_list'

View File

@ -126,13 +126,13 @@ class ObjectEditView(View):
form_class: The form used to create or edit the object form_class: The form used to create or edit the object
fields_initial: A set of fields that will be prepopulated in the form from the request parameters fields_initial: A set of fields that will be prepopulated in the form from the request parameters
template_name: The name of the template template_name: The name of the template
obj_list_url: The name of the URL used to display a list of this object type default_return_url: The name of the URL used to display a list of this object type
""" """
model = None model = None
form_class = None form_class = None
fields_initial = [] fields_initial = []
template_name = 'utilities/obj_edit.html' template_name = 'utilities/obj_edit.html'
obj_list_url = None default_return_url = 'home'
def get_object(self, kwargs): def get_object(self, kwargs):
# Look up object by slug or PK. Return None if neither was provided. # Look up object by slug or PK. Return None if neither was provided.
@ -151,9 +151,7 @@ class ObjectEditView(View):
# Determine where to redirect the user after updating an object (or aborting an update). # Determine where to redirect the user after updating an object (or aborting an update).
if obj.pk and hasattr(obj, 'get_absolute_url'): if obj.pk and hasattr(obj, 'get_absolute_url'):
return obj.get_absolute_url() return obj.get_absolute_url()
if self.obj_list_url is not None: return reverse(self.default_return_url)
return reverse(self.obj_list_url)
return reverse('home')
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
@ -166,7 +164,7 @@ class ObjectEditView(View):
'obj': obj, 'obj': obj,
'obj_type': self.model._meta.verbose_name, 'obj_type': self.model._meta.verbose_name,
'form': form, 'form': form,
'cancel_url': self.get_return_url(obj), 'return_url': self.get_return_url(obj),
}) })
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
@ -203,7 +201,7 @@ class ObjectEditView(View):
'obj': obj, 'obj': obj,
'obj_type': self.model._meta.verbose_name, 'obj_type': self.model._meta.verbose_name,
'form': form, 'form': form,
'cancel_url': self.get_return_url(obj), 'return_url': self.get_return_url(obj),
}) })
@ -226,10 +224,10 @@ class ObjectDeleteView(View):
else: else:
return get_object_or_404(self.model, pk=kwargs['pk']) return get_object_or_404(self.model, pk=kwargs['pk'])
def get_cancel_url(self, obj): def get_return_url(self, obj):
if hasattr(obj, 'get_absolute_url'): if hasattr(obj, 'get_absolute_url'):
return obj.get_absolute_url() return obj.get_absolute_url()
return reverse('home') return reverse(self.default_return_url)
def get(self, request, **kwargs): def get(self, request, **kwargs):
@ -243,7 +241,7 @@ class ObjectDeleteView(View):
'obj': obj, 'obj': obj,
'form': form, 'form': form,
'obj_type': self.model._meta.verbose_name, 'obj_type': self.model._meta.verbose_name,
'cancel_url': request.GET.get('return_url') or self.get_cancel_url(obj), 'return_url': request.GET.get('return_url') or self.get_return_url(obj),
}) })
def post(self, request, **kwargs): def post(self, request, **kwargs):
@ -272,7 +270,7 @@ class ObjectDeleteView(View):
'obj': obj, 'obj': obj,
'form': form, 'form': form,
'obj_type': self.model._meta.verbose_name, 'obj_type': self.model._meta.verbose_name,
'cancel_url': request.GET.get('return_url') or self.get_cancel_url(obj), 'return_url': request.GET.get('return_url') or self.get_return_url(obj),
}) })
@ -283,12 +281,12 @@ class BulkAddView(View):
form: Form class form: Form class
model: The model of the objects being created model: The model of the objects being created
template_name: The name of the template template_name: The name of the template
redirect_url: Name of the URL to which the user is redirected after creating the objects default_return_url: Name of the URL to which the user is redirected after creating the objects
""" """
form = None form = None
model = None model = None
template_name = None template_name = None
redirect_url = None default_return_url = 'home'
def get(self, request): def get(self, request):
@ -297,7 +295,7 @@ class BulkAddView(View):
return render(request, self.template_name, { return render(request, self.template_name, {
'obj_type': self.model._meta.verbose_name, 'obj_type': self.model._meta.verbose_name,
'form': form, 'form': form,
'cancel_url': reverse(self.redirect_url), 'return_url': reverse(self.default_return_url),
}) })
def post(self, request): def post(self, request):
@ -328,12 +326,12 @@ class BulkAddView(View):
messages.success(request, u"Added {} {}.".format(len(new_objs), self.model._meta.verbose_name_plural)) messages.success(request, u"Added {} {}.".format(len(new_objs), self.model._meta.verbose_name_plural))
if '_addanother' in request.POST: if '_addanother' in request.POST:
return redirect(request.path) return redirect(request.path)
return redirect(self.redirect_url) return redirect(self.default_return_url)
return render(request, self.template_name, { return render(request, self.template_name, {
'form': form, 'form': form,
'obj_type': self.model._meta.verbose_name, 'obj_type': self.model._meta.verbose_name,
'cancel_url': reverse(self.redirect_url), 'return_url': reverse(self.default_return_url),
}) })
@ -344,18 +342,18 @@ class BulkImportView(View):
form: Form class form: Form class
table: The django-tables2 Table used to render the list of imported objects table: The django-tables2 Table used to render the list of imported objects
template_name: The name of the template template_name: The name of the template
obj_list_url: The name of the URL to use for the cancel button default_return_url: The name of the URL to use for the cancel button
""" """
form = None form = None
table = None table = None
template_name = None template_name = None
obj_list_url = None default_return_url = None
def get(self, request): def get(self, request):
return render(request, self.template_name, { return render(request, self.template_name, {
'form': self.form(), 'form': self.form(),
'obj_list_url': self.obj_list_url, 'return_url': self.default_return_url,
}) })
def post(self, request): def post(self, request):
@ -384,7 +382,7 @@ class BulkImportView(View):
return render(request, self.template_name, { return render(request, self.template_name, {
'form': form, 'form': form,
'obj_list_url': self.obj_list_url, 'return_url': self.default_return_url,
}) })
def save_obj(self, obj): def save_obj(self, obj):
@ -400,17 +398,18 @@ class BulkEditView(View):
filter: FilterSet to apply when deleting by QuerySet filter: FilterSet to apply when deleting by QuerySet
form: The form class used to edit objects in bulk form: The form class used to edit objects in bulk
template_name: The name of the template template_name: The name of the template
default_redirect_url: Name of the URL to which the user is redirected after editing the objects default_return_url: Name of the URL to which the user is redirected after editing the objects (can be overriden by
POSTing return_url)
""" """
cls = None cls = None
parent_cls = None parent_cls = None
filter = None filter = None
form = None form = None
template_name = None template_name = None
default_redirect_url = None default_return_url = 'home'
def get(self): def get(self):
return redirect(self.default_redirect_url) return redirect(self.default_return_url)
def post(self, request, **kwargs): def post(self, request, **kwargs):
@ -421,15 +420,13 @@ class BulkEditView(View):
parent_obj = None parent_obj = None
# Determine URL to redirect users upon modification of objects # Determine URL to redirect users upon modification of objects
posted_redirect_url = request.POST.get('redirect_url') posted_return_url = request.POST.get('return_url')
if posted_redirect_url and is_safe_url(url=posted_redirect_url, host=request.get_host()): if posted_return_url and is_safe_url(url=posted_return_url, host=request.get_host()):
redirect_url = posted_redirect_url return_url = posted_return_url
elif parent_obj: elif parent_obj:
redirect_url = parent_obj.get_absolute_url() return_url = parent_obj.get_absolute_url()
elif self.default_redirect_url:
redirect_url = reverse(self.default_redirect_url)
else: else:
raise ImproperlyConfigured('No redirect URL has been provided.') return_url = reverse(self.default_return_url)
# Are we editing *all* objects in the queryset or just a selected subset? # Are we editing *all* objects in the queryset or just a selected subset?
if request.POST.get('_all') and self.filter is not None: if request.POST.get('_all') and self.filter is not None:
@ -467,7 +464,7 @@ class BulkEditView(View):
msg = u'Updated {} {}'.format(updated_count, self.cls._meta.verbose_name_plural) msg = u'Updated {} {}'.format(updated_count, self.cls._meta.verbose_name_plural)
messages.success(self.request, msg) messages.success(self.request, msg)
UserAction.objects.log_bulk_edit(request.user, ContentType.objects.get_for_model(self.cls), msg) UserAction.objects.log_bulk_edit(request.user, ContentType.objects.get_for_model(self.cls), msg)
return redirect(redirect_url) return redirect(return_url)
else: else:
form = self.form(self.cls, initial={'pk': pk_list}) form = self.form(self.cls, initial={'pk': pk_list})
@ -475,12 +472,12 @@ class BulkEditView(View):
selected_objects = self.cls.objects.filter(pk__in=pk_list) selected_objects = self.cls.objects.filter(pk__in=pk_list)
if not selected_objects: if not selected_objects:
messages.warning(request, u"No {} were selected.".format(self.cls._meta.verbose_name_plural)) messages.warning(request, u"No {} were selected.".format(self.cls._meta.verbose_name_plural))
return redirect(redirect_url) return redirect(return_url)
return render(request, self.template_name, { return render(request, self.template_name, {
'form': form, 'form': form,
'selected_objects': selected_objects, 'selected_objects': selected_objects,
'cancel_url': redirect_url, 'return_url': return_url,
}) })
def update_custom_fields(self, pk_list, form, fields, nullified_fields): def update_custom_fields(self, pk_list, form, fields, nullified_fields):
@ -540,14 +537,15 @@ class BulkDeleteView(View):
filter: FilterSet to apply when deleting by QuerySet filter: FilterSet to apply when deleting by QuerySet
form: The form class used to delete objects in bulk form: The form class used to delete objects in bulk
template_name: The name of the template template_name: The name of the template
default_redirect_url: Name of the URL to which the user is redirected after deleting the objects default_return_url: Name of the URL to which the user is redirected after deleting the objects (can be overriden by
POSTing return_url)
""" """
cls = None cls = None
parent_cls = None parent_cls = None
filter = None filter = None
form = None form = None
template_name = 'utilities/confirm_bulk_delete.html' template_name = 'utilities/confirm_bulk_delete.html'
default_redirect_url = None default_return_url = 'home'
def post(self, request, **kwargs): def post(self, request, **kwargs):
@ -558,15 +556,13 @@ class BulkDeleteView(View):
parent_obj = None parent_obj = None
# Determine URL to redirect users upon deletion of objects # Determine URL to redirect users upon deletion of objects
posted_redirect_url = request.POST.get('redirect_url') posted_return_url = request.POST.get('return_url')
if posted_redirect_url and is_safe_url(url=posted_redirect_url, host=request.get_host()): if posted_return_url and is_safe_url(url=posted_return_url, host=request.get_host()):
redirect_url = posted_redirect_url return_url = posted_return_url
elif parent_obj: elif parent_obj:
redirect_url = parent_obj.get_absolute_url() return_url = parent_obj.get_absolute_url()
elif self.default_redirect_url:
redirect_url = reverse(self.default_redirect_url)
else: else:
raise ImproperlyConfigured('No redirect URL has been provided.') return_url = reverse(self.default_return_url)
# Are we deleting *all* objects in the queryset or just a selected subset? # Are we deleting *all* objects in the queryset or just a selected subset?
if request.POST.get('_all') and self.filter is not None: if request.POST.get('_all') and self.filter is not None:
@ -586,12 +582,12 @@ class BulkDeleteView(View):
deleted_count = queryset.delete()[1][self.cls._meta.label] deleted_count = queryset.delete()[1][self.cls._meta.label]
except ProtectedError as e: except ProtectedError as e:
handle_protectederror(list(queryset), request, e) handle_protectederror(list(queryset), request, e)
return redirect(redirect_url) return redirect(return_url)
msg = u'Deleted {} {}'.format(deleted_count, self.cls._meta.verbose_name_plural) msg = u'Deleted {} {}'.format(deleted_count, self.cls._meta.verbose_name_plural)
messages.success(request, msg) messages.success(request, msg)
UserAction.objects.log_bulk_delete(request.user, ContentType.objects.get_for_model(self.cls), msg) UserAction.objects.log_bulk_delete(request.user, ContentType.objects.get_for_model(self.cls), msg)
return redirect(redirect_url) return redirect(return_url)
else: else:
form = form_cls(initial={'pk': pk_list}) form = form_cls(initial={'pk': pk_list})
@ -599,14 +595,14 @@ class BulkDeleteView(View):
selected_objects = self.cls.objects.filter(pk__in=pk_list) selected_objects = self.cls.objects.filter(pk__in=pk_list)
if not selected_objects: if not selected_objects:
messages.warning(request, u"No {} were selected for deletion.".format(self.cls._meta.verbose_name_plural)) messages.warning(request, u"No {} were selected for deletion.".format(self.cls._meta.verbose_name_plural))
return redirect(redirect_url) return redirect(return_url)
return render(request, self.template_name, { return render(request, self.template_name, {
'form': form, 'form': form,
'parent_obj': parent_obj, 'parent_obj': parent_obj,
'obj_type_plural': self.cls._meta.verbose_name_plural, 'obj_type_plural': self.cls._meta.verbose_name_plural,
'selected_objects': selected_objects, 'selected_objects': selected_objects,
'cancel_url': redirect_url, 'return_url': return_url,
}) })
def get_form(self): def get_form(self):