优化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 subprocess
import tempfile
import datetime
from pathlib import Path
from typing import Dict, List, Any, Optional
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.export_file import export_pg
from jingrow import _
@jingrow.whitelist()
@ -647,14 +650,17 @@ def get_pagetype_module_app(pagetype: str) -> Dict[str, Any]:
module = get_pagetype_module(pagetype)
module_scrub = jingrow.scrub(module)
# 首先从 module_app 映射获取O(1) 字典查找)
# 先查缓存
app = jingrow.local.module_app.get(module_scrub)
# 如果找不到,查询数据库(可能是 custom module
# 未命中则一次性读取 Module Defcustom 优先 package否则取 app_name最后兜底
if app is None:
app_name = jingrow.db.get_value("Module Def", {"module_name": module}, "app_name", ignore=True)
app = app_name
# 将结果回写到 module_app 映射,下次直接命中(优化性能)
module_def = jingrow.get_pg("Module Def", {"module_name": module})
if module_def.custom:
app = module_def.package or module_def.app_name
else:
app = get_module_app(module)
jingrow.local.module_app[module_scrub] = app
return {
@ -832,3 +838,92 @@ def install_package(package_file_url: str) -> Dict[str, Any]:
except Exception as 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)}"
}