You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
iTi-Flask/iti/applications/service/sys_config.py

114 lines
3.4 KiB
Python

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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