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:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user