2
0
mirror of https://github.com/inventree/InvenTree.git synced 2026-04-28 13:54:25 +00:00

[setup] Database config (#11813)

* Adjust config template file

* Check UPPERCASE value as backup

* fix typing issue

* ignore ty issues for now

Co-authored-by: Copilot <copilot@github.com>

---------

Co-authored-by: Matthias Mair <code@mjmair.com>
Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
Oliver
2026-04-28 08:20:49 +10:00
committed by GitHub
parent afa3807978
commit aeeca49a8f
5 changed files with 49 additions and 29 deletions
+3 -2
View File
@@ -109,12 +109,13 @@ unresolved-reference="ignore" # 21 # see https://github.com/astral-sh/ty/issues
unresolved-attribute="ignore" # 505 # need Plugin Mixin typing
call-non-callable="ignore" # 8 ##
invalid-assignment="ignore" # 17 # need to wait for better django field stubs
invalid-method-override="ignore" # 99
# invalid-method-override="ignore" # 99
invalid-return-type="ignore" # 22 ##
possibly-missing-attribute="ignore" # 25 # https://github.com/astral-sh/ty/issues/164
# possibly-missing-attribute="ignore" # 25 # https://github.com/astral-sh/ty/issues/164
unknown-argument="ignore" # 3 # need to wait for better django field stubs
invalid-argument-type="ignore" # 49
no-matching-overload="ignore" # 3 # need to wait for betterdjango field stubs
possibly-unbound-attribute="ignore" # 21
[tool.coverage.run]
source = ["src/backend/InvenTree", "InvenTree"]
+20 -13
View File
@@ -9,7 +9,7 @@ import shutil
import string
import sys
from pathlib import Path
from typing import Optional
from typing import Any, Optional
logger = logging.getLogger('inventree')
CONFIG_DATA = None
@@ -254,6 +254,24 @@ def do_typecast(value, type, var_name=None):
return value
def get_config_value(config_key: str) -> Optional[Any]:
"""Helper function to retrieve a configuration value from the config file."""
cfg_data = load_config_data()
result = None
# Hack to allow 'path traversal' in configuration file
for key in config_key.strip().split('.'):
if type(cfg_data) is not dict or key not in cfg_data:
result = None
break
result = cfg_data[key]
cfg_data = cfg_data[key]
return result
def get_setting(env_var=None, config_key=None, default_value=None, typecast=None):
"""Helper function for retrieving a configuration setting value.
@@ -291,18 +309,7 @@ def get_setting(env_var=None, config_key=None, default_value=None, typecast=None
# Next, try to load from configuration file
if config_key is not None:
cfg_data = load_config_data()
result = None
# Hack to allow 'path traversal' in configuration file
for key in config_key.strip().split('.'):
if type(cfg_data) is not dict or key not in cfg_data:
result = None
break
result = cfg_data[key]
cfg_data = cfg_data[key]
result = get_config_value(config_key)
if result is not None:
set_metadata('yaml')
@@ -4,27 +4,38 @@ from pathlib import Path
import structlog
from InvenTree.config import get_boolean_setting, get_setting
from InvenTree.config import get_boolean_setting, get_config_value, get_setting
logger = structlog.get_logger('inventree')
def get_db_backend():
"""Return the database backend configuration."""
# For the core database configuration values, we test for UPPERCASE configuration values as a backup,
# due to legacy reasons (original config files were uppercase,
# but we moved to lowercase for consistency with other settings.
db_config = {
'ENGINE': get_setting(
'INVENTREE_DB_ENGINE', 'database.engine', '', typecast=str
),
'NAME': get_setting('INVENTREE_DB_NAME', 'database.name', '', typecast=str),
'USER': get_setting('INVENTREE_DB_USER', 'database.user', '', typecast=str),
)
or get_config_value('database.ENGINE'),
'NAME': get_setting('INVENTREE_DB_NAME', 'database.name', '', typecast=str)
or get_config_value('database.NAME'),
'USER': get_setting('INVENTREE_DB_USER', 'database.user', '', typecast=str)
or get_config_value('database.USER'),
'PASSWORD': get_setting(
'INVENTREE_DB_PASSWORD', 'database.password', '', typecast=str
),
'HOST': get_setting('INVENTREE_DB_HOST', 'database.host', '', typecast=str),
'PORT': get_setting('INVENTREE_DB_PORT', 'database.port', '', typecast=str),
)
or get_config_value('database.PASSWORD'),
'HOST': get_setting('INVENTREE_DB_HOST', 'database.host', '', typecast=str)
or get_config_value('database.HOST'),
'PORT': get_setting('INVENTREE_DB_PORT', 'database.port', '', typecast=str)
or get_config_value('database.PORT'),
'OPTIONS': get_setting(
'INVENTREE_DB_OPTIONS', 'database.options', {}, typecast=dict
)
or get_config_value('database.OPTIONS')
or {},
}
+6 -6
View File
@@ -18,15 +18,15 @@
# TO MAINTAINERS: Do not change database strings
database:
# --- Available options: ---
# ENGINE: Database engine. Selection from:
# engine: Database engine. Selection from:
# - mysql
# - postgresql
# - sqlite3
# NAME: Database name
# USER: Database username (if required)
# PASSWORD: Database password (if required)
# HOST: Database host address (if required)
# PORT: Database host port (if required)
# name: Database name
# user: Database username (if required)
# password: Database password (if required)
# host: Database host address (if required)
# port: Database host port (if required)
# Base URL for the InvenTree server (or use the environment variable INVENTREE_SITE_URL)
# site_url: 'http://localhost:8000'
+2 -1
View File
@@ -5,7 +5,6 @@ import json
import re
import warnings
from datetime import datetime
from distutils.sysconfig import get_python_lib
from importlib.metadata import PackageNotFoundError, metadata
from pathlib import Path
from typing import Optional
@@ -528,6 +527,8 @@ class InvenTreePlugin(VersionMixin, MixinBase, MetaBase):
@mark_final
def is_editable(cls):
"""Returns if the current part is editable."""
from distutils.sysconfig import get_python_lib
pkg_name = cls.__name__.split('.')[0]
dist_info = list(Path(get_python_lib()).glob(f'{pkg_name}-*.dist-info'))
return bool(len(dist_info) == 1)