Files
TermiNexus 9be878b84a feat(sdk): 通用查询与工具层下沉,新增 App 体系镜像模型
P1 通用查询:auth/managers.py 新增 20 个查询方法(Role/Company/Department/Position/Menu/Tenant 六个 Manager);auth/ram.py 新增 RAMManager.ListPolicyResourceUUIDs;stats/manager.py 新增 StatsManager.ListAutoResetConfigs。

P2 App 体系:models.py 新增 App/TenantApp/CompanyApp/UserApp/AppConfig 五个 managed=False 镜像模型,字段与业务侧逐一对齐。

P3 工具下沉:新增 config.py 配置注入层与 money/json_encoder/celery_utils/exception_handler/redis_lock/ip_filter/storage/datetime_utils/string_utils 九个工具模块;model_utils.UUIDObj 增加 PascalCase 别名 Str/Bytes/UUID 与模块级转换函数。

同时移除 commission/stats/CashBook 镜像模型的重复索引声明,消除 Django models.E030。
2026-09-13 21:57:45 +08:00

40 lines
1.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""模块:SDK 通用配置读取(可注入提供者)
SDK 内不得反向依赖业务层(gvsds.app_config),故提供配置读取钩子:
- 业务侧启动时调用 SetConfigProvider(gvsds.app_config.get, gvsds.app_config.getlist) 注入;
- 未注入时回退到环境变量 ``{SECTION}_{KEY}``(大写),与 gvsds.secrets 约定一致。
用法(业务侧 shim):
from gvsdsdk.config import SetConfigProvider
from gvsds.app_config import get, getlist
SetConfigProvider(get, getlist)
"""
import os
_ConfigGet = None
_ConfigGetList = None
def SetConfigProvider(Get, GetList):
"""注入配置读取器(Get(section,key,fallback) / GetList(section,key,fallback,separator))"""
global _ConfigGet, _ConfigGetList
_ConfigGet = Get
_ConfigGetList = GetList
def Get(section, key, fallback=None):
"""读取单项配置:优先注入的提供者,其次环境变量"""
if _ConfigGet is not None:
return _ConfigGet(section, key, fallback=fallback)
return os.environ.get(f'{section.upper()}_{key.upper()}', fallback)
def GetList(section, key, fallback=None, separator=','):
"""读取列表配置:优先注入的提供者,其次环境变量(分隔符切分)"""
if _ConfigGetList is not None:
return _ConfigGetList(section, key, fallback=fallback, separator=separator)
raw = os.environ.get(f'{section.upper()}_{key.upper()}')
if raw is None:
return fallback if fallback is not None else []
return [item.strip() for item in raw.split(separator) if item.strip()]