mirror of
https://github.com/inventree/InvenTree.git
synced 2025-07-02 19:50:59 +00:00
Migrate "Convert to Variant" form to the API (#3183)
* Adds a Part API filter to limit query to valid conversion options for the specified part * Refactor 'exclude_tree' filter to use django-filter framework * Refactor the 'ancestor' filter * Refactoring more API filtering fields: - variant_of - in_bom_for * Adds API endpoint / view / serializer for converting a StockItem to variant * stock item conversion now perfomed via the API * Bump API version * Add unit tests for new filtering option on the Part list API endpoint * Adds unit test for "convert" API endpoint functionality
This commit is contained in:
@ -702,6 +702,69 @@ class StockItemTest(StockAPITestCase):
|
||||
# The item is now in stock
|
||||
self.assertIsNone(item.customer)
|
||||
|
||||
def test_convert_to_variant(self):
|
||||
"""Test that we can convert a StockItem to a variant part via the API"""
|
||||
|
||||
category = part.models.PartCategory.objects.get(pk=3)
|
||||
|
||||
# First, construct a set of template / variant parts
|
||||
master_part = part.models.Part.objects.create(
|
||||
name='Master', description='Master part',
|
||||
category=category,
|
||||
is_template=True,
|
||||
)
|
||||
|
||||
variants = []
|
||||
|
||||
# Construct a set of variant parts
|
||||
for color in ['Red', 'Green', 'Blue', 'Yellow', 'Pink', 'Black']:
|
||||
variants.append(part.models.Part.objects.create(
|
||||
name=f"{color} Variant", description="Variant part with a specific color",
|
||||
variant_of=master_part,
|
||||
category=category,
|
||||
))
|
||||
|
||||
stock_item = StockItem.objects.create(
|
||||
part=master_part,
|
||||
quantity=1000,
|
||||
)
|
||||
|
||||
url = reverse('api-stock-item-convert', kwargs={'pk': stock_item.pk})
|
||||
|
||||
# Attempt to convert to a part which does not exist
|
||||
response = self.post(
|
||||
url,
|
||||
{
|
||||
'part': 999999,
|
||||
},
|
||||
expected_code=400,
|
||||
)
|
||||
|
||||
self.assertIn('object does not exist', str(response.data['part']))
|
||||
|
||||
# Attempt to convert to a part which is not a valid option
|
||||
response = self.post(
|
||||
url,
|
||||
{
|
||||
'part': 1,
|
||||
},
|
||||
expected_code=400
|
||||
)
|
||||
|
||||
self.assertIn('Selected part is not a valid option', str(response.data['part']))
|
||||
|
||||
for variant in variants:
|
||||
response = self.post(
|
||||
url,
|
||||
{
|
||||
'part': variant.pk,
|
||||
},
|
||||
expected_code=201,
|
||||
)
|
||||
|
||||
stock_item.refresh_from_db()
|
||||
self.assertEqual(stock_item.part, variant)
|
||||
|
||||
|
||||
class StocktakeTest(StockAPITestCase):
|
||||
"""Series of tests for the Stocktake API."""
|
||||
|
Reference in New Issue
Block a user