From fce8e3fe0538883a94c1fa0597b7a9541b46d9e2 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 18 May 2020 14:29:35 +1000 Subject: [PATCH] add button to delete all test data for a given stock item --- InvenTree/InvenTree/forms.py | 21 +++++++++-- .../stock/templates/stock/item_tests.html | 14 +++++++ InvenTree/stock/urls.py | 1 + InvenTree/stock/views.py | 37 +++++++++++++++++++ 4 files changed, 70 insertions(+), 3 deletions(-) diff --git a/InvenTree/InvenTree/forms.py b/InvenTree/InvenTree/forms.py index ad4b810e32..1e70b525c6 100644 --- a/InvenTree/InvenTree/forms.py +++ b/InvenTree/InvenTree/forms.py @@ -5,6 +5,7 @@ Helper forms which subclass Django forms to provide additional functionality # -*- coding: utf-8 -*- from __future__ import unicode_literals +from django.utils.translation import ugettext as _ from django import forms from crispy_forms.helper import FormHelper from crispy_forms.layout import Layout, Field @@ -92,6 +93,20 @@ class HelperForm(forms.ModelForm): self.helper.layout = Layout(*layouts) +class ConfirmForm(forms.Form): + """ Generic confirmation form """ + + confirm = forms.BooleanField( + required=False, initial=False, + help_text=_("Confirm") + ) + + class Meta: + fields = [ + 'confirm' + ] + + class DeleteForm(forms.Form): """ Generic deletion form which provides simple user confirmation """ @@ -99,7 +114,7 @@ class DeleteForm(forms.Form): confirm_delete = forms.BooleanField( required=False, initial=False, - help_text='Confirm item deletion' + help_text=_('Confirm item deletion') ) class Meta: @@ -131,14 +146,14 @@ class SetPasswordForm(HelperForm): required=True, initial='', widget=forms.PasswordInput(attrs={'autocomplete': 'off'}), - help_text='Enter new password') + help_text=_('Enter new password')) confirm_password = forms.CharField(max_length=100, min_length=8, required=True, initial='', widget=forms.PasswordInput(attrs={'autocomplete': 'off'}), - help_text='Confirm new password') + help_text=_('Confirm new password')) class Meta: model = User diff --git a/InvenTree/stock/templates/stock/item_tests.html b/InvenTree/stock/templates/stock/item_tests.html index 6a69d55eb9..b311f13584 100644 --- a/InvenTree/stock/templates/stock/item_tests.html +++ b/InvenTree/stock/templates/stock/item_tests.html @@ -14,6 +14,9 @@
+ {% if user.is_staff %} + + {% endif %}
@@ -40,6 +43,17 @@ function reloadTable() { //$("#test-result-table").bootstrapTable("refresh"); } +{% if user.is_staff %} +$("#delete-test-results").click(function() { + launchModalForm( + "{% url 'stock-item-delete-test-data' item.id %}", + { + success: reloadTable, + } + ); +}); +{% endif %} + $("#add-test-result").click(function() { launchModalForm( "{% url 'stock-item-test-create' %}", { diff --git a/InvenTree/stock/urls.py b/InvenTree/stock/urls.py index ce99976f8b..b415381061 100644 --- a/InvenTree/stock/urls.py +++ b/InvenTree/stock/urls.py @@ -21,6 +21,7 @@ stock_item_detail_urls = [ url(r'^serialize/', views.StockItemSerialize.as_view(), name='stock-item-serialize'), url(r'^delete/', views.StockItemDelete.as_view(), name='stock-item-delete'), url(r'^qr_code/', views.StockItemQRCode.as_view(), name='stock-item-qr'), + url(r'^delete_test_data/', views.StockItemDeleteTestData.as_view(), name='stock-item-delete-test-data'), url(r'^add_tracking/', views.StockItemTrackingCreate.as_view(), name='stock-tracking-create'), diff --git a/InvenTree/stock/views.py b/InvenTree/stock/views.py index 29a57f5926..57bff223d5 100644 --- a/InvenTree/stock/views.py +++ b/InvenTree/stock/views.py @@ -17,6 +17,7 @@ from django.utils.translation import ugettext as _ from InvenTree.views import AjaxView from InvenTree.views import AjaxUpdateView, AjaxDeleteView, AjaxCreateView from InvenTree.views import QRCodeView +from InvenTree.forms import ConfirmForm from InvenTree.helpers import str2bool, DownloadFile, GetExportFormats from InvenTree.helpers import ExtractSerialNumbers @@ -229,6 +230,42 @@ class StockItemAttachmentDelete(AjaxDeleteView): } +class StockItemDeleteTestData(AjaxUpdateView): + """ + View for deleting all test data + """ + + model = StockItem + form_class = ConfirmForm + ajax_form_title = _("Delete All Test Data") + + def get_form(self): + return ConfirmForm() + + def post(self, request, *args, **kwargs): + + + valid = False + + stock_item = StockItem.objects.get(pk=self.kwargs['pk']) + form = self.get_form() + + confirm = str2bool(request.POST.get('confirm', False)) + + if confirm is not True: + form.errors['confirm'] = [_('Confirm test data deletion')] + form.non_field_errors = [_('Check the confirmation box')] + else: + stock_item.test_results.all().delete() + valid = True + + data = { + 'form_valid': valid, + } + + return self.renderJsonResponse(request, form, data) + + class StockItemTestResultCreate(AjaxCreateView): """ View for adding a new StockItemTestResult