mirror of
https://github.com/inventree/InvenTree.git
synced 2025-06-19 05:25:42 +00:00
Merge branch 'master' into scheduling
This commit is contained in:
@ -1453,7 +1453,9 @@ class Part(MPTTModel):
|
||||
By default, will include inherited BOM items
|
||||
"""
|
||||
|
||||
return BomItem.objects.filter(self.get_bom_item_filter(include_inherited=include_inherited))
|
||||
queryset = BomItem.objects.filter(self.get_bom_item_filter(include_inherited=include_inherited))
|
||||
|
||||
return queryset.prefetch_related('sub_part')
|
||||
|
||||
def get_installed_part_options(self, include_inherited=True, include_variants=True):
|
||||
"""
|
||||
@ -1906,6 +1908,9 @@ class Part(MPTTModel):
|
||||
|
||||
include_inherited = kwargs.get('include_inherited', False)
|
||||
|
||||
# Should substitute parts be duplicated?
|
||||
copy_substitutes = kwargs.get('copy_substitutes', True)
|
||||
|
||||
# Copy existing BOM items from another part
|
||||
# Note: Inherited BOM Items will *not* be duplicated!!
|
||||
for bom_item in other.get_bom_items(include_inherited=include_inherited).all():
|
||||
@ -1928,11 +1933,22 @@ class Part(MPTTModel):
|
||||
if not bom_item.sub_part.check_add_to_bom(self, raise_error=raise_error):
|
||||
continue
|
||||
|
||||
# Obtain a list of direct substitute parts against this BomItem
|
||||
substitutes = BomItemSubstitute.objects.filter(bom_item=bom_item)
|
||||
|
||||
# Construct a new BOM item
|
||||
bom_item.part = self
|
||||
bom_item.pk = None
|
||||
|
||||
bom_item.save()
|
||||
bom_item.refresh_from_db()
|
||||
|
||||
if copy_substitutes:
|
||||
for sub in substitutes:
|
||||
# Duplicate the substitute (and point to the *new* BomItem object)
|
||||
sub.pk = None
|
||||
sub.bom_item = bom_item
|
||||
sub.save()
|
||||
|
||||
@transaction.atomic
|
||||
def copy_parameters_from(self, other, **kwargs):
|
||||
|
@ -656,6 +656,9 @@ class PartCopyBOMSerializer(serializers.Serializer):
|
||||
fields = [
|
||||
'part',
|
||||
'remove_existing',
|
||||
'copy_substitutes',
|
||||
'include_inherited',
|
||||
'skip_invalid',
|
||||
]
|
||||
|
||||
part = serializers.PrimaryKeyRelatedField(
|
||||
@ -692,6 +695,12 @@ class PartCopyBOMSerializer(serializers.Serializer):
|
||||
default=False,
|
||||
)
|
||||
|
||||
copy_substitutes = serializers.BooleanField(
|
||||
label=_('Copy Substitute Parts'),
|
||||
help_text=_('Copy substitute parts when duplicate BOM items'),
|
||||
default=True,
|
||||
)
|
||||
|
||||
def save(self):
|
||||
"""
|
||||
Actually duplicate the BOM
|
||||
@ -706,6 +715,7 @@ class PartCopyBOMSerializer(serializers.Serializer):
|
||||
clear=data.get('remove_existing', True),
|
||||
skip_invalid=data.get('skip_invalid', False),
|
||||
include_inherited=data.get('include_inherited', False),
|
||||
copy_substitutes=data.get('copy_substitutes', True),
|
||||
)
|
||||
|
||||
|
||||
|
@ -137,7 +137,13 @@
|
||||
<h4>{% trans "Sales Order Allocations" %}</h4>
|
||||
</div>
|
||||
<div class='panel-content'>
|
||||
<table class='table table-striped table-condensed' id='sales-order-allocation-table'></table>
|
||||
|
||||
<div id='sales-order-allocation-button-toolbar'>
|
||||
<div class='btn-group' role='group'>
|
||||
{% include "filter_list.html" with id="salesorderallocation" %}
|
||||
</div>
|
||||
</div>
|
||||
<table class='table table-striped table-condensed' id='sales-order-allocation-table' data-toolbar='#sales-order-allocation-button-toolbar'></table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -357,7 +363,12 @@
|
||||
<h4>{% trans "Build Order Allocations" %}</h4>
|
||||
</div>
|
||||
<div class='panel-content'>
|
||||
<table class='table table-striped table-condensed' id='build-order-allocation-table'></table>
|
||||
<div id='build-allocation-button-toolbar'>
|
||||
<div class='btn-group' role='group'>
|
||||
{% include "filter_list.html" with id="buildorderallocation" %}
|
||||
</div>
|
||||
</div>
|
||||
<table class='table table-striped table-condensed' id='build-order-allocation-table' data-toolbar='#build-allocation-button-toolbar'></table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -742,6 +753,7 @@
|
||||
});
|
||||
|
||||
// Load the BOM table data in the pricing view
|
||||
{% if part.has_bom and roles.sales_order.view %}
|
||||
loadBomTable($("#bom-pricing-table"), {
|
||||
editable: false,
|
||||
bom_url: "{% url 'api-bom-list' %}",
|
||||
@ -749,6 +761,7 @@
|
||||
parent_id: {{ part.id }} ,
|
||||
sub_part_detail: true,
|
||||
});
|
||||
{% endif %}
|
||||
|
||||
onPanelLoad("purchase-orders", function() {
|
||||
loadPartPurchaseOrderTable(
|
||||
|
@ -59,13 +59,13 @@
|
||||
<ul class='dropdown-menu'>
|
||||
<li>
|
||||
<a class='dropdown-item' href='#' id='part-count'>
|
||||
<span class='fas fa-clipboard-list'></span>
|
||||
<span class='fas fa-check-circle icon-green'></span>
|
||||
{% trans "Count part stock" %}
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class='dropdown-item' href='#' id='part-move'>
|
||||
<span class='fas fa-exchange-alt'></span>
|
||||
<span class='fas fa-exchange-alt icon-blue'></span>
|
||||
{% trans "Transfer part stock" %}
|
||||
</a>
|
||||
</li>
|
||||
|
Reference in New Issue
Block a user