mirror of
				https://github.com/inventree/InvenTree.git
				synced 2025-10-31 13:15:43 +00:00 
			
		
		
		
	Build part change fix (#5808)
* Add DiffMixin class - Allows us to compute "diffs" against items stored in the database, when they are being updated * Prevent build order part from being changed after creation * Remove "part" field from buildorder edit form * Add unit test
This commit is contained in:
		| @@ -28,6 +28,7 @@ from build.validators import generate_next_build_reference, validate_build_order | ||||
| import InvenTree.fields | ||||
| import InvenTree.helpers | ||||
| import InvenTree.helpers_model | ||||
| import InvenTree.mixins | ||||
| import InvenTree.models | ||||
| import InvenTree.ready | ||||
| import InvenTree.tasks | ||||
| @@ -44,7 +45,7 @@ import users.models | ||||
| logger = logging.getLogger('inventree') | ||||
|  | ||||
|  | ||||
| class Build(MPTTModel, InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models.InvenTreeNotesMixin, InvenTree.models.MetadataMixin, InvenTree.models.ReferenceIndexingMixin): | ||||
| class Build(MPTTModel, InvenTree.mixins.DiffMixin, InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models.InvenTreeNotesMixin, InvenTree.models.MetadataMixin, InvenTree.models.ReferenceIndexingMixin): | ||||
|     """A Build object organises the creation of new StockItem objects from other existing StockItem objects. | ||||
|  | ||||
|     Attributes: | ||||
| @@ -108,6 +109,12 @@ class Build(MPTTModel, InvenTree.models.InvenTreeBarcodeMixin, InvenTree.models. | ||||
|         self.validate_reference_field(self.reference) | ||||
|         self.reference_int = self.rebuild_reference_field(self.reference) | ||||
|  | ||||
|         # Prevent changing target part after creation | ||||
|         if self.has_field_changed('part'): | ||||
|             raise ValidationError({ | ||||
|                 'part': _('Build order part cannot be changed') | ||||
|             }) | ||||
|  | ||||
|         try: | ||||
|             super().save(*args, **kwargs) | ||||
|         except InvalidMove: | ||||
|   | ||||
| @@ -471,6 +471,28 @@ class BuildTest(BuildTestBase): | ||||
|         # Check that the "consumed_by" item count has increased | ||||
|         self.assertEqual(StockItem.objects.filter(consumed_by=self.build).count(), n + 8) | ||||
|  | ||||
|     def test_change_part(self): | ||||
|         """Try to change target part after creating a build""" | ||||
|  | ||||
|         bo = Build.objects.create( | ||||
|             reference='BO-9999', | ||||
|             title='Some new build', | ||||
|             part=self.assembly, | ||||
|             quantity=5, | ||||
|             issued_by=get_user_model().objects.get(pk=1), | ||||
|         ) | ||||
|  | ||||
|         assembly_2 = Part.objects.create( | ||||
|             name="Another assembly", | ||||
|             description="A different assembly", | ||||
|             assembly=True, | ||||
|         ) | ||||
|  | ||||
|         # Should not be able to change the part after the Build is saved | ||||
|         with self.assertRaises(ValidationError): | ||||
|             bo.part = assembly_2 | ||||
|             bo.save() | ||||
|  | ||||
|     def test_cancel(self): | ||||
|         """Test cancellation of the build""" | ||||
|         # TODO | ||||
|   | ||||
		Reference in New Issue
	
	Block a user