From 59f3b9f2f694deefedf0c14910d5ac5f63d3923d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 11 Mar 2026 22:28:22 +1100 Subject: [PATCH] fix: wrap create_default_labels in transaction.atomic() savepoint to prevent PostgreSQL transaction abort (#11484) (#11490) 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 (cherry picked from commit a964d6682efe62ff66bc531e93c004957b0e5163) Co-authored-by: tigger2000ttfn 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(