diff --git a/InvenTree/build/models.py b/InvenTree/build/models.py index 92f04bdcc6..b5f5aa10eb 100644 --- a/InvenTree/build/models.py +++ b/InvenTree/build/models.py @@ -17,7 +17,7 @@ from django.db.models import Sum from django.core.validators import MinValueValidator from stock.models import StockItem -from part.models import BomItem +from part.models import Part, BomItem class Build(models.Model): @@ -368,15 +368,21 @@ class BuildItem(models.Model): errors = {} - if self.stock_item is not None and self.stock_item.part is not None: + try: if self.stock_item.part not in self.build.part.required_parts(): errors['stock_item'] = [_("Selected stock item not found in BOM for part '{p}'".format(p=self.build.part.full_name))] - if self.stock_item is not None and self.quantity > self.stock_item.quantity: - errors['quantity'] = [_("Allocated quantity ({n}) must not exceed available quantity ({q})".format( - n=self.quantity, - q=self.stock_item.quantity - ))] + if self.quantity > self.stock_item.quantity: + errors['quantity'] = [_("Allocated quantity ({n}) must not exceed available quantity ({q})".format( + n=self.quantity, + q=self.stock_item.quantity + ))] + + except StockItem.DoesNotExist: + pass + + except Part.DoesNotExist: + pass if len(errors) > 0: raise ValidationError(errors) diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index 8383431caa..385bae7bf4 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -858,13 +858,19 @@ class BomItem(models.Model): """ # A part cannot refer to itself in its BOM - if self.part == self.sub_part: - raise ValidationError({'sub_part': _('Part cannot be added to its own Bill of Materials')}) - - # Test for simple recursion - for item in self.sub_part.bom_items.all(): - if self.part == item.sub_part: - raise ValidationError({'sub_part': _("Part '{p1}' is used in BOM for '{p2}' (recursive)".format(p1=str(self.part), p2=str(self.sub_part)))}) + try: + if self.sub_part is not None and self.part is not None: + if self.part == self.sub_part: + raise ValidationError({'sub_part': _('Part cannot be added to its own Bill of Materials')}) + + # Test for simple recursion + for item in self.sub_part.bom_items.all(): + if self.part == item.sub_part: + raise ValidationError({'sub_part': _("Part '{p1}' is used in BOM for '{p2}' (recursive)".format(p1=str(self.part), p2=str(self.sub_part)))}) + + except Part.DoesNotExist: + # A blank Part will be caught elsewhere + pass class Meta: verbose_name = "BOM Item"