diff --git a/InvenTree/InvenTree/forms.py b/InvenTree/InvenTree/forms.py index ba203b2f1b..8c86fdd7fc 100644 --- a/InvenTree/InvenTree/forms.py +++ b/InvenTree/InvenTree/forms.py @@ -17,3 +17,19 @@ class HelperForm(forms.ModelForm): self.helper = FormHelper() self.helper.form_tag = False + + +class DeleteForm(forms.Form): + """ Generic deletion form which provides simple user confirmation + """ + + confirm_delete = forms.BooleanField( + required=False, + initial=False, + help_text='Confirm item deletion' + ) + + class Meta: + fields = [ + 'confirm_delete' + ] diff --git a/InvenTree/InvenTree/views.py b/InvenTree/InvenTree/views.py index ed07318e28..994f2ed89b 100644 --- a/InvenTree/InvenTree/views.py +++ b/InvenTree/InvenTree/views.py @@ -17,6 +17,9 @@ from django.views.generic.base import TemplateView from part.models import Part +from .forms import DeleteForm +from .helpers import str2bool + from rest_framework import views @@ -300,13 +303,28 @@ class AjaxUpdateView(AjaxMixin, UpdateView): return self.renderJsonResponse(request, form, data) -class AjaxDeleteView(AjaxMixin, DeleteView): +class AjaxDeleteView(AjaxMixin, UpdateView): """ An 'AJAXified DeleteView for removing an object from the DB - Returns a HTML object (not a form!) in JSON format (for delivery to a modal window) - Handles deletion """ + form_class = DeleteForm + ajax_form_title = "Delete Item" + ajax_template_name = "modal_delete_form.html" + context_object_name = 'item' + + def get_object(self): + try: + self.object = self.model.objects.get(pk=self.kwargs['pk']) + except: + return None + return self.object + + def get_form(self): + return self.form_class(self.get_form_kwargs()) + def get(self, request, *args, **kwargs): """ Respond to GET request @@ -314,19 +332,15 @@ class AjaxDeleteView(AjaxMixin, DeleteView): - Return rendered form to client """ - super(DeleteView, self).get(request, *args, **kwargs) + super(UpdateView, self).get(request, *args, **kwargs) - data = { - 'id': self.get_object().id, - 'delete': False, - 'title': self.ajax_form_title, - 'html_data': render_to_string( - self.ajax_template_name, - self.get_context_data(), - request=request) - } + form = self.get_form() - return JsonResponse(data) + context = self.get_context_data() + + context[self.context_object_name] = self.get_object() + + return self.renderJsonResponse(request, form, context=context) def post(self, request, *args, **kwargs): """ Respond to POST request @@ -337,14 +351,24 @@ class AjaxDeleteView(AjaxMixin, DeleteView): obj = self.get_object() pk = obj.id - obj.delete() + + form = self.get_form() + + confirmed = str2bool(request.POST.get('confirm_delete', False)) + context = self.get_context_data() + + if confirmed: + obj.delete() + else: + form.errors['confirm_delete'] = ['Check box to confirm item deletion'] + context[self.context_object_name] = self.get_object() data = { 'id': pk, - 'delete': True + 'form_valid': confirmed } - return self.renderJsonResponse(request, data=data) + return self.renderJsonResponse(request, form, data=data, context=context) class IndexView(TemplateView): diff --git a/InvenTree/templates/modal_delete_form.html b/InvenTree/templates/modal_delete_form.html new file mode 100644 index 0000000000..df8553f26e --- /dev/null +++ b/InvenTree/templates/modal_delete_form.html @@ -0,0 +1 @@ +{% extends "modal_form.html" %}