Merge pull request #2520 from SchrodingersGat/build-comple-fix-2

Second bug fix for "build complete" form
This commit is contained in:
Oliver 2022-01-09 22:38:42 +11:00 committed by GitHub
commit be729d037e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 48 additions and 8 deletions

View File

@ -582,7 +582,7 @@ class Build(MPTTModel, ReferenceIndexingMixin):
self.subtractUntrackedStock(user)
# Ensure that there are no longer any BuildItem objects
# which point to thie Build Order
# which point to thisFcan Build Order
self.allocated_stock.all().delete()
@transaction.atomic

View File

@ -248,6 +248,8 @@ class BuildCompleteSerializer(serializers.Serializer):
accept_unallocated = serializers.BooleanField(
label=_('Accept Unallocated'),
help_text=_('Accept that stock items have not been fully allocated to this build order'),
required=False,
default=False,
)
def validate_accept_unallocated(self, value):
@ -262,6 +264,8 @@ class BuildCompleteSerializer(serializers.Serializer):
accept_incomplete = serializers.BooleanField(
label=_('Accept Incomplete'),
help_text=_('Accept that the required number of build outputs have not been completed'),
required=False,
default=False,
)
def validate_accept_incomplete(self, value):
@ -273,6 +277,15 @@ class BuildCompleteSerializer(serializers.Serializer):
return value
def validate(self, data):
build = self.context['build']
if build.incomplete_count > 0:
raise ValidationError(_("Build order has incomplete outputs"))
return data
def save(self):
request = self.context['request']

View File

@ -38,7 +38,7 @@ class BuildAPITest(InvenTreeAPITestCase):
super().setUp()
class BuildCompleteTest(BuildAPITest):
class BuildOutputCompleteTest(BuildAPITest):
"""
Unit testing for the build complete API endpoint
"""
@ -140,6 +140,9 @@ class BuildCompleteTest(BuildAPITest):
Test build order completion
"""
# Initially, build should not be able to be completed
self.assertFalse(self.build.can_complete)
# We start without any outputs assigned against the build
self.assertEqual(self.build.incomplete_outputs.count(), 0)
@ -153,7 +156,7 @@ class BuildCompleteTest(BuildAPITest):
self.assertEqual(self.build.completed, 0)
# We shall complete 4 of these outputs
outputs = self.build.incomplete_outputs[0:4]
outputs = self.build.incomplete_outputs.all()
self.post(
self.url,
@ -165,19 +168,43 @@ class BuildCompleteTest(BuildAPITest):
expected_code=201
)
# There now should be 6 incomplete build outputs remaining
self.assertEqual(self.build.incomplete_outputs.count(), 6)
self.assertEqual(self.build.incomplete_outputs.count(), 0)
# And there should be 4 completed outputs
# And there should be 10 completed outputs
outputs = self.build.complete_outputs
self.assertEqual(outputs.count(), 4)
self.assertEqual(outputs.count(), 10)
for output in outputs:
self.assertFalse(output.is_building)
self.assertEqual(output.build, self.build)
self.build.refresh_from_db()
self.assertEqual(self.build.completed, 40)
self.assertEqual(self.build.completed, 100)
# Try to complete the build (it should fail)
finish_url = reverse('api-build-finish', kwargs={'pk': self.build.pk})
response = self.post(
finish_url,
{},
expected_code=400
)
self.assertTrue('accept_unallocated' in response.data)
# Accept unallocated stock
response = self.post(
finish_url,
{
'accept_unallocated': True,
},
expected_code=201,
)
self.build.refresh_from_db()
# Build should have been marked as complete
self.assertTrue(self.build.is_complete)
class BuildAllocationTest(BuildAPITest):