mirror of
https://github.com/inventree/InvenTree
synced 2024-08-30 18:33:04 +00:00
More intelligent BuildItem allocation
- Set initial value for quantity based on how many parts are left to allocate - Auto select the StockItem to take from (if there is only one)
This commit is contained in:
parent
e58bed41b0
commit
4f84febbd1
@ -13,9 +13,11 @@ from django.core.exceptions import ValidationError
|
||||
|
||||
from django.urls import reverse
|
||||
from django.db import models, transaction
|
||||
from django.db.models import Sum
|
||||
from django.core.validators import MinValueValidator
|
||||
|
||||
from stock.models import StockItem
|
||||
from part.models import BomItem
|
||||
|
||||
|
||||
class Build(models.Model):
|
||||
@ -219,6 +221,38 @@ class Build(models.Model):
|
||||
self.status = self.COMPLETE
|
||||
self.save()
|
||||
|
||||
def getAllocatedQuantity(self, part):
|
||||
""" Calculate the total number of <part> currently allocated to this build
|
||||
"""
|
||||
|
||||
allocated = BuildItem.objects.filter(build=self.id, stock_item__part=part.id).aggregate(Sum('quantity'))
|
||||
|
||||
q = allocated['quantity__sum']
|
||||
|
||||
if q:
|
||||
return int(q)
|
||||
else:
|
||||
return 0
|
||||
|
||||
def getUnallocatedQuantity(self, part):
|
||||
""" Calculate the quantity of <part> which still needs to be allocated to this build.
|
||||
|
||||
Args:
|
||||
Part - the part to be tested
|
||||
|
||||
Returns:
|
||||
The remaining allocated quantity
|
||||
"""
|
||||
|
||||
try:
|
||||
bom_item = BomItem.objects.get(part=self.part.id, sub_part=part.id)
|
||||
except BomItem.DoesNotExist:
|
||||
return 0
|
||||
|
||||
quantity = bom_item.quantity * self.quantity
|
||||
|
||||
return quantity - self.getAllocatedQuantity(part)
|
||||
|
||||
@property
|
||||
def required_parts(self):
|
||||
""" Returns a dict of parts required to build this part (BOM) """
|
||||
|
@ -289,6 +289,12 @@ class BuildItemCreate(AjaxCreateView):
|
||||
query = query.exclude(id__in=[item.stock_item.id for item in BuildItem.objects.filter(build=build_id, stock_item__part=part_id)])
|
||||
|
||||
form.fields['stock_item'].queryset = query
|
||||
|
||||
stocks = query.all()
|
||||
# If there is only one item selected, select it
|
||||
if len(stocks) == 1:
|
||||
form.fields['stock_item'].initial = stocks[0].id
|
||||
|
||||
except Part.DoesNotExist:
|
||||
pass
|
||||
|
||||
@ -303,10 +309,23 @@ class BuildItemCreate(AjaxCreateView):
|
||||
initials = super(AjaxCreateView, self).get_initial().copy()
|
||||
|
||||
build_id = self.get_param('build')
|
||||
part_id = self.get_param('part')
|
||||
|
||||
if part_id:
|
||||
try:
|
||||
part = Part.objects.get(pk=part_id)
|
||||
except Part.DoesNotExist:
|
||||
part = None
|
||||
|
||||
if build_id:
|
||||
try:
|
||||
initials['build'] = Build.objects.get(pk=build_id)
|
||||
build = Build.objects.get(pk=build_id)
|
||||
initials['build'] = build
|
||||
|
||||
# Try to work out how many parts to allocate
|
||||
if part:
|
||||
initials['quantity'] = build.getUnallocatedQuantity(part)
|
||||
|
||||
except Build.DoesNotExist:
|
||||
pass
|
||||
|
||||
|
@ -14,6 +14,9 @@
|
||||
|
||||
|
||||
{% crispy form %}
|
||||
|
||||
{% block form_data %}
|
||||
{% endblock %}
|
||||
</form>
|
||||
|
||||
{% block post_form_content %}
|
||||
|
Loading…
Reference in New Issue
Block a user