From a92f97347a31a73408303d9a62905eed11d872e6 Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 25 Sep 2026 09:11:57 +0930 Subject: [PATCH] [API] Use InvenTreeDecimalField for minimum_stock and maximum_stock (#12928) - Fixes https://github.com/inventree/InvenTree/issues/12925 --- src/backend/InvenTree/part/serializers.py | 4 ++-- src/backend/InvenTree/part/test_api.py | 24 +++++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/backend/InvenTree/part/serializers.py b/src/backend/InvenTree/part/serializers.py index 8aa8badc38..b9486e2603 100644 --- a/src/backend/InvenTree/part/serializers.py +++ b/src/backend/InvenTree/part/serializers.py @@ -878,11 +878,11 @@ class PartSerializer( read_only=True, allow_null=True, label=_('Variant Stock') ) - minimum_stock = serializers.FloatField( + minimum_stock = InvenTree.serializers.InvenTreeDecimalField( required=False, label=_('Minimum Stock'), default=0 ) - maximum_stock = serializers.FloatField( + maximum_stock = InvenTree.serializers.InvenTreeDecimalField( required=False, label=_('Maximum Stock'), default=0 ) diff --git a/src/backend/InvenTree/part/test_api.py b/src/backend/InvenTree/part/test_api.py index c65577ec80..8b12a8bfd2 100644 --- a/src/backend/InvenTree/part/test_api.py +++ b/src/backend/InvenTree/part/test_api.py @@ -1997,6 +1997,30 @@ class PartDetailTests(PartImageTestMixin, PartAPITestBase): # Part count should have reduced self.assertEqual(Part.objects.count(), n) + def test_min_max_stock(self): + """Test that decimal values can be set for minimum_stock and maximum_stock. + + Ref: https://github.com/inventree/InvenTree/issues/12925 + """ + part = Part.objects.get(pk=1) + url = reverse('api-part-detail', kwargs={'pk': part.pk}) + + for value in [0.1, 0.35, 1.6, 12.123456, '0.1', '7.25']: + response = self.patch( + url, {'minimum_stock': value, 'maximum_stock': value}, expected_code=200 + ) + + self.assertAlmostEqual(response.data['minimum_stock'], float(value)) + self.assertAlmostEqual(response.data['maximum_stock'], float(value)) + + part.refresh_from_db() + self.assertEqual(part.minimum_stock, Decimal(str(value))) + self.assertEqual(part.maximum_stock, Decimal(str(value))) + + # Too many decimal places should still be rejected + response = self.patch(url, {'minimum_stock': '0.1234567'}, expected_code=400) + self.assertIn('minimum_stock', response.data) + def test_duplicates(self): """Check that trying to create 'duplicate' parts results in errors.""" # Create a part