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