mirror of
https://github.com/inventree/InvenTree
synced 2024-08-30 18:33:04 +00:00
Merge pull request #2727 from SchrodingersGat/build-allocation-load-speed
Bug fixes for build output creation
This commit is contained in:
commit
dd5cda281e
@ -715,7 +715,7 @@ class Build(MPTTModel, ReferenceIndexingMixin):
|
|||||||
build=self,
|
build=self,
|
||||||
bom_item=bom_item,
|
bom_item=bom_item,
|
||||||
stock_item=stock_item,
|
stock_item=stock_item,
|
||||||
quantity=quantity,
|
quantity=1,
|
||||||
install_into=output,
|
install_into=output,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -323,163 +323,72 @@
|
|||||||
{% block js_ready %}
|
{% block js_ready %}
|
||||||
{{ block.super }}
|
{{ 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(
|
onPanelLoad('children', function() {
|
||||||
{{ build.pk }},
|
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"), {
|
loadAttachmentTable('{% url "api-build-attachment-list" %}', {
|
||||||
params: {
|
filters: {
|
||||||
location_detail: true,
|
build: {{ build.pk }},
|
||||||
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 }},
|
|
||||||
},
|
},
|
||||||
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: {
|
fields: {
|
||||||
notes: {
|
build: {
|
||||||
multiline: true,
|
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');
|
$('#allocation-table-untracked').bootstrapTable('refresh');
|
||||||
}
|
}
|
||||||
|
|
||||||
{% if build.active %}
|
onPanelLoad('allocate', function() {
|
||||||
|
|
||||||
$("#btn-auto-allocate").on('click', function() {
|
// Get the list of BOM items required for this build
|
||||||
|
inventreeGet(
|
||||||
autoAllocateStockToBuild(
|
'{% url "api-bom-list" %}',
|
||||||
{{ build.pk }},
|
|
||||||
[],
|
|
||||||
{
|
{
|
||||||
{% if build.take_from %}
|
part: {{ build.part.pk }},
|
||||||
location: {{ build.take_from.pk }},
|
sub_part_detail: true,
|
||||||
{% endif %}
|
},
|
||||||
|
{
|
||||||
|
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) {
|
$("#btn-auto-allocate").on('click', function() {
|
||||||
if (bom_item.required > bom_item.allocated) {
|
|
||||||
incomplete_bom_items.push(bom_item);
|
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) {
|
$('#btn-unallocate').on('click', function() {
|
||||||
showAlertDialog(
|
unallocateStock({{ build.id }}, {
|
||||||
'{% trans "Allocation Complete" %}',
|
table: '#allocation-table-untracked',
|
||||||
'{% trans "All untracked stock items have been allocated" %}',
|
});
|
||||||
);
|
});
|
||||||
} else {
|
|
||||||
|
$('#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(
|
allocateStockToBuild(
|
||||||
{{ build.pk }},
|
{{ build.pk }},
|
||||||
{{ build.part.pk }},
|
{{ build.part.pk }},
|
||||||
incomplete_bom_items,
|
bom_items,
|
||||||
{
|
{
|
||||||
{% if build.take_from %}
|
{% if build.take_from %}
|
||||||
source_location: {{ build.take_from.pk }},
|
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() {
|
$("#btn-order-parts").click(function() {
|
||||||
|
launchModalForm("/order/purchase-order/order-parts/", {
|
||||||
var bom_items = $("#allocation-table-untracked").bootstrapTable("getSelections");
|
data: {
|
||||||
|
build: {{ build.id }},
|
||||||
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 }},
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
});
|
||||||
|
|
||||||
enableSidebar('buildorder');
|
enableSidebar('buildorder');
|
||||||
|
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
@ -23,7 +23,7 @@ class CommonConfig(AppConfig):
|
|||||||
try:
|
try:
|
||||||
import common.models
|
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")
|
logger.info("Clearing SERVER_RESTART_REQUIRED flag")
|
||||||
common.models.InvenTreeSetting.set_setting('SERVER_RESTART_REQUIRED', False, None)
|
common.models.InvenTreeSetting.set_setting('SERVER_RESTART_REQUIRED', False, None)
|
||||||
except:
|
except:
|
||||||
|
@ -268,20 +268,24 @@ class BaseInvenTreeSetting(models.Model):
|
|||||||
# Setting does not exist! (Try to create it)
|
# Setting does not exist! (Try to create it)
|
||||||
if not setting:
|
if not setting:
|
||||||
|
|
||||||
# Attempt to create a new settings object
|
# Unless otherwise specified, attempt to create the setting
|
||||||
setting = cls(
|
create = kwargs.get('create', True)
|
||||||
key=key,
|
|
||||||
value=cls.get_setting_default(key, **kwargs),
|
|
||||||
**kwargs
|
|
||||||
)
|
|
||||||
|
|
||||||
try:
|
if create:
|
||||||
# Wrap this statement in "atomic", so it can be rolled back if it fails
|
# Attempt to create a new settings object
|
||||||
with transaction.atomic():
|
setting = cls(
|
||||||
setting.save()
|
key=key,
|
||||||
except (IntegrityError, OperationalError):
|
value=cls.get_setting_default(key, **kwargs),
|
||||||
# It might be the case that the database isn't created yet
|
**kwargs
|
||||||
pass
|
)
|
||||||
|
|
||||||
|
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
|
return setting
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user