From 9ff59ab686ee3199be9a001bb8e37e5973a3748d Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 18 Jan 2017 12:25:07 -0500 Subject: [PATCH] Closes #760: Redirect user back to device view after deleting an assigned IP address --- netbox/templates/dcim/inc/ipaddress.html | 2 +- netbox/utilities/forms.py | 5 +++++ netbox/utilities/views.py | 14 ++++++++++---- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/netbox/templates/dcim/inc/ipaddress.html b/netbox/templates/dcim/inc/ipaddress.html index 7bdc8bc1e..72920986e 100644 --- a/netbox/templates/dcim/inc/ipaddress.html +++ b/netbox/templates/dcim/inc/ipaddress.html @@ -13,7 +13,7 @@ {% if perms.ipam.delete_ipaddress %} - + {% endif %} diff --git a/netbox/utilities/forms.py b/netbox/utilities/forms.py index 9351c6044..f957f8e88 100644 --- a/netbox/utilities/forms.py +++ b/netbox/utilities/forms.py @@ -386,7 +386,12 @@ class BootstrapMixin(forms.BaseForm): class ConfirmationForm(BootstrapMixin, forms.Form): + """ + A generic confirmation form. The form is not valid unless the confirm field is checked. An optional return_url can + be specified to direct the user to a specific URL after the action has been taken. + """ confirm = forms.BooleanField(required=True) + return_url = forms.CharField(required=False, widget=forms.HiddenInput()) class BulkEditForm(forms.Form): diff --git a/netbox/utilities/views.py b/netbox/utilities/views.py index 125bb6584..bae8728bf 100644 --- a/netbox/utilities/views.py +++ b/netbox/utilities/views.py @@ -239,13 +239,16 @@ class ObjectDeleteView(View): def get(self, request, **kwargs): obj = self.get_object(kwargs) - form = ConfirmationForm() + initial_data = { + 'return_url': request.GET.get('return_url'), + } + form = ConfirmationForm(initial=initial_data) return render(request, self.template_name, { 'obj': obj, 'form': form, 'obj_type': self.model._meta.verbose_name, - 'cancel_url': self.get_cancel_url(obj), + 'cancel_url': request.GET.get('return_url') or self.get_cancel_url(obj), }) def post(self, request, **kwargs): @@ -261,7 +264,10 @@ class ObjectDeleteView(View): msg = u'Deleted {} {}'.format(self.model._meta.verbose_name, obj) messages.success(request, msg) UserAction.objects.log_delete(request.user, obj, msg) - if self.redirect_url: + return_url = form.cleaned_data['return_url'] + if return_url and is_safe_url(url=return_url, host=request.get_host()): + return redirect(return_url) + elif self.redirect_url: return redirect(self.redirect_url) elif hasattr(obj, 'get_parent_url'): return redirect(obj.get_parent_url()) @@ -272,7 +278,7 @@ class ObjectDeleteView(View): 'obj': obj, 'form': form, 'obj_type': self.model._meta.verbose_name, - 'cancel_url': self.get_cancel_url(obj), + 'cancel_url': request.GET.get('return_url') or self.get_cancel_url(obj), })