|
@@ -9,6 +9,7 @@ from django.http import HttpResponseRedirect
|
|
from django.shortcuts import get_object_or_404, redirect, render
|
|
from django.shortcuts import get_object_or_404, redirect, render
|
|
from django.template import TemplateSyntaxError
|
|
from django.template import TemplateSyntaxError
|
|
from django.utils.decorators import method_decorator
|
|
from django.utils.decorators import method_decorator
|
|
|
|
+from django.utils.http import is_safe_url
|
|
from django.views.generic import View
|
|
from django.views.generic import View
|
|
|
|
|
|
from django_tables2 import RequestConfig
|
|
from django_tables2 import RequestConfig
|
|
@@ -122,20 +123,26 @@ class BulkEditView(View):
|
|
cls = None
|
|
cls = None
|
|
form = None
|
|
form = None
|
|
template_name = None
|
|
template_name = None
|
|
- redirect_url = None
|
|
|
|
|
|
+ default_redirect_url = None
|
|
|
|
|
|
def get(self, request, *args, **kwargs):
|
|
def get(self, request, *args, **kwargs):
|
|
- return redirect(self.redirect_url)
|
|
|
|
|
|
+ return redirect(self.default_redirect_url)
|
|
|
|
|
|
def post(self, request, *args, **kwargs):
|
|
def post(self, request, *args, **kwargs):
|
|
|
|
|
|
|
|
+ posted_redirect_url = request.POST.get('redirect_url')
|
|
|
|
+ if posted_redirect_url and is_safe_url(url=posted_redirect_url, host=request.get_host()):
|
|
|
|
+ redirect_url = posted_redirect_url
|
|
|
|
+ else:
|
|
|
|
+ redirect_url = reverse(self.default_redirect_url)
|
|
|
|
+
|
|
if '_apply' in request.POST:
|
|
if '_apply' in request.POST:
|
|
form = self.form(request.POST)
|
|
form = self.form(request.POST)
|
|
if form.is_valid():
|
|
if form.is_valid():
|
|
pk_list = [obj.pk for obj in form.cleaned_data['pk']]
|
|
pk_list = [obj.pk for obj in form.cleaned_data['pk']]
|
|
self.update_objects(pk_list, form)
|
|
self.update_objects(pk_list, form)
|
|
if not form.errors:
|
|
if not form.errors:
|
|
- return redirect(self.redirect_url)
|
|
|
|
|
|
+ return redirect(redirect_url)
|
|
|
|
|
|
else:
|
|
else:
|
|
form = self.form(initial={'pk': request.POST.getlist('pk')})
|
|
form = self.form(initial={'pk': request.POST.getlist('pk')})
|
|
@@ -143,12 +150,12 @@ class BulkEditView(View):
|
|
selected_objects = self.cls.objects.filter(pk__in=request.POST.getlist('pk'))
|
|
selected_objects = self.cls.objects.filter(pk__in=request.POST.getlist('pk'))
|
|
if not selected_objects:
|
|
if not selected_objects:
|
|
messages.warning(request, "No {} were selected.".format(self.cls._meta.verbose_name_plural))
|
|
messages.warning(request, "No {} were selected.".format(self.cls._meta.verbose_name_plural))
|
|
- return redirect(self.redirect_url)
|
|
|
|
|
|
+ return redirect(redirect_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': reverse(self.redirect_url),
|
|
|
|
|
|
+ 'cancel_url': redirect_url,
|
|
})
|
|
})
|
|
|
|
|
|
def update_objects(self, obj_list, form):
|
|
def update_objects(self, obj_list, form):
|
|
@@ -162,16 +169,23 @@ class BulkDeleteView(View):
|
|
cls = None
|
|
cls = None
|
|
form = None
|
|
form = None
|
|
template_name = None
|
|
template_name = None
|
|
- redirect_url = None
|
|
|
|
|
|
+ default_redirect_url = None
|
|
|
|
|
|
@method_decorator(staff_member_required)
|
|
@method_decorator(staff_member_required)
|
|
def dispatch(self, *args, **kwargs):
|
|
def dispatch(self, *args, **kwargs):
|
|
return super(BulkDeleteView, self).dispatch(*args, **kwargs)
|
|
return super(BulkDeleteView, self).dispatch(*args, **kwargs)
|
|
|
|
|
|
def get(self, request, *args, **kwargs):
|
|
def get(self, request, *args, **kwargs):
|
|
- return redirect(self.redirect_url)
|
|
|
|
|
|
+ return redirect(self.default_redirect_url)
|
|
|
|
|
|
def post(self, request, *args, **kwargs):
|
|
def post(self, request, *args, **kwargs):
|
|
|
|
+
|
|
|
|
+ posted_redirect_url = request.POST.get('redirect_url')
|
|
|
|
+ if posted_redirect_url and is_safe_url(url=posted_redirect_url, host=request.get_host()):
|
|
|
|
+ redirect_url = posted_redirect_url
|
|
|
|
+ else:
|
|
|
|
+ redirect_url = reverse(self.default_redirect_url)
|
|
|
|
+
|
|
if '_confirm' in request.POST:
|
|
if '_confirm' in request.POST:
|
|
form = self.form(request.POST)
|
|
form = self.form(request.POST)
|
|
if form.is_valid():
|
|
if form.is_valid():
|
|
@@ -183,10 +197,10 @@ class BulkDeleteView(View):
|
|
objects_to_delete.delete()
|
|
objects_to_delete.delete()
|
|
except ProtectedError, e:
|
|
except ProtectedError, e:
|
|
handle_protectederror(list(objects_to_delete), request, e)
|
|
handle_protectederror(list(objects_to_delete), request, e)
|
|
- return redirect(self.redirect_url)
|
|
|
|
|
|
+ return redirect(redirect_url)
|
|
|
|
|
|
messages.success(request, "Deleted {} {}".format(deleted_count, self.cls._meta.verbose_name_plural))
|
|
messages.success(request, "Deleted {} {}".format(deleted_count, self.cls._meta.verbose_name_plural))
|
|
- return redirect(self.redirect_url)
|
|
|
|
|
|
+ return redirect(redirect_url)
|
|
|
|
|
|
else:
|
|
else:
|
|
form = self.form(initial={'pk': request.POST.getlist('pk')})
|
|
form = self.form(initial={'pk': request.POST.getlist('pk')})
|
|
@@ -194,10 +208,10 @@ class BulkDeleteView(View):
|
|
selected_objects = self.cls.objects.filter(pk__in=form.initial.get('pk'))
|
|
selected_objects = self.cls.objects.filter(pk__in=form.initial.get('pk'))
|
|
if not selected_objects:
|
|
if not selected_objects:
|
|
messages.warning(request, "No {} were selected for deletion.".format(self.cls._meta.verbose_name_plural))
|
|
messages.warning(request, "No {} were selected for deletion.".format(self.cls._meta.verbose_name_plural))
|
|
- return redirect(self.redirect_url)
|
|
|
|
|
|
+ return redirect(redirect_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': reverse(self.redirect_url),
|
|
|
|
|
|
+ 'cancel_url': redirect_url,
|
|
})
|
|
})
|