mirror of
https://github.com/inventree/InvenTree
synced 2024-08-30 18:33:04 +00:00
Merge pull request #2731 from SchrodingersGat/exclude-from-location
Add "exclude_location" to build order auto-allocation
This commit is contained in:
commit
7af302f08e
@ -12,11 +12,15 @@ import common.models
|
||||
INVENTREE_SW_VERSION = "0.7.0 dev"
|
||||
|
||||
# InvenTree API version
|
||||
INVENTREE_API_VERSION = 29
|
||||
INVENTREE_API_VERSION = 30
|
||||
|
||||
"""
|
||||
Increment this API version number whenever there is a significant change to the API that any clients need to know about
|
||||
|
||||
v30 -> 2022-03-09
|
||||
- Adds "exclude_location" field to BuildAutoAllocation API endpoint
|
||||
- Allows BuildItem API endpoint to be filtered by BomItem relation
|
||||
|
||||
v29 -> 2022-03-08
|
||||
- Adds "scheduling" endpoint for predicted stock scheduling information
|
||||
|
||||
|
@ -461,6 +461,7 @@ class BuildItemList(generics.ListCreateAPIView):
|
||||
filter_fields = [
|
||||
'build',
|
||||
'stock_item',
|
||||
'bom_item',
|
||||
'install_into',
|
||||
]
|
||||
|
||||
|
@ -842,6 +842,7 @@ class Build(MPTTModel, ReferenceIndexingMixin):
|
||||
"""
|
||||
|
||||
location = kwargs.get('location', None)
|
||||
exclude_location = kwargs.get('exclude_location', None)
|
||||
interchangeable = kwargs.get('interchangeable', False)
|
||||
substitutes = kwargs.get('substitutes', True)
|
||||
|
||||
@ -875,6 +876,11 @@ class Build(MPTTModel, ReferenceIndexingMixin):
|
||||
sublocations = location.get_descendants(include_self=True)
|
||||
available_stock = available_stock.filter(location__in=[loc for loc in sublocations])
|
||||
|
||||
if exclude_location:
|
||||
# Exclude any stock items from the provided location
|
||||
sublocations = exclude_location.get_descendants(include_self=True)
|
||||
available_stock = available_stock.exclude(location__in=[loc for loc in sublocations])
|
||||
|
||||
"""
|
||||
Next, we sort the available stock items with the following priority:
|
||||
1. Direct part matches (+1)
|
||||
|
@ -717,6 +717,7 @@ class BuildAutoAllocationSerializer(serializers.Serializer):
|
||||
class Meta:
|
||||
fields = [
|
||||
'location',
|
||||
'exclude_location',
|
||||
'interchangeable',
|
||||
'substitutes',
|
||||
]
|
||||
@ -730,6 +731,15 @@ class BuildAutoAllocationSerializer(serializers.Serializer):
|
||||
help_text=_('Stock location where parts are to be sourced (leave blank to take from any location)'),
|
||||
)
|
||||
|
||||
exclude_location = serializers.PrimaryKeyRelatedField(
|
||||
queryset=StockLocation.objects.all(),
|
||||
many=False,
|
||||
allow_null=True,
|
||||
required=False,
|
||||
label=_('Exclude Location'),
|
||||
help_text=_('Exclude stock items from this selected location'),
|
||||
)
|
||||
|
||||
interchangeable = serializers.BooleanField(
|
||||
default=False,
|
||||
label=_('Interchangeable Stock'),
|
||||
@ -750,6 +760,7 @@ class BuildAutoAllocationSerializer(serializers.Serializer):
|
||||
|
||||
build.auto_allocate_stock(
|
||||
location=data.get('location', None),
|
||||
exclude_location=data.get('exclude_location', None),
|
||||
interchangeable=data['interchangeable'],
|
||||
substitutes=data['substitutes'],
|
||||
)
|
||||
|
@ -1219,6 +1219,18 @@ function loadBuildOutputAllocationTable(buildInfo, output, options={}) {
|
||||
$(table).bootstrapTable('updateByUniqueId', key, tableRow, true);
|
||||
}
|
||||
|
||||
// Update any rows which we did not receive allocation information for
|
||||
var td = $(table).bootstrapTable('getData');
|
||||
|
||||
td.forEach(function(tableRow) {
|
||||
if (tableRow.allocations == null) {
|
||||
|
||||
tableRow.allocations = [];
|
||||
|
||||
$(table).bootstrapTable('updateByUniqueId', tableRow.pk, tableRow, true);
|
||||
}
|
||||
});
|
||||
|
||||
// Update the progress bar for this build output
|
||||
var build_progress = $(`#output-progress-${outputId}`);
|
||||
|
||||
@ -1419,15 +1431,17 @@ function loadBuildOutputAllocationTable(buildInfo, output, options={}) {
|
||||
formatter: function(value, row) {
|
||||
var allocated = 0;
|
||||
|
||||
if (row.allocations) {
|
||||
if (row.allocations != null) {
|
||||
row.allocations.forEach(function(item) {
|
||||
allocated += item.quantity;
|
||||
});
|
||||
|
||||
var required = requiredQuantity(row);
|
||||
|
||||
return makeProgressBar(allocated, required);
|
||||
} else {
|
||||
return `<em>{% trans "loading" %}...</em><span class='fas fa-spinner fa-spin float-right'></span>`;
|
||||
}
|
||||
|
||||
var required = requiredQuantity(row);
|
||||
|
||||
return makeProgressBar(allocated, required);
|
||||
},
|
||||
sorter: function(valA, valB, rowA, rowB) {
|
||||
// Custom sorting function for progress bars
|
||||
@ -1876,6 +1890,7 @@ function autoAllocateStockToBuild(build_id, bom_items=[], options={}) {
|
||||
location: {
|
||||
value: options.location,
|
||||
},
|
||||
exclude_location: {},
|
||||
interchangeable: {
|
||||
value: true,
|
||||
},
|
||||
|
Loading…
Reference in New Issue
Block a user