feat(workspace): 新增 get_space_dir/get_project_dir/get_project_apps_modules/resolve_workspace_path 并注册到 dspy 环境,支持工作空间弹窗显示项目目录+apps/modules 引用
This commit is contained in:
parent
2659284e05
commit
b0273a4f9c
@ -155,6 +155,92 @@ async def get_workspace_dir(sor, uid, session_id=''):
|
|||||||
return build_workspace_path(workspace_base, org_id, space, pname, pid), workspace_base
|
return build_workspace_path(workspace_base, org_id, space, pname, pid), workspace_base
|
||||||
|
|
||||||
|
|
||||||
|
async def get_space_dir(sor, uid, session_id=''):
|
||||||
|
"""返回机构工作空间层 {space}/(projects/apps/modules 三目录所在)。
|
||||||
|
|
||||||
|
新结构:项目目录迁到 {space}/projects/{项目名}/,与 apps/、modules/ 平级。
|
||||||
|
workspace_dir 仍是旧结构 {space}/{项目名},space = 其父目录。
|
||||||
|
"""
|
||||||
|
ws_dir, workspace_base = await get_workspace_dir(sor, uid, session_id)
|
||||||
|
if not ws_dir:
|
||||||
|
return '', workspace_base
|
||||||
|
return os.path.dirname(ws_dir.rstrip('/')), workspace_base
|
||||||
|
|
||||||
|
|
||||||
|
async def get_project_dir(sor, uid, session_id=''):
|
||||||
|
"""返回项目目录 {space}/projects/{项目名}/(新结构,docs/env/spec.json/deliverables 所在)。"""
|
||||||
|
space_dir, workspace_base = await get_space_dir(sor, uid, session_id)
|
||||||
|
if not space_dir:
|
||||||
|
return '', workspace_base
|
||||||
|
pid = await get_session_project_id(sor, uid, session_id)
|
||||||
|
dname = ''
|
||||||
|
if pid:
|
||||||
|
try:
|
||||||
|
r = await sor.sqlExe(
|
||||||
|
"SELECT directory_name, name FROM sd_projects WHERE id=${p}$ LIMIT 1",
|
||||||
|
{"p": pid})
|
||||||
|
if r:
|
||||||
|
dname = getattr(r[0], 'directory_name', '') or getattr(r[0], 'name', '') or ''
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
if not dname:
|
||||||
|
ws_dir, _ = await get_workspace_dir(sor, uid, session_id)
|
||||||
|
dname = os.path.basename(ws_dir.rstrip('/'))
|
||||||
|
return os.path.join(space_dir, 'projects', dname), workspace_base
|
||||||
|
|
||||||
|
|
||||||
|
async def get_project_apps_modules(sor, uid, session_id=''):
|
||||||
|
"""读项目目录下 {应用名}_spec.json,返回 (apps, modules)。
|
||||||
|
|
||||||
|
apps = 各 spec.json 的 app 字段;modules = referenced_modules + generated_modules 去重。
|
||||||
|
"""
|
||||||
|
import json as _json
|
||||||
|
project_dir, _ = await get_project_dir(sor, uid, session_id)
|
||||||
|
if not project_dir or not os.path.isdir(project_dir):
|
||||||
|
return [], []
|
||||||
|
apps = []
|
||||||
|
modules = set()
|
||||||
|
try:
|
||||||
|
for f in sorted(os.listdir(project_dir)):
|
||||||
|
if not f.endswith('_spec.json'):
|
||||||
|
continue
|
||||||
|
fp = os.path.join(project_dir, f)
|
||||||
|
try:
|
||||||
|
with open(fp, 'r', encoding='utf-8') as fh:
|
||||||
|
data = _json.loads(fh.read())
|
||||||
|
except Exception:
|
||||||
|
continue
|
||||||
|
if not isinstance(data, dict):
|
||||||
|
continue
|
||||||
|
app = (data.get('app') or '').strip()
|
||||||
|
if app:
|
||||||
|
apps.append(app)
|
||||||
|
for m in (data.get('referenced_modules') or []) + (data.get('generated_modules') or []):
|
||||||
|
if isinstance(m, str) and m.strip():
|
||||||
|
modules.add(m.strip())
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
return sorted(set(apps)), sorted(modules)
|
||||||
|
|
||||||
|
|
||||||
|
def resolve_workspace_path(project_dir, space_dir, node_id):
|
||||||
|
"""把工作空间节点 ID 解析成绝对路径。
|
||||||
|
|
||||||
|
- '@apps/xxx' → space_dir/apps/xxx(项目用到的应用)
|
||||||
|
- '@modules/xxx' → space_dir/modules/xxx(项目用到的模块)
|
||||||
|
- '__root__' / 空 → project_dir(项目目录根)
|
||||||
|
- 其他 → project_dir/xxx(项目目录内的相对路径)
|
||||||
|
"""
|
||||||
|
node_id = (node_id or '').strip()
|
||||||
|
if node_id.startswith('@apps/'):
|
||||||
|
return os.path.join(space_dir, 'apps', node_id[len('@apps/'):])
|
||||||
|
if node_id.startswith('@modules/'):
|
||||||
|
return os.path.join(space_dir, 'modules', node_id[len('@modules/'):])
|
||||||
|
if not node_id or node_id == '__root__':
|
||||||
|
return project_dir
|
||||||
|
return os.path.join(project_dir, node_id)
|
||||||
|
|
||||||
|
|
||||||
async def get_workspace_path(sor, user_id, session_id=''):
|
async def get_workspace_path(sor, user_id, session_id=''):
|
||||||
"""获取用户当前项目的工作空间路径(无项目时返回 None)。"""
|
"""获取用户当前项目的工作空间路径(无项目时返回 None)。"""
|
||||||
ws, _ = await get_workspace_dir(sor, user_id, session_id)
|
ws, _ = await get_workspace_dir(sor, user_id, session_id)
|
||||||
@ -314,7 +400,12 @@ def load_workspace():
|
|||||||
g.get_workspace_base = get_workspace_base
|
g.get_workspace_base = get_workspace_base
|
||||||
g.get_workspace_dir = get_workspace_dir
|
g.get_workspace_dir = get_workspace_dir
|
||||||
g.get_workspace_path = get_workspace_path
|
g.get_workspace_path = get_workspace_path
|
||||||
|
g.get_space_dir = get_space_dir
|
||||||
|
g.get_project_dir = get_project_dir
|
||||||
|
g.get_project_apps_modules = get_project_apps_modules
|
||||||
g.build_workspace_path = build_workspace_path
|
g.build_workspace_path = build_workspace_path
|
||||||
|
g.build_space_path = build_space_path
|
||||||
|
g.resolve_workspace_path = resolve_workspace_path
|
||||||
g.GENERAL_SPACE = GENERAL_SPACE
|
g.GENERAL_SPACE = GENERAL_SPACE
|
||||||
g.build_tree_items = build_tree_items
|
g.build_tree_items = build_tree_items
|
||||||
g.build_file_widgets = build_file_widgets
|
g.build_file_widgets = build_file_widgets
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user