From 47b9a354878b5e04a4c4fac2418c1e8c61ef45be Mon Sep 17 00:00:00 2001 From: Joe Rogers <1337joe@gmail.com> Date: Tue, 22 Jul 2025 23:04:23 -0400 Subject: [PATCH 1/2] Add test for creating multiple StockItems at once --- test/test_stock.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/test/test_stock.py b/test/test_stock.py index 25811451..ca852af5 100644 --- a/test/test_stock.py +++ b/test/test_stock.py @@ -248,6 +248,25 @@ def test_barcode_support(self): item.unassignBarcode() + def test_serialized(self): + """Test serializing multiple objects on create""" + + # Create items with serial numbers + items = StockItem.create( + self.api, + { + "part": 10004, + "quantity": 3, + "serial_numbers": "1005,1006,1007" + } + ) + + self.assertEqual(3, len(items)) + + self.assertEqual('1005', items[0].serial) + self.assertEqual('1006', items[1].serial) + self.assertEqual('1007', items[2].serial) + class StockAdjustTest(InvenTreeTestCase): """Unit tests for stock 'adjustment' actions""" From 260de070eb2d88736f48f77d74886efe8c65aaca Mon Sep 17 00:00:00 2001 From: Joe Rogers <1337joe@gmail.com> Date: Tue, 8 Jul 2025 23:37:51 -0400 Subject: [PATCH 2/2] Override StockItem create to accept list of results --- inventree/stock.py | 28 ++++++++++++++++++++++++++++ test/test_api.py | 3 +-- test/test_stock.py | 4 ++++ 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/inventree/stock.py b/inventree/stock.py index ad45df75..3e4c16b4 100644 --- a/inventree/stock.py +++ b/inventree/stock.py @@ -11,6 +11,9 @@ import inventree.report +logger = logging.getLogger('inventree') + + class StockLocation( inventree.base.BarcodeMixin, inventree.base.MetadataMixin, @@ -58,6 +61,31 @@ class StockItem( MODEL_TYPE = 'stockitem' + @classmethod + def create(cls, api, data, **kwargs): + """ Override default create method to support multiple object return. """ + + cls.checkApiVersion(api) + + # Ensure the pk value is None so an existing object is not updated + if cls.getPkField() in data.keys(): + data.pop(cls.getPkField()) + + response = api.post(cls.URL, data, **kwargs) + + if response is None: + logger.error("Error creating new object") + return None + + if isinstance(response, list): + allResponses = [] + for element in response: + allResponses.append(cls(api, data=element)) + return allResponses + + else: + return [cls(api, data=response)] + @classmethod def adjustStockItems(cls, api: inventree.api.InvenTreeAPI, method: str, items: list, **kwargs): """Perform a generic stock 'adjustment' action. diff --git a/test/test_api.py b/test/test_api.py index 243a000f..6ca62ead 100644 --- a/test/test_api.py +++ b/test/test_api.py @@ -209,8 +209,7 @@ def test_create_stuff(self): 'part': p.pk, 'quantity': 45, 'notes': 'This is a note', - - }) + })[0] self.assertIsNotNone(s) self.assertEqual(s.part, p.pk) diff --git a/test/test_stock.py b/test/test_stock.py index ca852af5..031f9981 100644 --- a/test/test_stock.py +++ b/test/test_stock.py @@ -426,6 +426,10 @@ def test_assign_stock(self): } ) + # Verify a single result was returned + self.assertEqual(1, len(assignitem)) + assignitem = assignitem[0] + # Assign the item assignitem.assignStock(customer=customer, notes='Sell on the side')