|
|
from __future__ import annotations
|
|
|
|
|
|
from typing import Any, Optional
|
|
|
import json
|
|
|
from flask import current_app
|
|
|
|
|
|
from iti.applications.models import SysConfig
|
|
|
from iti.applications.common.enums import StatusEnum, SysConfigType
|
|
|
|
|
|
|
|
|
def _get_default_namespace() -> str:
|
|
|
return (
|
|
|
current_app.config.get("SYS_CONFIG_DEFAULT_TYPE", "SYSTEM")
|
|
|
if current_app
|
|
|
else "SYSTEM"
|
|
|
)
|
|
|
|
|
|
|
|
|
def get_config(
|
|
|
code: str, *, type: Optional[str] = None, only_enabled: bool = True
|
|
|
) -> Optional[SysConfig]:
|
|
|
"""
|
|
|
按 code 读取配置项(可选指定 type/仅启用),不存在返回 None。
|
|
|
- type 为空时使用默认命名空间(配置 SYS_CONFIG_DEFAULT_TYPE,默认 SYSTEM)
|
|
|
"""
|
|
|
namespace = type or _get_default_namespace()
|
|
|
query = SysConfig.query.filter_by(code=code, type=namespace)
|
|
|
if only_enabled:
|
|
|
query = query.filter(SysConfig.status == StatusEnum.ENABLED)
|
|
|
return query.first()
|
|
|
|
|
|
|
|
|
def get_config_value(
|
|
|
code: str, *, type: Optional[str] = None, default: Any = None
|
|
|
) -> Any:
|
|
|
"""
|
|
|
返回配置值
|
|
|
不存在时返回 default。
|
|
|
"""
|
|
|
cfg = get_config(code, type=type)
|
|
|
if cfg is None:
|
|
|
return default
|
|
|
return cfg.value if cfg.value is not None else default
|
|
|
|
|
|
|
|
|
def get_bool(code: str, *, type: Optional[str] = None, default: bool = False) -> bool:
|
|
|
val = get_config_value(code, type=type, default=None)
|
|
|
if isinstance(val, bool):
|
|
|
return val
|
|
|
if val is None:
|
|
|
return default
|
|
|
if isinstance(val, (int, float)):
|
|
|
return bool(val)
|
|
|
s = str(val).strip().lower()
|
|
|
if s in {"1", "true", "yes", "on"}:
|
|
|
return True
|
|
|
if s in {"0", "false", "no", "off"}:
|
|
|
return False
|
|
|
return default
|
|
|
|
|
|
|
|
|
def get_int(code: str, *, type: Optional[str] = None, default: int = 0) -> int:
|
|
|
val = get_config_value(code, type=type, default=None)
|
|
|
if isinstance(val, bool):
|
|
|
return int(val)
|
|
|
if isinstance(val, (int,)):
|
|
|
return val
|
|
|
try:
|
|
|
return int(str(val).strip())
|
|
|
except Exception:
|
|
|
return default
|
|
|
|
|
|
|
|
|
def get_str(code: str, *, type: Optional[str] = None, default: str = "") -> str:
|
|
|
val = get_config_value(code, type=type, default=None)
|
|
|
if val is None:
|
|
|
return default
|
|
|
if isinstance(val, str):
|
|
|
return val
|
|
|
try:
|
|
|
return json.dumps(val, ensure_ascii=False)
|
|
|
except Exception:
|
|
|
return str(val)
|
|
|
|
|
|
|
|
|
def get_default_user_password(default: str = "ChangeMe123!") -> str:
|
|
|
"""
|
|
|
获取“自动注册默认密码”。
|
|
|
- 默认编码 DEFAULT_USER_PASSWORD
|
|
|
优先读配置值,其次回退应用默认。
|
|
|
"""
|
|
|
val = get_str("DEFAULT_USER_PASSWORD", type=SysConfigType.USER, default=default)
|
|
|
return val or default
|
|
|
|
|
|
|
|
|
def get_default_user_roles(default: list[str] = ["common"]) -> list[str]:
|
|
|
"""
|
|
|
获取“自动注册默认角色列表”。
|
|
|
- 默认编码 DEFAULT_USER_ROLES,逗号分隔
|
|
|
优先读配置值,其次回退应用默认。
|
|
|
"""
|
|
|
val = get_str("DEFAULT_USER_ROLES", type=SysConfigType.USER, default=default)
|
|
|
return val.split(",") if val else default
|
|
|
|
|
|
|
|
|
def get_default_user_depts(default: list[str] = ["common"]) -> list[str]:
|
|
|
"""
|
|
|
获取“自动注册默认部门列表”。
|
|
|
- 默认编码 DEFAULT_USER_DEPTS,逗号分隔
|
|
|
优先读配置值,其次回退应用默认。
|
|
|
"""
|
|
|
val = get_str("DEFAULT_USER_DEPTS", type=SysConfigType.USER, default=default)
|
|
|
return val.split(",") if val else default
|