Browse Source

Closes #760: Redirect user back to device view after deleting an assigned IP address

Jeremy Stretch 8 years ago
parent
commit
9ff59ab686
3 changed files with 16 additions and 5 deletions
  1. 1 1
      netbox/templates/dcim/inc/ipaddress.html
  2. 5 0
      netbox/utilities/forms.py
  3. 10 4
      netbox/utilities/views.py

+ 1 - 1
netbox/templates/dcim/inc/ipaddress.html

@@ -13,7 +13,7 @@
     </td>
     <td class="text-right">
         {% if perms.ipam.delete_ipaddress %}
-            <a href="{% url 'ipam:ipaddress_delete' pk=ip.pk %}" class="btn btn-danger btn-xs">
+            <a href="{% url 'ipam:ipaddress_delete' pk=ip.pk %}?return_url={{ device.get_absolute_url }}" class="btn btn-danger btn-xs">
                 <i class="glyphicon glyphicon-trash" aria-hidden="true" title="Delete IP address"></i>
             </a>
         {% endif %}

+ 5 - 0
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):

+ 10 - 4
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),
         })