diff --git a/InvenTree/InvenTree/settings.py b/InvenTree/InvenTree/settings.py index 91f0a66730..e82f33ee65 100644 --- a/InvenTree/InvenTree/settings.py +++ b/InvenTree/InvenTree/settings.py @@ -11,7 +11,8 @@ https://docs.djangoproject.com/en/1.10/ref/settings/ """ import os - +import logging +import logging.config # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) @@ -28,6 +29,12 @@ DEBUG = True ALLOWED_HOSTS = [] +if DEBUG: + # will output to your console + logging.basicConfig( + level = logging.DEBUG, + format = '%(asctime)s %(levelname)s %(message)s', + ) # Application definition diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index 582725639d..236649214f 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -353,9 +353,13 @@ class BomItem(models.Model): def clean(self): + # A part cannot refer to itself in its BOM if self.part == self.sub_part: raise ValidationError(_('A part cannot contain itself as a BOM item')) + for item in self.sub_part.bom_items.all(): + if self.part == item.sub_part: + raise ValidationError(_("Part '{p1}' is used in BOM for '{p2}' (recursive)".format(p1=str(self.part), p2=str(self.sub_part)))) class Meta: verbose_name = "BOM Item" diff --git a/InvenTree/part/templates/part/bom.html b/InvenTree/part/templates/part/bom.html index ec4c1635d9..1157279312 100644 --- a/InvenTree/part/templates/part/bom.html +++ b/InvenTree/part/templates/part/bom.html @@ -60,7 +60,10 @@ $(document).ready(function(){ var button = $(this); launchDeleteForm("#modal-delete", - button.attr('url')); + button.attr('url'), + { + reload: true + }); }); $('#bom-table').on('click', '.edit-row-button', function () {