diff --git a/src/backend/InvenTree/InvenTree/models.py b/src/backend/InvenTree/InvenTree/models.py index de4b806126..6297216f8c 100644 --- a/src/backend/InvenTree/InvenTree/models.py +++ b/src/backend/InvenTree/InvenTree/models.py @@ -21,6 +21,7 @@ from mptt.exceptions import InvalidMove from mptt.models import MPTTModel, TreeForeignKey import common.settings +import InvenTree.exceptions import InvenTree.fields import InvenTree.format import InvenTree.helpers @@ -590,6 +591,9 @@ class InvenTreeTree(MetadataMixin, PluginValidationMixin, MPTTModel): try: self.__class__.objects.partial_rebuild(tree_id) except Exception: + InvenTree.exceptions.log_error( + f'{self.__class__.__name__}.partial_rebuild' + ) logger.warning( 'Failed to rebuild tree for %s <%s>', self.__class__.__name__, diff --git a/src/backend/InvenTree/stock/models.py b/src/backend/InvenTree/stock/models.py index 3b66f6ecfb..749dc81d1e 100644 --- a/src/backend/InvenTree/stock/models.py +++ b/src/backend/InvenTree/stock/models.py @@ -571,8 +571,10 @@ class StockItem( for key in ['parent_id', 'part_id', 'build_id']: data.pop(key, None) + tree_id = kwargs.pop('tree_id', 0) + data['parent'] = kwargs.pop('parent', None) - data['tree_id'] = kwargs.pop('tree_id', 0) + data['tree_id'] = tree_id data['level'] = kwargs.pop('level', 0) data['rght'] = kwargs.pop('rght', 0) data['lft'] = kwargs.pop('lft', 0) @@ -589,6 +591,11 @@ class StockItem( # Create the StockItem objects in bulk StockItem.objects.bulk_create(items) + # We will need to rebuild the stock item tree manually, due to the bulk_create operation + InvenTree.tasks.offload_task( + stock.tasks.rebuild_stock_item_tree, tree_id=tree_id, group='stock' + ) + # Return the newly created StockItem objects return StockItem.objects.filter(part=part, serial__in=serials) @@ -1810,11 +1817,6 @@ class StockItem( # Remove the equivalent number of items self.take_stock(quantity, user, notes=notes) - # Rebuild the stock tree - InvenTree.tasks.offload_task( - stock.tasks.rebuild_stock_item_tree, tree_id=self.tree_id, group='stock' - ) - return items @transaction.atomic diff --git a/src/backend/InvenTree/stock/tasks.py b/src/backend/InvenTree/stock/tasks.py index 735f5feaff..70ec32a1bc 100644 --- a/src/backend/InvenTree/stock/tasks.py +++ b/src/backend/InvenTree/stock/tasks.py @@ -13,12 +13,14 @@ def rebuild_stock_item_tree(tree_id=None): The StockItem tree uses the MPTT library to manage the tree structure. """ + from InvenTree.exceptions import log_error from stock.models import StockItem if tree_id: try: StockItem.objects.partial_rebuild(tree_id) except Exception: + log_error('rebuild_stock_item_tree') logger.warning('Failed to rebuild StockItem tree') # If the partial rebuild fails, rebuild the entire tree StockItem.objects.rebuild()