1
0
forked from erp-dev/erp

feat: error_code + api doc + printing-job fields

This commit is contained in:
2026-07-06 23:13:57 +08:00
parent 740d23d04b
commit ddbf798665
21 changed files with 977 additions and 17 deletions

View File

@@ -0,0 +1,73 @@
from __future__ import annotations
from importlib import import_module
from threading import Lock
from django.apps import apps
_CACHE = None
_CACHE_LOCK = Lock()
def list_error_code_groups():
global _CACHE
if _CACHE is None:
with _CACHE_LOCK:
if _CACHE is None:
_CACHE = _discover_error_code_groups()
return _CACHE
def clear_error_code_cache():
global _CACHE
with _CACHE_LOCK:
_CACHE = None
def _discover_error_code_groups():
modules = ['flower']
modules.extend(config.name for config in apps.get_app_configs())
groups = []
seen_modules = set()
for module_name in modules:
if module_name in seen_modules:
continue
seen_modules.add(module_name)
error_code_module = _import_error_code_module(module_name)
if error_code_module is None:
continue
for group in getattr(error_code_module, 'ERROR_CODE_GROUPS', []):
groups.append(_serialize_group(group))
return groups
def _import_error_code_module(module_name: str):
error_code_module_name = f'{module_name}.error_code'
try:
return import_module(error_code_module_name)
except ModuleNotFoundError as exc:
if exc.name == error_code_module_name:
return None
raise
def _serialize_group(group: dict):
enum_cls = group['enum']
details = group.get('details') or {}
return {
'module': group['module'],
'title': group.get('title') or group['module'],
'codes': [_serialize_code(member, details.get(member, {})) for member in enum_cls],
}
def _serialize_code(member, detail: dict):
return {
'error_code': int(member),
'name': member.name,
'code': detail.get('code', member.name.lower()),
'message': detail.get('message', ''),
}