From 276041ae540dfd75193875a46666ae57c3faf046 Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 24 Nov 2025 14:52:13 +1100 Subject: [PATCH] [bug] Migration test fix (#10899) * Pop instead of get * Better error handling for unit registry * Prevent caching during database migrations * Remove debug msg * Revert changes --- src/backend/InvenTree/InvenTree/conversion.py | 66 ++++++++++++------- src/backend/InvenTree/common/models.py | 2 +- 2 files changed, 43 insertions(+), 25 deletions(-) diff --git a/src/backend/InvenTree/InvenTree/conversion.py b/src/backend/InvenTree/InvenTree/conversion.py index 42274ca552..aedf416883 100644 --- a/src/backend/InvenTree/InvenTree/conversion.py +++ b/src/backend/InvenTree/InvenTree/conversion.py @@ -24,6 +24,22 @@ logger = structlog.get_logger('inventree') logging.getLogger('pint').setLevel(logging.ERROR) +def can_cache_registry() -> bool: + """Return True if it is appropriate to cache the unit registry. + + Prevent caching under certain conditions (such as database migration) + to prevent database access. + """ + import InvenTree.ready + + return not any([ + InvenTree.ready.isImportingData(), + InvenTree.ready.isRunningBackup(), + InvenTree.ready.isRunningMigrations(), + InvenTree.ready.isInTestMode(), + ]) + + def get_unit_registry_hash(): """Return a hash representing the current state of the unit registry. @@ -53,6 +69,9 @@ def set_unit_registry_hash(registry_hash: str): global _unit_registry_hash _unit_registry_hash = registry_hash + if not can_cache_registry(): + return + # Save to both the global settings and the session cache set_global_setting('_UNIT_REGISTRY_HASH', registry_hash) set_session_cache(_UNIT_REG_CACHE_KEY, registry_hash) @@ -68,7 +87,7 @@ def get_unit_registry(): return reload_unit_registry() # Check if the unit registry has changed - if _unit_registry_hash != get_unit_registry_hash(): + if can_cache_registry() and _unit_registry_hash != get_unit_registry_hash(): logger.info('Unit registry hash has changed, reloading unit registry') return reload_unit_registry() @@ -103,33 +122,32 @@ def reload_unit_registry(): reg.define('thousand = 1000') # Allow for custom units to be defined in the database + # Calculate a hash of all custom units + hash_md5 = md5() + try: from common.models import CustomUnit - # Calculate a hash of all custom units - hash_md5 = md5() - - for cu in CustomUnit.objects.all(): - try: - fmt = cu.fmt_string() - reg.define(fmt) - - hash_md5.update(fmt.encode('utf-8')) - - except Exception as e: - logger.exception( - 'Failed to load custom unit: %s - %s', cu.fmt_string(), e - ) - - # Once custom units are loaded, save registry - _unit_registry = reg - - # Update the unit registry hash - set_unit_registry_hash(hash_md5.hexdigest()) - + custom_units = list(CustomUnit.objects.all()) except Exception: - # Database is not ready, or CustomUnit model is not available - pass + # Database is likely not ready + custom_units = [] + + for cu in custom_units: + try: + fmt = cu.fmt_string() + reg.define(fmt) + + hash_md5.update(fmt.encode('utf-8')) + + except Exception as e: + logger.exception('Failed to load custom unit: %s - %s', cu.fmt_string(), e) + + # Once custom units are loaded, save registry + _unit_registry = reg + + # Update the unit registry hash + set_unit_registry_hash(hash_md5.hexdigest()) dt = time.time() - t_start logger.debug('Loaded unit registry in %.3f s', dt) diff --git a/src/backend/InvenTree/common/models.py b/src/backend/InvenTree/common/models.py index a5671cfa77..7c7266c2ef 100644 --- a/src/backend/InvenTree/common/models.py +++ b/src/backend/InvenTree/common/models.py @@ -704,7 +704,7 @@ class BaseInvenTreeSetting(models.Model): ): # pragma: no cover return - attempts = int(kwargs.get('attempts', 3)) + attempts = int(kwargs.pop('attempts', 3)) filters = { 'key__iexact': key,