2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-12-16 17:28:11 +00:00

Merge branch 'generic-parameters' of github.com:SchrodingersGat/InvenTree into generic-parameters

This commit is contained in:
Oliver Walters
2025-11-24 04:45:50 +00:00
7 changed files with 62 additions and 30 deletions

View File

@@ -15,7 +15,7 @@ root_command() {
no_call=${args[--no-call]} no_call=${args[--no-call]}
dry_run=${args[--dry-run]} dry_run=${args[--dry-run]}
REQS="wget apt-transport-https" REQS="wget apt-transport-https curl gpg"
function do_call() { function do_call() {
if [[ $dry_run ]]; then if [[ $dry_run ]]; then

View File

@@ -5,7 +5,7 @@ publisher=${args[publisher]}
no_call=${args[--no-call]} no_call=${args[--no-call]}
dry_run=${args[--dry-run]} dry_run=${args[--dry-run]}
REQS="wget apt-transport-https" REQS="wget apt-transport-https curl gpg"
function do_call() { function do_call() {
if [[ $dry_run ]]; then if [[ $dry_run ]]; then

View File

@@ -83,6 +83,18 @@ This is a security measure to prevent plugins from changing the core functionali
An error occurred when discovering or initializing a machine type from a plugin. This likely indicates a faulty or incompatible plugin. An error occurred when discovering or initializing a machine type from a plugin. This likely indicates a faulty or incompatible plugin.
#### INVE-E13
**Error reading InvenTree configuration file**
An error occurred while reading the InvenTree configuration file. This might be caused by a syntax error or invalid value in the configuration file.
#### INVE-E14
**Could not import Django**
Django is not installed in the current Python environment. This means that the InvenTree backend is not running within the correct [python virtual environment](../start/index.md#virtual-environment) or that the required Python packages were not installed correctly.
### INVE-W (InvenTree Warning) ### INVE-W (InvenTree Warning)
Warnings - These are non-critical errors which should be addressed when possible. Warnings - These are non-critical errors which should be addressed when possible.
@@ -153,7 +165,7 @@ The warning text will show the recommended command for intended use.
#### INVE-W10 #### INVE-W10
**Config not in recommended directory - Backend** **Config not in recommended directory - Backend**
A configuration file is not in the recommended directory. This might lead to issues with the deployment method you are using. It might also lead to confusinon. A configuration file is not in the recommended directory. This might lead to issues with the deployment method you are using. It might also lead to confusion.
The warning text will show the recommended directory for your deployment method. The warning text will show the recommended directory for your deployment method.

View File

@@ -200,7 +200,9 @@ def load_config_data(set_cache: bool = False) -> map | None:
data = yaml.safe_load(cfg) data = yaml.safe_load(cfg)
except yaml.parser.ParserError as error: except yaml.parser.ParserError as error:
logger.error( logger.error(
"Error reading InvenTree configuration file '%s': %s", cfg_file, error "INVE-E13: Error reading InvenTree configuration file '%s': %s",
cfg_file,
error,
) )
sys.exit(1) sys.exit(1)

View File

@@ -24,6 +24,22 @@ logger = structlog.get_logger('inventree')
logging.getLogger('pint').setLevel(logging.ERROR) 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(): def get_unit_registry_hash():
"""Return a hash representing the current state of the unit registry. """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 global _unit_registry_hash
_unit_registry_hash = registry_hash _unit_registry_hash = registry_hash
if not can_cache_registry():
return
# Save to both the global settings and the session cache # Save to both the global settings and the session cache
set_global_setting('_UNIT_REGISTRY_HASH', registry_hash) set_global_setting('_UNIT_REGISTRY_HASH', registry_hash)
set_session_cache(_UNIT_REG_CACHE_KEY, registry_hash) set_session_cache(_UNIT_REG_CACHE_KEY, registry_hash)
@@ -68,7 +87,7 @@ def get_unit_registry():
return reload_unit_registry() return reload_unit_registry()
# Check if the unit registry has changed # 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') logger.info('Unit registry hash has changed, reloading unit registry')
return reload_unit_registry() return reload_unit_registry()
@@ -103,33 +122,32 @@ def reload_unit_registry():
reg.define('thousand = 1000') reg.define('thousand = 1000')
# Allow for custom units to be defined in the database # Allow for custom units to be defined in the database
# Calculate a hash of all custom units
hash_md5 = md5()
try: try:
from common.models import CustomUnit from common.models import CustomUnit
# Calculate a hash of all custom units custom_units = list(CustomUnit.objects.all())
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())
except Exception: except Exception:
# Database is not ready, or CustomUnit model is not available # Database is likely not ready
pass 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 dt = time.time() - t_start
logger.debug('Loaded unit registry in %.3f s', dt) logger.debug('Loaded unit registry in %.3f s', dt)

View File

@@ -707,7 +707,7 @@ class BaseInvenTreeSetting(models.Model):
): # pragma: no cover ): # pragma: no cover
return return
attempts = int(kwargs.get('attempts', 3)) attempts = int(kwargs.pop('attempts', 3))
filters = { filters = {
'key__iexact': key, 'key__iexact': key,

View File

@@ -13,7 +13,7 @@ def main():
from django.core.management import execute_from_command_line from django.core.management import execute_from_command_line
except ImportError as exc: # pragma: no cover except ImportError as exc: # pragma: no cover
raise ImportError( raise ImportError(
"Couldn't import Django. Are you sure it's installed and " "INVE-E14: Could not import Django. Are you sure it's installed and "
'available on your PYTHONPATH environment variable? Did you ' 'available on your PYTHONPATH environment variable? Did you '
'forget to activate a virtual environment?' 'forget to activate a virtual environment?'
) from exc ) from exc