From e9650a94f38f0ff01fc4b0a37d17bf45e447a5cf Mon Sep 17 00:00:00 2001 From: sintech Date: Sun, 12 Dec 2021 19:57:30 +0300 Subject: [PATCH 01/14] Do not show icons for childless categories --- InvenTree/templates/js/dynamic/nav.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/InvenTree/templates/js/dynamic/nav.js b/InvenTree/templates/js/dynamic/nav.js index 28f9a26d8d..fc7e677900 100644 --- a/InvenTree/templates/js/dynamic/nav.js +++ b/InvenTree/templates/js/dynamic/nav.js @@ -175,7 +175,6 @@ function enableBreadcrumbTree(options) { for (var i = 0; i < data.length; i++) { node = data[i]; - node.nodes = []; nodes[node.pk] = node; node.selectable = false; @@ -193,7 +192,11 @@ function enableBreadcrumbTree(options) { node = data[i]; if (node.parent != null) { - nodes[node.parent].nodes.push(node); + if (nodes[node.parent].nodes) { + nodes[node.parent].nodes.push(node); + } else { + nodes[node.parent].nodes = [node]; + } if (node.state.expanded) { nodes[node.parent].state.expanded = true; From 40f73b00cefe7c1aabb3a147fed69480f8ed17e0 Mon Sep 17 00:00:00 2001 From: sintech Date: Sun, 12 Dec 2021 19:59:18 +0300 Subject: [PATCH 02/14] Propagate expanded state all the way to the root --- InvenTree/templates/js/dynamic/nav.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/InvenTree/templates/js/dynamic/nav.js b/InvenTree/templates/js/dynamic/nav.js index fc7e677900..b38dd17b32 100644 --- a/InvenTree/templates/js/dynamic/nav.js +++ b/InvenTree/templates/js/dynamic/nav.js @@ -199,7 +199,10 @@ function enableBreadcrumbTree(options) { } if (node.state.expanded) { - nodes[node.parent].state.expanded = true; + while (node.parent != null) { + nodes[node.parent].state.expanded = true; + node = nodes[node.parent] + } } } else { From d75ce451be171de7460334b60ef93f0065db0671 Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 22 Nov 2021 20:51:55 +1100 Subject: [PATCH 03/14] Allow user to select file format when downloadin BOM import template (cherry picked from commit 8030ca0bb9be0ce564d041b406f0024512f99000) --- .../part/bom_upload/upload_file.html | 8 +++- InvenTree/templates/js/translated/bom.js | 43 ++++++++++++++++--- 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/InvenTree/part/templates/part/bom_upload/upload_file.html b/InvenTree/part/templates/part/bom_upload/upload_file.html index 6775176ede..40411f074a 100644 --- a/InvenTree/part/templates/part/bom_upload/upload_file.html +++ b/InvenTree/part/templates/part/bom_upload/upload_file.html @@ -32,7 +32,7 @@
{% trans "Requirements for BOM upload" %}:
@@ -60,4 +60,8 @@ enableSidebar('bom-upload'); -{% endblock js_ready %} +$('#bom-template-download').click(function() { + downloadBomTemplate(); +}); + +{% endblock js_ready %} \ No newline at end of file diff --git a/InvenTree/templates/js/translated/bom.js b/InvenTree/templates/js/translated/bom.js index 3cde5bca61..29a958d452 100644 --- a/InvenTree/templates/js/translated/bom.js +++ b/InvenTree/templates/js/translated/bom.js @@ -2,6 +2,7 @@ /* globals constructForm, + exportFormatOptions, imageHoverIcon, inventreeGet, inventreePut, @@ -14,6 +15,7 @@ */ /* exported + downloadBomTemplate, newPartFromBomWizard, loadBomTable, loadUsedInTable, @@ -21,12 +23,41 @@ removeColFromBomWizard, */ -/* BOM management functions. - * Requires follwing files to be loaded first: - * - api.js - * - part.js - * - modals.js - */ +function downloadBomTemplate(options={}) { + + var format = options.format; + + if (!format) { + format = inventreeLoad('bom-export-format', 'csv'); + } + + constructFormBody({}, { + title: '{% trans "Download BOM Template" %}', + fields: { + format: { + label: '{% trans "Format" %}', + help_text: '{% trans "Select file format" %}', + required: true, + type: 'choice', + value: format, + choices: exportFormatOptions(), + } + }, + onSubmit: function(fields, opts) { + var format = getFormFieldValue('format', fields['format'], opts); + + // Save the format for next time + inventreeSave('bom-export-format', format); + + // Hide the modal + $(opts.modal).modal('hide'); + + // Download the file + location.href = `{% url "bom-upload-template" %}?format=${format}`; + + } + }); +} function bomItemFields() { From 88fc0393b73bd854e634d020f2fca0cef65bd9ed Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 22 Nov 2021 21:46:45 +1100 Subject: [PATCH 04/14] Logic fix for boolean fields in JS forms (cherry picked from commit 10dec7743e083ccffdd819b36b231189b26ca8d9) --- InvenTree/templates/js/translated/forms.js | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/InvenTree/templates/js/translated/forms.js b/InvenTree/templates/js/translated/forms.js index def7e41358..43e8d5ce62 100644 --- a/InvenTree/templates/js/translated/forms.js +++ b/InvenTree/templates/js/translated/forms.js @@ -811,7 +811,9 @@ function updateFieldValue(name, value, field, options) { switch (field.type) { case 'boolean': - el.prop('checked', value); + if (value == true || value.toString().toLowerCase() == 'true') { + el.prop('checked'); + } break; case 'related field': // Clear? @@ -2034,8 +2036,15 @@ function constructInputOptions(name, classes, type, parameters) { } if (parameters.value != null) { - // Existing value? - opts.push(`value='${parameters.value}'`); + if (parameters.type == 'boolean') { + // Special consideration of a boolean (checkbox) value + if (parameters.value == true || parameters.value.toString().toLowerCase() == 'true') { + opts.push('checked'); + } + } else { + // Existing value? + opts.push(`value='${parameters.value}'`); + } } else if (parameters.default != null) { // Otherwise, a defualt value? opts.push(`value='${parameters.default}'`); From 01ce752a8cd29df7d9c9d58f1d7d22e914247834 Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 22 Nov 2021 21:51:32 +1100 Subject: [PATCH 05/14] BOM export options are now han (cherry picked from commit c797eb07037237a6ce273d1783f99d43551f77de) --- InvenTree/part/forms.py | 30 --------- InvenTree/part/templates/part/detail.html | 8 +-- InvenTree/part/views.py | 4 -- InvenTree/templates/js/translated/bom.js | 81 +++++++++++++++++++++++ 4 files changed, 82 insertions(+), 41 deletions(-) diff --git a/InvenTree/part/forms.py b/InvenTree/part/forms.py index 609acec917..a5c4f87c89 100644 --- a/InvenTree/part/forms.py +++ b/InvenTree/part/forms.py @@ -55,36 +55,6 @@ class PartImageDownloadForm(HelperForm): ] -class BomExportForm(forms.Form): - """ Simple form to let user set BOM export options, - before exporting a BOM (bill of materials) file. - """ - - file_format = forms.ChoiceField(label=_("File Format"), help_text=_("Select output file format")) - - cascading = forms.BooleanField(label=_("Cascading"), required=False, initial=True, help_text=_("Download cascading / multi-level BOM")) - - levels = forms.IntegerField(label=_("Levels"), required=True, initial=0, help_text=_("Select maximum number of BOM levels to export (0 = all levels)")) - - parameter_data = forms.BooleanField(label=_("Include Parameter Data"), required=False, initial=False, help_text=_("Include part parameters data in exported BOM")) - - stock_data = forms.BooleanField(label=_("Include Stock Data"), required=False, initial=False, help_text=_("Include part stock data in exported BOM")) - - manufacturer_data = forms.BooleanField(label=_("Include Manufacturer Data"), required=False, initial=True, help_text=_("Include part manufacturer data in exported BOM")) - - supplier_data = forms.BooleanField(label=_("Include Supplier Data"), required=False, initial=True, help_text=_("Include part supplier data in exported BOM")) - - def get_choices(self): - """ BOM export format choices """ - - return [(x, x.upper()) for x in GetExportFormats()] - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - self.fields['file_format'].choices = self.get_choices() - - class BomDuplicateForm(HelperForm): """ Simple confirmation form for BOM duplication. diff --git a/InvenTree/part/templates/part/detail.html b/InvenTree/part/templates/part/detail.html index f1b47bc4e2..d16de22e1b 100644 --- a/InvenTree/part/templates/part/detail.html +++ b/InvenTree/part/templates/part/detail.html @@ -620,13 +620,7 @@ }); $("#download-bom").click(function () { - launchModalForm("{% url 'bom-export' part.id %}", - { - success: function(response) { - location.href = response.url; - }, - } - ); + exportBom({{ part.id }}); }); {% if report_enabled %} diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index 6e742dc571..af35cf9c1f 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -1192,14 +1192,10 @@ class BomExport(AjaxView): """ model = Part - form_class = part_forms.BomExportForm ajax_form_title = _("Export Bill of Materials") role_required = 'part.view' - def get(self, request, *args, **kwargs): - return self.renderJsonResponse(request, self.form_class()) - def post(self, request, *args, **kwargs): # Extract POSTed form data diff --git a/InvenTree/templates/js/translated/bom.js b/InvenTree/templates/js/translated/bom.js index 29a958d452..f345db6976 100644 --- a/InvenTree/templates/js/translated/bom.js +++ b/InvenTree/templates/js/translated/bom.js @@ -16,6 +16,7 @@ /* exported downloadBomTemplate, + exportBom, newPartFromBomWizard, loadBomTable, loadUsedInTable, @@ -60,6 +61,86 @@ function downloadBomTemplate(options={}) { } +/** + * Export BOM (Bill of Materials) for the specified Part instance + */ +function exportBom(part_id, options={}) { + + constructFormBody({}, { + title: '{% trans "Export BOM" %}', + fields: { + format: { + label: '{% trans "Format" %}', + help_text: '{% trans "Select file format" %}', + required: true, + type: 'choice', + value: inventreeLoad('bom-export-format', 'csv'), + choices: exportFormatOptions(), + }, + cascading: { + label: '{% trans "Cascading" %}', + help_text: '{% trans "Download cascading / mmulti-level BOM" %}', + type: 'boolean', + value: inventreeLoad('bom-export-cascading', true), + }, + levels: { + label: '{% trans "Levels" %}', + help_text: '{% trans "Select maximum number of BOM levels to export (0 = all levels)" %}', + type: 'integer', + value: 0, + min_value: 0, + }, + parameter_data: { + label: '{% trans "Include Parameter Data" %}', + help_text: '{% trans "Include part parameter data in exported BOM" %}', + type: 'boolean', + value: inventreeLoad('bom-export-parameter_data', false), + }, + stock_data: { + label: '{% trans "Include Stock Data" %}', + help_text: '{% trans "Include part stock data in exported BOM" %}', + type: 'boolean', + value: inventreeLoad('bom-export-stock_data', false), + }, + manufacturer_data: { + label: '{% trans "Include Manufacturer Data" %}', + help_text: '{% trans "Include part manufacturer data in exported BOM" %}', + type: 'boolean', + value: inventreeLoad('bom-export-manufacturer_data', false), + }, + supplier_data: { + label: '{% trans "Include Supplier Data" %}', + help_text: '{% trans "Include part supplier data in exported BOM" %}', + type: 'boolean', + value: inventreeLoad('bom-export-supplier_data', false), + } + }, + onSubmit: function(fields, opts) { + + // Extract values from the form + var field_names = ['format', 'cascading', 'levels', 'parameter_data', 'stock_data', 'manufacturer_data', 'supplier_data']; + + var url = `/part/${part_id}/bom-download/?`; + + field_names.forEach(function(fn) { + var val = getFormFieldValue(fn, fields[fn], opts); + + // Update user preferences + inventreeSave(`bom-export-${fn}`, val); + + url += `${fn}=${val}&`; + }); + + $(opts.modal).modal('hide'); + + // Redirect to the BOM file download + location.href = url; + } + }); + +} + + function bomItemFields() { return { From 922b8b1c3078f599db00db5f3ad415589f1baad6 Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 22 Nov 2021 22:17:13 +1100 Subject: [PATCH 06/14] Fix typo (cherry picked from commit 673a5779f9dd08aee3b821104e8c4bec3c83280e) --- InvenTree/templates/js/translated/bom.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InvenTree/templates/js/translated/bom.js b/InvenTree/templates/js/translated/bom.js index f345db6976..ffd8195e07 100644 --- a/InvenTree/templates/js/translated/bom.js +++ b/InvenTree/templates/js/translated/bom.js @@ -79,7 +79,7 @@ function exportBom(part_id, options={}) { }, cascading: { label: '{% trans "Cascading" %}', - help_text: '{% trans "Download cascading / mmulti-level BOM" %}', + help_text: '{% trans "Download cascading / multi-level BOM" %}', type: 'boolean', value: inventreeLoad('bom-export-cascading', true), }, From 36026a9217bdbfe73fa0b71309f8af1175a34d27 Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 13 Dec 2021 23:15:06 +1100 Subject: [PATCH 07/14] PEP fixes --- InvenTree/part/forms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InvenTree/part/forms.py b/InvenTree/part/forms.py index a5c4f87c89..2d9ae4dc30 100644 --- a/InvenTree/part/forms.py +++ b/InvenTree/part/forms.py @@ -11,7 +11,7 @@ from django.utils.translation import ugettext_lazy as _ from mptt.fields import TreeNodeChoiceField from InvenTree.forms import HelperForm -from InvenTree.helpers import GetExportFormats, clean_decimal +from InvenTree.helpers import clean_decimal from InvenTree.fields import RoundingDecimalFormField import common.models From 8d4f8204ca6f7551268728b3101a9f021fce46cf Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 13 Dec 2021 23:48:30 +1100 Subject: [PATCH 08/14] call apt-get update in workflow scripts --- .github/workflows/qc_checks.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/qc_checks.yaml b/.github/workflows/qc_checks.yaml index 929a299e93..04489e360d 100644 --- a/.github/workflows/qc_checks.yaml +++ b/.github/workflows/qc_checks.yaml @@ -229,6 +229,7 @@ jobs: cache: 'pip' - name: Install Dependencies run: | + sudo apt-get update sudo apt-get install libpq-dev pip3 install invoke pip3 install psycopg2 @@ -282,6 +283,7 @@ jobs: cache: 'pip' - name: Install Dependencies run: | + sudo apt-get update sudo apt-get install mysql-server libmysqlclient-dev pip3 install invoke pip3 install mysqlclient From b6d9bc30931b462392b564cdf4ebedc84e519de8 Mon Sep 17 00:00:00 2001 From: sintech Date: Mon, 13 Dec 2021 15:51:34 +0300 Subject: [PATCH 09/14] Remove treeview state saving. --- InvenTree/templates/js/dynamic/nav.js | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/InvenTree/templates/js/dynamic/nav.js b/InvenTree/templates/js/dynamic/nav.js index b38dd17b32..03ed946677 100644 --- a/InvenTree/templates/js/dynamic/nav.js +++ b/InvenTree/templates/js/dynamic/nav.js @@ -218,7 +218,6 @@ function enableBreadcrumbTree(options) { collapseIcon: 'fa fa-chevron-down', }); - setBreadcrumbTreeState(label, state); } } ); @@ -226,26 +225,11 @@ function enableBreadcrumbTree(options) { $('#breadcrumb-tree-toggle').click(function() { // Add callback to "collapse" and "expand" the sidebar - // By default, the menu is "expanded" - var state = localStorage.getItem(`inventree-tree-state-${label}`) || 'expanded'; + // Toggle treeview visibilty + $('#breadcrumb-tree-collapse').toggle(); - // We wish to "toggle" the state! - setBreadcrumbTreeState(label, state == 'expanded' ? 'collapsed' : 'expanded'); }); - // Set the initial state (default = expanded) - var state = localStorage.getItem(`inventree-tree-state-${label}`) || 'expanded'; - - function setBreadcrumbTreeState(label, state) { - - if (state == 'collapsed') { - $('#breadcrumb-tree-collapse').hide(100); - } else { - $('#breadcrumb-tree-collapse').show(100); - } - - localStorage.setItem(`inventree-tree-state-${label}`, state); - } } /* From 967584b25a7fc4a8935c61a3a95abbbefdc9d1e2 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 14 Dec 2021 17:35:36 +1100 Subject: [PATCH 10/14] Specify mysql version --- .github/workflows/qc_checks.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/qc_checks.yaml b/.github/workflows/qc_checks.yaml index 04489e360d..41b00a785a 100644 --- a/.github/workflows/qc_checks.yaml +++ b/.github/workflows/qc_checks.yaml @@ -284,7 +284,7 @@ jobs: - name: Install Dependencies run: | sudo apt-get update - sudo apt-get install mysql-server libmysqlclient-dev + sudo apt-get install mysql-server-8.0 mysql-client-8.0 libmysqlclient-dev pip3 install invoke pip3 install mysqlclient invoke install From 58364bb3b537638fce4047f234b29d5f67c735ea Mon Sep 17 00:00:00 2001 From: sintech Date: Tue, 14 Dec 2021 11:30:09 +0300 Subject: [PATCH 11/14] JS style fix --- InvenTree/templates/js/dynamic/nav.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/InvenTree/templates/js/dynamic/nav.js b/InvenTree/templates/js/dynamic/nav.js index 03ed946677..eed098f162 100644 --- a/InvenTree/templates/js/dynamic/nav.js +++ b/InvenTree/templates/js/dynamic/nav.js @@ -192,17 +192,17 @@ function enableBreadcrumbTree(options) { node = data[i]; if (node.parent != null) { - if (nodes[node.parent].nodes) { - nodes[node.parent].nodes.push(node); - } else { - nodes[node.parent].nodes = [node]; - } + if (nodes[node.parent].nodes) { + nodes[node.parent].nodes.push(node); + } else { + nodes[node.parent].nodes = [node]; + } if (node.state.expanded) { - while (node.parent != null) { - nodes[node.parent].state.expanded = true; - node = nodes[node.parent] - } + while (node.parent != null) { + nodes[node.parent].state.expanded = true; + node = nodes[node.parent]; + } } } else { @@ -226,7 +226,7 @@ function enableBreadcrumbTree(options) { // Add callback to "collapse" and "expand" the sidebar // Toggle treeview visibilty - $('#breadcrumb-tree-collapse').toggle(); + $('#breadcrumb-tree-collapse').toggle(); }); From a9d09c7d2981d2bec8523ebb178ba57463d2c746 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 14 Dec 2021 19:56:34 +1100 Subject: [PATCH 12/14] Fix mysql installs for github actions --- .github/workflows/qc_checks.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/qc_checks.yaml b/.github/workflows/qc_checks.yaml index 41b00a785a..ba7a64f6d4 100644 --- a/.github/workflows/qc_checks.yaml +++ b/.github/workflows/qc_checks.yaml @@ -284,9 +284,9 @@ jobs: - name: Install Dependencies run: | sudo apt-get update - sudo apt-get install mysql-server-8.0 mysql-client-8.0 libmysqlclient-dev + sudo apt-get install mysql-server-8.0 mysql-client-8.0 default-libmysqlclient-dev pip3 install invoke - pip3 install mysqlclient + pip3 install mysqlclient==2.1.0 invoke install - name: Run Tests run: invoke test From 070d01b2f41e297daa22435a2b6be9bd6ab08e55 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 14 Dec 2021 22:48:44 +1100 Subject: [PATCH 13/14] Try with newer python --- .github/workflows/qc_checks.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/qc_checks.yaml b/.github/workflows/qc_checks.yaml index ba7a64f6d4..e0f4af3739 100644 --- a/.github/workflows/qc_checks.yaml +++ b/.github/workflows/qc_checks.yaml @@ -12,7 +12,7 @@ on: - l10* env: - python_version: 3.7 + python_version: 3.8 node_version: 16 server_start_sleep: 60 @@ -284,9 +284,9 @@ jobs: - name: Install Dependencies run: | sudo apt-get update - sudo apt-get install mysql-server-8.0 mysql-client-8.0 default-libmysqlclient-dev + sudo apt-get install mysql-server default-libmysqlclient-dev pip3 install invoke - pip3 install mysqlclient==2.1.0 + pip3 install mysqlclient invoke install - name: Run Tests run: invoke test From 4805540b4cd005b18f1936edc2dc6775e6792d9d Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 14 Dec 2021 22:52:14 +1100 Subject: [PATCH 14/14] try simplifying --- .github/workflows/qc_checks.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/qc_checks.yaml b/.github/workflows/qc_checks.yaml index e0f4af3739..598f518f27 100644 --- a/.github/workflows/qc_checks.yaml +++ b/.github/workflows/qc_checks.yaml @@ -284,7 +284,7 @@ jobs: - name: Install Dependencies run: | sudo apt-get update - sudo apt-get install mysql-server default-libmysqlclient-dev + sudo apt-get install libmysqlclient-dev pip3 install invoke pip3 install mysqlclient invoke install