From 39e8b2af0f23847d0d90e42b642d26276f4066c4 Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 9 Mar 2022 12:43:27 +1100 Subject: [PATCH 1/3] Allow setting to be checked without being created - Prevents crash when trying to load exported dataset --- InvenTree/common/apps.py | 2 +- InvenTree/common/models.py | 30 +++++++++++++++++------------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/InvenTree/common/apps.py b/InvenTree/common/apps.py index 58d05c0391..a2253c1066 100644 --- a/InvenTree/common/apps.py +++ b/InvenTree/common/apps.py @@ -23,7 +23,7 @@ class CommonConfig(AppConfig): try: import common.models - if common.models.InvenTreeSetting.get_setting('SERVER_RESTART_REQUIRED'): + if common.models.InvenTreeSetting.get_setting('SERVER_RESTART_REQUIRED', backup_value=False, create=False): logger.info("Clearing SERVER_RESTART_REQUIRED flag") common.models.InvenTreeSetting.set_setting('SERVER_RESTART_REQUIRED', False, None) except: diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py index fe6ddecbba..a97b72e717 100644 --- a/InvenTree/common/models.py +++ b/InvenTree/common/models.py @@ -268,20 +268,24 @@ class BaseInvenTreeSetting(models.Model): # Setting does not exist! (Try to create it) if not setting: - # Attempt to create a new settings object - setting = cls( - key=key, - value=cls.get_setting_default(key, **kwargs), - **kwargs - ) + # Unless otherwise specified, attempt to create the setting + create = kwargs.get('create', True) - try: - # Wrap this statement in "atomic", so it can be rolled back if it fails - with transaction.atomic(): - setting.save() - except (IntegrityError, OperationalError): - # It might be the case that the database isn't created yet - pass + if create: + # Attempt to create a new settings object + setting = cls( + key=key, + value=cls.get_setting_default(key, **kwargs), + **kwargs + ) + + try: + # Wrap this statement in "atomic", so it can be rolled back if it fails + with transaction.atomic(): + setting.save() + except (IntegrityError, OperationalError): + # It might be the case that the database isn't created yet + pass return setting From 7986e0752dde40eddcebb03897d409ad11226262 Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 9 Mar 2022 13:03:38 +1100 Subject: [PATCH 2/3] Bug fix: Allocation quantity for "auto allocate" of tracked parts must be 1 --- InvenTree/build/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InvenTree/build/models.py b/InvenTree/build/models.py index e4a5013b7b..d58180356e 100644 --- a/InvenTree/build/models.py +++ b/InvenTree/build/models.py @@ -715,7 +715,7 @@ class Build(MPTTModel, ReferenceIndexingMixin): build=self, bom_item=bom_item, stock_item=stock_item, - quantity=quantity, + quantity=1, install_into=output, ) From 9f8f900e17207986a1ea2268e80ca8b297a63a95 Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 9 Mar 2022 13:14:04 +1100 Subject: [PATCH 3/3] Wrap server queries in onPanelLoad calls, to reduce initial page load time --- InvenTree/build/templates/build/detail.html | 429 ++++++++++---------- 1 file changed, 219 insertions(+), 210 deletions(-) diff --git a/InvenTree/build/templates/build/detail.html b/InvenTree/build/templates/build/detail.html index ca909f82f7..c789f56946 100644 --- a/InvenTree/build/templates/build/detail.html +++ b/InvenTree/build/templates/build/detail.html @@ -323,163 +323,72 @@ {% block js_ready %} {{ block.super }} -$('#btn-create-output').click(function() { +onPanelLoad('completed', function() { + loadStockTable($("#build-stock-table"), { + params: { + location_detail: true, + part_detail: true, + build: {{ build.id }}, + is_building: false, + }, + groupByField: 'location', + buttons: [ + '#stock-options', + ], + url: "{% url 'api-stock-list' %}", + }); +}); - createBuildOutput( - {{ build.pk }}, +onPanelLoad('children', function() { + loadBuildTable($('#sub-build-table'), { + url: '{% url "api-build-list" %}', + filterTarget: "#filter-list-sub-build", + params: { + ancestor: {{ build.pk }}, + } + }); +}); + +onPanelLoad('attachments', function() { + + enableDragAndDrop( + '#attachment-dropzone', + '{% url "api-build-attachment-list" %}', { - trackable_parts: {% if build.part.has_trackable_parts %}true{% else %}false{% endif%}, + data: { + build: {{ build.id }}, + }, + label: 'attachment', + success: function(data, status, xhr) { + location.reload(); + } } ); -}); -loadStockTable($("#build-stock-table"), { - params: { - location_detail: true, - part_detail: true, - build: {{ build.id }}, - is_building: false, - }, - groupByField: 'location', - buttons: [ - '#stock-options', - ], - url: "{% url 'api-stock-list' %}", -}); - - -// Get the list of BOM items required for this build -inventreeGet( - '{% url "api-bom-list" %}', - { - part: {{ build.part.pk }}, - sub_part_detail: true, - }, - { - success: function(response) { - - var build_info = { - pk: {{ build.pk }}, - part: {{ build.part.pk }}, - quantity: {{ build.quantity }}, - bom_items: response, - {% if build.take_from %} - source_location: {{ build.take_from.pk }}, - {% endif %} - {% if build.has_tracked_bom_items %} - tracked_parts: true, - {% else %} - tracked_parts: false, - {% endif %} - }; - - {% if build.active %} - loadBuildOutputTable(build_info); - linkButtonsToSelection( - '#build-output-table', - [ - '#output-options', - '#multi-output-complete', - '#multi-output-delete', - ] - ); - - $('#multi-output-complete').click(function() { - var outputs = $('#build-output-table').bootstrapTable('getSelections'); - - completeBuildOutputs( - build_info.pk, - outputs, - { - success: function() { - // Reload the "in progress" table - $('#build-output-table').bootstrapTable('refresh'); - - // Reload the "completed" table - $('#build-stock-table').bootstrapTable('refresh'); - } - } - ); - }); - - $('#multi-output-delete').click(function() { - var outputs = $('#build-output-table').bootstrapTable('getSelections'); - - deleteBuildOutputs( - build_info.pk, - outputs, - { - success: function() { - // Reload the "in progress" table - $('#build-output-table').bootstrapTable('refresh'); - - // Reload the "completed" table - $('#build-stock-table').bootstrapTable('refresh'); - } - } - ) - }); - - {% endif %} - - {% if build.active and build.has_untracked_bom_items %} - // Load allocation table for un-tracked parts - loadBuildOutputAllocationTable( - build_info, - null, - { - search: true, - } - ); - {% endif %} - } - } -); - -loadBuildTable($('#sub-build-table'), { - url: '{% url "api-build-list" %}', - filterTarget: "#filter-list-sub-build", - params: { - ancestor: {{ build.pk }}, - } -}); - - -enableDragAndDrop( - '#attachment-dropzone', - '{% url "api-build-attachment-list" %}', - { - data: { - build: {{ build.id }}, + loadAttachmentTable('{% url "api-build-attachment-list" %}', { + filters: { + build: {{ build.pk }}, }, - label: 'attachment', - success: function(data, status, xhr) { - location.reload(); - } - } -); - -loadAttachmentTable('{% url "api-build-attachment-list" %}', { - filters: { - build: {{ build.pk }}, - }, - fields: { - build: { - value: {{ build.pk }}, - hidden: true, - } - } -}); - -$('#edit-notes').click(function() { - constructForm('{% url "api-build-detail" build.pk %}', { fields: { - notes: { - multiline: true, + build: { + value: {{ build.pk }}, + hidden: true, } - }, - title: '{% trans "Edit Notes" %}', - reload: true, + } + }); +}); + +onPanelLoad('notes', function() { + $('#edit-notes').click(function() { + constructForm('{% url "api-build-detail" build.pk %}', { + fields: { + notes: { + multiline: true, + } + }, + title: '{% trans "Edit Notes" %}', + reload: true, + }); }); }); @@ -487,44 +396,174 @@ function reloadTable() { $('#allocation-table-untracked').bootstrapTable('refresh'); } -{% if build.active %} +onPanelLoad('allocate', function() { -$("#btn-auto-allocate").on('click', function() { - - autoAllocateStockToBuild( - {{ build.pk }}, - [], + // Get the list of BOM items required for this build + inventreeGet( + '{% url "api-bom-list" %}', { - {% if build.take_from %} - location: {{ build.take_from.pk }}, - {% endif %} + part: {{ build.part.pk }}, + sub_part_detail: true, + }, + { + success: function(response) { + + var build_info = { + pk: {{ build.pk }}, + part: {{ build.part.pk }}, + quantity: {{ build.quantity }}, + bom_items: response, + {% if build.take_from %} + source_location: {{ build.take_from.pk }}, + {% endif %} + {% if build.has_tracked_bom_items %} + tracked_parts: true, + {% else %} + tracked_parts: false, + {% endif %} + }; + + {% if build.active %} + loadBuildOutputTable(build_info); + linkButtonsToSelection( + '#build-output-table', + [ + '#output-options', + '#multi-output-complete', + '#multi-output-delete', + ] + ); + + $('#multi-output-complete').click(function() { + var outputs = $('#build-output-table').bootstrapTable('getSelections'); + + completeBuildOutputs( + build_info.pk, + outputs, + { + success: function() { + // Reload the "in progress" table + $('#build-output-table').bootstrapTable('refresh'); + + // Reload the "completed" table + $('#build-stock-table').bootstrapTable('refresh'); + } + } + ); + }); + + $('#multi-output-delete').click(function() { + var outputs = $('#build-output-table').bootstrapTable('getSelections'); + + deleteBuildOutputs( + build_info.pk, + outputs, + { + success: function() { + // Reload the "in progress" table + $('#build-output-table').bootstrapTable('refresh'); + + // Reload the "completed" table + $('#build-stock-table').bootstrapTable('refresh'); + } + } + ) + }); + + {% endif %} + + {% if build.active and build.has_untracked_bom_items %} + // Load allocation table for un-tracked parts + loadBuildOutputAllocationTable( + build_info, + null, + { + search: true, + } + ); + {% endif %} + } } ); -}); -$("#btn-allocate").on('click', function() { + $('#btn-create-output').click(function() { - var bom_items = $("#allocation-table-untracked").bootstrapTable("getData"); + createBuildOutput( + {{ build.pk }}, + { + trackable_parts: {% if build.part.has_trackable_parts %}true{% else %}false{% endif%}, + } + ); + }); - var incomplete_bom_items = []; + {% if build.active %} - bom_items.forEach(function(bom_item) { - if (bom_item.required > bom_item.allocated) { - incomplete_bom_items.push(bom_item); + $("#btn-auto-allocate").on('click', function() { + + autoAllocateStockToBuild( + {{ build.pk }}, + [], + { + {% if build.take_from %} + location: {{ build.take_from.pk }}, + {% endif %} + } + ); + }); + + $("#btn-allocate").on('click', function() { + + var bom_items = $("#allocation-table-untracked").bootstrapTable("getData"); + + var incomplete_bom_items = []; + + bom_items.forEach(function(bom_item) { + if (bom_item.required > bom_item.allocated) { + incomplete_bom_items.push(bom_item); + } + }); + + if (incomplete_bom_items.length == 0) { + showAlertDialog( + '{% trans "Allocation Complete" %}', + '{% trans "All untracked stock items have been allocated" %}', + ); + } else { + + allocateStockToBuild( + {{ build.pk }}, + {{ build.part.pk }}, + incomplete_bom_items, + { + {% if build.take_from %} + source_location: {{ build.take_from.pk }}, + {% endif %} + success: function(data) { + $('#allocation-table-untracked').bootstrapTable('refresh'); + } + } + ); } }); - if (incomplete_bom_items.length == 0) { - showAlertDialog( - '{% trans "Allocation Complete" %}', - '{% trans "All untracked stock items have been allocated" %}', - ); - } else { + $('#btn-unallocate').on('click', function() { + unallocateStock({{ build.id }}, { + table: '#allocation-table-untracked', + }); + }); + + $('#allocate-selected-items').click(function() { + + var bom_items = $("#allocation-table-untracked").bootstrapTable("getSelections"); + + if (bom_items.length == 0) { + bom_items = $("#allocation-table-untracked").bootstrapTable('getData'); + } allocateStockToBuild( {{ build.pk }}, {{ build.part.pk }}, - incomplete_bom_items, + bom_items, { {% if build.take_from %} source_location: {{ build.take_from.pk }}, @@ -534,49 +573,19 @@ $("#btn-allocate").on('click', function() { } } ); - } -}); - -$('#btn-unallocate').on('click', function() { - unallocateStock({{ build.id }}, { - table: '#allocation-table-untracked', }); -}); -$('#allocate-selected-items').click(function() { - - var bom_items = $("#allocation-table-untracked").bootstrapTable("getSelections"); - - if (bom_items.length == 0) { - bom_items = $("#allocation-table-untracked").bootstrapTable('getData'); - } - - allocateStockToBuild( - {{ build.pk }}, - {{ build.part.pk }}, - bom_items, - { - {% if build.take_from %} - source_location: {{ build.take_from.pk }}, - {% endif %} - success: function(data) { - $('#allocation-table-untracked').bootstrapTable('refresh'); - } - } - ); -}); - -$("#btn-order-parts").click(function() { - launchModalForm("/order/purchase-order/order-parts/", { - data: { - build: {{ build.id }}, - }, + $("#btn-order-parts").click(function() { + launchModalForm("/order/purchase-order/order-parts/", { + data: { + build: {{ build.id }}, + }, + }); }); -}); -{% endif %} + {% endif %} +}); enableSidebar('buildorder'); - {% endblock %} \ No newline at end of file