From a964d6682efe62ff66bc531e93c004957b0e5163 Mon Sep 17 00:00:00 2001 From: tigger2000ttfn Date: Wed, 11 Mar 2026 07:21:03 -0400 Subject: [PATCH] fix: wrap create_default_labels in transaction.atomic() savepoint to prevent PostgreSQL transaction abort (#11484) When the plugin registry reloads during an active HTTP request, create_default_labels() raises ValidationError on duplicate template inserts. On PostgreSQL this aborts the entire outer atomic() block, causing TransactionManagementError on all stock operations in that request. Fixes #11469 Co-authored-by: Oliver --- src/backend/InvenTree/report/apps.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/backend/InvenTree/report/apps.py b/src/backend/InvenTree/report/apps.py index 534c239546..0ef083f38c 100644 --- a/src/backend/InvenTree/report/apps.py +++ b/src/backend/InvenTree/report/apps.py @@ -7,6 +7,7 @@ from django.apps import AppConfig from django.core.exceptions import AppRegistryNotReady, ValidationError from django.core.files.base import ContentFile from django.core.files.storage import default_storage +from django.db import transaction from django.db.utils import IntegrityError, OperationalError, ProgrammingError import structlog @@ -160,9 +161,10 @@ class ReportConfig(AppConfig): # Otherwise, create a new entry try: # Create a new entry - report.models.LabelTemplate.objects.create( - **template, template=self.file_from_template('label', filename) - ) + with transaction.atomic(): + report.models.LabelTemplate.objects.create( + **template, template=self.file_from_template('label', filename) + ) logger.info("Creating new label template: '%s'", template['name']) except ValidationError: logger.warning(