From ef7cc3f78dce2f942db24f4eff16cc9d1f897770 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 18 Jan 2021 21:33:15 +1100 Subject: [PATCH] Replace existing django form views with API request --- InvenTree/InvenTree/urls.py | 1 + .../stock/templates/stock/item_base.html | 7 +- InvenTree/stock/urls.py | 4 - InvenTree/stock/views.py | 87 ------------ InvenTree/templates/base.html | 1 + InvenTree/templates/js/label.js | 2 +- InvenTree/templates/js/report.js | 124 ++++++++++++++++++ 7 files changed, 128 insertions(+), 98 deletions(-) create mode 100644 InvenTree/templates/js/report.js diff --git a/InvenTree/InvenTree/urls.py b/InvenTree/InvenTree/urls.py index 503e373641..9ad7780122 100644 --- a/InvenTree/InvenTree/urls.py +++ b/InvenTree/InvenTree/urls.py @@ -103,6 +103,7 @@ dynamic_javascript_urls = [ url(r'^order.js', DynamicJsView.as_view(template_name='js/order.js'), name='order.js'), url(r'^part.js', DynamicJsView.as_view(template_name='js/part.js'), name='part.js'), url(r'^label.js', DynamicJsView.as_view(template_name='js/label.js'), name='label.js'), + url(r'^report.js', DynamicJsView.as_view(template_name='js/report.js'), name='report.js'), url(r'^stock.js', DynamicJsView.as_view(template_name='js/stock.js'), name='stock.js'), url(r'^table_filters.js', DynamicJsView.as_view(template_name='js/table_filters.js'), name='table_filters.js'), ] diff --git a/InvenTree/stock/templates/stock/item_base.html b/InvenTree/stock/templates/stock/item_base.html index 8e4693cbc1..403f35d5bb 100644 --- a/InvenTree/stock/templates/stock/item_base.html +++ b/InvenTree/stock/templates/stock/item_base.html @@ -394,12 +394,7 @@ $('#stock-uninstall').click(function() { }); $("#stock-test-report").click(function() { - launchModalForm( - "{% url 'stock-item-test-report-select' item.id %}", - { - follow: true, - } - ); + printTestReports([{{ item.pk }}]); }); $("#print-label").click(function() { diff --git a/InvenTree/stock/urls.py b/InvenTree/stock/urls.py index 6aeb1f5b73..93758588ce 100644 --- a/InvenTree/stock/urls.py +++ b/InvenTree/stock/urls.py @@ -29,8 +29,6 @@ stock_item_detail_urls = [ url(r'^add_tracking/', views.StockItemTrackingCreate.as_view(), name='stock-tracking-create'), - url(r'^test-report-select/', views.StockItemTestReportSelect.as_view(), name='stock-item-test-report-select'), - url(r'^test/', views.StockItemDetail.as_view(template_name='stock/item_tests.html'), name='stock-item-test-results'), url(r'^children/', views.StockItemDetail.as_view(template_name='stock/item_childs.html'), name='stock-item-children'), url(r'^attachments/', views.StockItemDetail.as_view(template_name='stock/item_attachments.html'), name='stock-item-attachments'), @@ -62,8 +60,6 @@ stock_urls = [ url(r'^item/uninstall/', views.StockItemUninstall.as_view(), name='stock-item-uninstall'), - url(r'^item/test-report-download/', views.StockItemTestReportDownload.as_view(), name='stock-item-test-report-download'), - # URLs for StockItem attachments url(r'^item/attachment/', include([ url(r'^new/', views.StockItemAttachmentCreate.as_view(), name='stock-item-attachment-create'), diff --git a/InvenTree/stock/views.py b/InvenTree/stock/views.py index 123fa4d8fb..2de775422a 100644 --- a/InvenTree/stock/views.py +++ b/InvenTree/stock/views.py @@ -30,7 +30,6 @@ from datetime import datetime, timedelta from company.models import Company, SupplierPart from part.models import Part -from report.models import TestReport from .models import StockItem, StockLocation, StockItemTracking, StockItemAttachment, StockItemTestResult import common.settings @@ -410,92 +409,6 @@ class StockItemTestResultDelete(AjaxDeleteView): role_required = 'stock.delete' -class StockItemTestReportSelect(AjaxView): - """ - View for selecting a TestReport template, - and generating a TestReport as a PDF. - """ - - model = StockItem - ajax_form_title = _("Select Test Report Template") - role_required = 'stock.view' - - def get_form(self): - - stock_item = StockItem.objects.get(pk=self.kwargs['pk']) - form = StockForms.TestReportFormatForm(stock_item) - - return form - - def get_initial(self): - - initials = super().get_initial() - - form = self.get_form() - options = form.fields['template'].queryset - - # If only a single template is available, pre-select it - if options.count() == 1: - initials['template'] = options[0] - - return initials - - def post(self, request, *args, **kwargs): - - template_id = request.POST.get('template', None) - - try: - template = TestReport.objects.get(pk=template_id) - except (ValueError, TestReport.DoesNoteExist): - raise ValidationError({'template': _("Select valid template")}) - - stock_item = StockItem.objects.get(pk=self.kwargs['pk']) - - url = reverse('stock-item-test-report-download') - - url += '?stock_item={id}'.format(id=stock_item.pk) - url += '&template={id}'.format(id=template.pk) - - data = { - 'form_valid': True, - 'url': url, - } - - return self.renderJsonResponse(request, self.get_form(), data=data) - - -class StockItemTestReportDownload(AjaxView): - """ - Download a TestReport against a StockItem. - - Requires the following arguments to be passed as URL params: - - stock_item - Valid PK of a StockItem object - template - Valid PK of a TestReport template object - - """ - role_required = 'stock.view' - - def get(self, request, *args, **kwargs): - - template = request.GET.get('template', None) - stock_item = request.GET.get('stock_item', None) - - try: - template = TestReport.objects.get(pk=template) - except (ValueError, TestReport.DoesNotExist): - raise ValidationError({'template': 'Invalid template ID'}) - - try: - stock_item = StockItem.objects.get(pk=stock_item) - except (ValueError, StockItem.DoesNotExist): - raise ValidationError({'stock_item': 'Invalid StockItem ID'}) - - template.stock_item = stock_item - - return template.render(request) - - class StockExportOptions(AjaxView): """ Form for selecting StockExport options """ diff --git a/InvenTree/templates/base.html b/InvenTree/templates/base.html index 36f4974816..f7ee1b2f19 100644 --- a/InvenTree/templates/base.html +++ b/InvenTree/templates/base.html @@ -121,6 +121,7 @@ InvenTree + diff --git a/InvenTree/templates/js/label.js b/InvenTree/templates/js/label.js index 93eb1c60c5..b62cbc9ef0 100644 --- a/InvenTree/templates/js/label.js +++ b/InvenTree/templates/js/label.js @@ -170,4 +170,4 @@ function selectLabel(labels, items, options={}) { options.success(pk); } }); -} \ No newline at end of file +} diff --git a/InvenTree/templates/js/report.js b/InvenTree/templates/js/report.js new file mode 100644 index 0000000000..3216e5dfe1 --- /dev/null +++ b/InvenTree/templates/js/report.js @@ -0,0 +1,124 @@ +{% load i18n %} + + +function selectTestReport(reports, items, options={}) { + /** + * Present the user with the available test reports, + * and allow them to select which test report to print. + * + * The intent is that the available report templates have been requested + * (via AJAX) from the server. + */ + + var modal = options.modal || '#modal-form'; + + var report_list = makeOptionsList( + reports, + function(item) { + var text = item.name; + + if (item.description) { + text += ` - ${item.description}`; + } + + return text; + }, + function(item) { + return item.pk; + } + ); + + // Construct form + var html = ` + +
+
+ +
+ +
+
+
`; + + openModal({ + modal: modal, + }); + + modalEnable(modal, true); + modalSetTitle(modal, '{% trans "Select Test Report Template" %}'); + modalSetContent(modal, html); + + attachSelect(modal); + + modalSubmit(modal, function() { + + var label = $(modal).find('#id_report'); + + var pk = label.val(); + + closeModal(modal); + + if (options.success) { + options.success(pk); + } + }); + +} + + +function printTestReports(items, options={}) { + /** + * Print test reports for the provided stock item(s) + */ + + if (items.length == 0) { + showAlertDialog( + '{% trans "Select Stock Items" %}', + '{% trans "Stock item(s) must be selected before printing reports" %}' + ); + + return; + } + + // Request available labels from the server + inventreeGet( + '{% url "api-stockitem-testreport-list" %}', + { + enabled: true, + items: items, + }, + { + success: function(response) { + if (response.length == 0) { + showAlertDialog( + '{% trans "No Reports Found" %}', + '{% trans "No report templates found which match selected stock item(s)" %}', + ); + + return; + } + + // Select report template to print + selectTestReport( + response, + items, + { + success: function(pk) { + var href = `/api/report/test/${pk}/print/?`; + + items.forEach(function(item) { + href += `items[]=${item}&`; + }); + + window.location.href = href; + } + } + ); + } + } + ); +} \ No newline at end of file