优化get_pagetype_module_app,如果module是custom类型,app从package取值

This commit is contained in:
jingrow 2025-10-29 17:17:17 +08:00
parent 92c96474b9
commit be9df68ce0

View File

@ -4,9 +4,12 @@ import os
import shutil import shutil
import subprocess import subprocess
import tempfile import tempfile
import datetime
from pathlib import Path
from typing import Dict, List, Any, Optional from typing import Dict, List, Any, Optional
from jingrow.ai.utils.node_schema import get_node_schema_fields from jingrow.ai.utils.node_schema import get_node_schema_fields
from jingrow.modules.utils import get_pagetype_module, get_module_app from jingrow.modules.utils import get_pagetype_module, get_module_app
from jingrow.modules.export_file import export_pg
from jingrow import _ from jingrow import _
@jingrow.whitelist() @jingrow.whitelist()
@ -647,14 +650,17 @@ def get_pagetype_module_app(pagetype: str) -> Dict[str, Any]:
module = get_pagetype_module(pagetype) module = get_pagetype_module(pagetype)
module_scrub = jingrow.scrub(module) module_scrub = jingrow.scrub(module)
# 首先从 module_app 映射获取O(1) 字典查找) # 先查缓存
app = jingrow.local.module_app.get(module_scrub) app = jingrow.local.module_app.get(module_scrub)
# 如果找不到,查询数据库(可能是 custom module # 未命中则一次性读取 Module Defcustom 优先 package否则取 app_name最后兜底
if app is None: if app is None:
app_name = jingrow.db.get_value("Module Def", {"module_name": module}, "app_name", ignore=True) module_def = jingrow.get_pg("Module Def", {"module_name": module})
app = app_name if module_def.custom:
# 将结果回写到 module_app 映射,下次直接命中(优化性能) app = module_def.package or module_def.app_name
else:
app = get_module_app(module)
jingrow.local.module_app[module_scrub] = app jingrow.local.module_app[module_scrub] = app
return { return {
@ -832,3 +838,92 @@ def install_package(package_file_url: str) -> Dict[str, Any]:
except Exception as e: except Exception as e:
return {'success': False, 'error': str(e)} return {'success': False, 'error': str(e)}
@jingrow.whitelist()
def export_app_metadata(app_name: str) -> Dict[str, Any]:
"""导出应用扩展包元数据 - 直接返回Package、Module、PageType的JSON数据结构"""
try:
# 1. 根据 app_name 查找对应的 Package
package = None
packages = jingrow.get_all("Package", filters={"name": app_name})
if packages:
package = jingrow.get_pg("Package", packages[0].name)
else:
# 如果没有找到,尝试使用 app_name 作为 package_name 查找
packages = jingrow.get_all("Package", filters={"package_name": app_name})
if packages:
package = jingrow.get_pg("Package", packages[0].name)
if not package:
return {
"success": False,
"error": f"未找到应用 '{app_name}' 对应的 Package"
}
# 2. 收集Package元数据
metadata = {
"package": package.as_dict(no_nulls=True),
"package_name": package.package_name,
"readme": str(package.readme or ""),
"license": str(package.license or "") if package.license else None,
"modules": {}
}
# 3. 收集所有Module及其文档的元数据
modules = jingrow.get_all("Module Def", filters={"package": package.name})
for m in modules:
try:
module = jingrow.get_pg("Module Def", m.name)
if not module or not hasattr(module, 'meta'):
continue
# 收集该模块下的所有文档
module_docs = {}
for l in module.meta.links:
if l.link_pagetype == "Module Def":
continue
try:
# 获取该类型的所有文档
docs = jingrow.get_all(l.link_pagetype, filters={"module": m.name})
for d in docs:
try:
doc = jingrow.get_pg(l.link_pagetype, d.name)
# 导出文档数据
doc_export = doc.as_dict(no_nulls=True)
# 添加到模块文档
pagetype_name = l.link_pagetype
if pagetype_name not in module_docs:
module_docs[pagetype_name] = {}
module_docs[pagetype_name][doc.name] = doc_export
except Exception:
continue
except Exception:
continue
metadata["modules"][m.name] = {
"module_info": m.as_dict(no_nulls=True),
"docs": module_docs
}
except Exception:
continue
# 4. 返回元数据
result = {
"success": True,
"metadata": metadata
}
return result
except Exception as e:
import traceback
jingrow.log_error("Export app metadata error", str(e))
return {
"success": False,
"error": f"导出扩展包元数据失败: {str(e)}"
}