2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-11-30 09:20:03 +00:00

[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
This commit is contained in:
Oliver
2025-11-24 14:52:13 +11:00
committed by GitHub
parent fcea1383d0
commit 276041ae54
2 changed files with 43 additions and 25 deletions

View File

@@ -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)

View File

@@ -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,