From fc730b9af7afb001385853364f947da1ae4cde0a Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 20 Mar 2026 15:41:44 +1100 Subject: [PATCH] Save user info (#11572) * Record user info when creating stock item * Add unit test * Add playwright test --- src/backend/InvenTree/stock/api.py | 9 +++++++-- src/backend/InvenTree/stock/test_api.py | 7 +++++++ src/frontend/tests/pages/pui_stock.spec.ts | 19 +++++++++++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/backend/InvenTree/stock/api.py b/src/backend/InvenTree/stock/api.py index 2fbad3f937..c26091a3d7 100644 --- a/src/backend/InvenTree/stock/api.py +++ b/src/backend/InvenTree/stock/api.py @@ -1248,14 +1248,19 @@ class StockList( else: # Create a single StockItem object # Note: This automatically creates a tracking entry - item = serializer.save() + item = StockItem(**serializer.validated_data) if status_value and not item.compare_status(status_value): item.set_status(status_value) item.save(user=user) + item.refresh_from_db() - response_data = [serializer.data] + response_data = [ + StockSerializers.StockItemSerializer( + item, context=self.get_serializer_context() + ).data + ] return Response( response_data, diff --git a/src/backend/InvenTree/stock/test_api.py b/src/backend/InvenTree/stock/test_api.py index c57a8e6de0..4f62c170ce 100644 --- a/src/backend/InvenTree/stock/test_api.py +++ b/src/backend/InvenTree/stock/test_api.py @@ -1417,12 +1417,19 @@ class StockItemTest(StockAPITestCase): """Test the default location functionality, if a 'location' is not specified in the creation request.""" # The part 'R_4K7_0603' (pk=4) has a default location specified + # Create a new StockItem instance response = self.post( self.list_url, data={'part': 4, 'quantity': 10}, expected_code=201 ) self.assertEqual(response.data[0]['location'], 2) + # Check that the item was associated with the correct user + item = StockItem.objects.get(pk=response.data[0]['pk']) + self.assertEqual(item.tracking_info_count, 1) + tracking = item.tracking_info.first() + self.assertEqual(tracking.user, self.user) + # What if we explicitly set the location to a different value? response = self.post( diff --git a/src/frontend/tests/pages/pui_stock.spec.ts b/src/frontend/tests/pages/pui_stock.spec.ts index 987c8fd5d5..24185fd832 100644 --- a/src/frontend/tests/pages/pui_stock.spec.ts +++ b/src/frontend/tests/pages/pui_stock.spec.ts @@ -37,6 +37,25 @@ test('Stock - Basic Tests', async ({ browser }) => { await loadTab(page, 'Test Results'); await page.getByText('395c6d5586e5fb656901d047be27e1f7').waitFor(); await loadTab(page, 'Installed Items'); + + // Let's create a new stock item + await navigate(page, 'part/822/stock'); + await page + .getByRole('button', { name: 'action-button-add-stock-item' }) + .click(); + await page + .getByRole('textbox', { name: 'number-field-quantity' }) + .fill('987'); + await page.getByRole('button', { name: 'Submit' }).click(); + + // Automatically navigate through to the newly created stock item + await page.getByText('Quantity: 987').first().waitFor(); + await loadTab(page, 'Stock Tracking'); + await page + .getByRole('cell', { name: 'Stock item created' }) + .first() + .waitFor(); + await page.getByRole('cell', { name: 'allaccess Ally Access' }).waitFor(); }); test('Stock - Location Tree', async ({ browser }) => {