mirror of
https://github.com/inventree/InvenTree.git
synced 2025-07-09 15:10:54 +00:00
[bug] Build output fix (#9971)
* Wrap filter in list * Add unit test for auto_allocate functionality
This commit is contained in:
@ -949,9 +949,13 @@ class Build(
|
||||
|
||||
# Filter stock items to only those which are in stock
|
||||
# Note that we can accept "in production" items here
|
||||
available_items = filter(
|
||||
lambda item: item.is_in_stock(check_in_production=False),
|
||||
stock_items,
|
||||
available_items = list(
|
||||
filter(
|
||||
lambda item: item.is_in_stock(
|
||||
check_in_production=False
|
||||
),
|
||||
stock_items,
|
||||
)
|
||||
)
|
||||
|
||||
if len(available_items) == 1:
|
||||
|
@ -781,6 +781,79 @@ class BuildAllocationTest(BuildAPITest):
|
||||
expected_code=201,
|
||||
)
|
||||
|
||||
def test_auto_allocate(self):
|
||||
"""Test the allocation of tracked items against a Build."""
|
||||
N_BUILD_ITEMS = BuildItem.objects.count()
|
||||
|
||||
assembly = Part.objects.create(
|
||||
name='Test Assembly',
|
||||
description='Test Assembly Description',
|
||||
assembly=True,
|
||||
trackable=True,
|
||||
)
|
||||
|
||||
component = Part.objects.create(
|
||||
name='Test Component',
|
||||
description='Test Component Description',
|
||||
trackable=True,
|
||||
component=True,
|
||||
)
|
||||
|
||||
# Create a BOM item for the assembly
|
||||
BomItem.objects.create(part=assembly, sub_part=component, quantity=1)
|
||||
|
||||
# Create a build order for the assembly
|
||||
build = Build.objects.create(part=assembly, reference='BO-12347', quantity=10)
|
||||
|
||||
serials = [str(x) for x in range(100, 110)]
|
||||
|
||||
# Create serialized component items
|
||||
for sn in serials:
|
||||
StockItem.objects.create(part=component, quantity=1, serial=str(sn))
|
||||
|
||||
self.assertEqual(N_BUILD_ITEMS, BuildItem.objects.count())
|
||||
|
||||
# Generate build outputs via API
|
||||
url = reverse('api-build-output-create', kwargs={'pk': build.pk})
|
||||
|
||||
response = self.post(
|
||||
url,
|
||||
{
|
||||
'quantity': 10,
|
||||
'serial_numbers': ', '.join(serials),
|
||||
'auto_allocate': True,
|
||||
},
|
||||
expected_code=201,
|
||||
)
|
||||
|
||||
# 10 new build item objects should have been created
|
||||
self.assertEqual(N_BUILD_ITEMS + 10, BuildItem.objects.count())
|
||||
|
||||
self.assertEqual(len(response.data), 10)
|
||||
|
||||
# Check that the tracked items have been auto-allocated based on serial number
|
||||
for entry in response.data:
|
||||
self.assertIn(entry['serial'], serials)
|
||||
|
||||
# Find the matching output
|
||||
output = StockItem.objects.filter(
|
||||
part=assembly, serial=entry['serial']
|
||||
).first()
|
||||
|
||||
self.assertIsNotNone(output)
|
||||
|
||||
# Find the matching component
|
||||
c = StockItem.objects.filter(part=component, serial=entry['serial']).first()
|
||||
self.assertIsNotNone(c)
|
||||
|
||||
# Find the matching BuildItem object
|
||||
bi = BuildItem.objects.filter(
|
||||
stock_item=c, quantity=1, install_into=output
|
||||
).first()
|
||||
|
||||
self.assertIsNotNone(bi)
|
||||
self.assertEqual(bi.build, build)
|
||||
|
||||
|
||||
class BuildItemTest(BuildAPITest):
|
||||
"""Unit tests for build items.
|
||||
|
Reference in New Issue
Block a user