pipeline-app/scripts/load_path.py
yumoqing 4ef2825b59 feat(topbar): 语言按钮前加主题切换+最小化窗口按钮(参考sage)
- 主题按钮:dark/light切换,localStorage持久化,刷新恢复;图标随主题变
- 最小化窗口按钮:bricks.app.show_windows_panel(app-dock.svg图标)
- theme_toggle.js:页面加载恢复主题+同步图标(注册any权限,防401渲染中断)
- merge_i18n补两按钮tip词条
2026-08-29 16:50:44 +08:00

112 lines
4.8 KiB
Python
Raw 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.

#!/usr/bin/env python3
"""Register all pipeline module RBAC permissions in one run."""
import sys, os, asyncio
ROOT = os.path.expanduser("~/pipeline")
sys.path.insert(0, os.path.join(ROOT, "py3", "lib", "python3.10", "site-packages"))
sys.path.insert(0, ROOT)
from sqlor.dbpools import DBPools
from appPublic.jsonConfig import getConfig
from appPublic.folderUtils import ProgramPath
from appPublic.uniqueID import getID
from ahserver.serverenv import ServerEnv
from ahserver.globalEnv import initEnv
PERMS = [
# pipeline-sdlc
("/pipeline-sdlc", "pipeline_sdlc", "logined"),
("/pipeline-sdlc/sd_dashboard/*", "pipeline_sdlc", "logined"),
("/pipeline-sdlc/sd_projects/*", "pipeline_sdlc", "logined"),
("/pipeline-sdlc/sd_project_list/*", "pipeline_sdlc", "logined"),
("/pipeline-sdlc/sd_iterations/*", "pipeline_sdlc", "logined"),
("/pipeline-sdlc/sd_iteration_list/*", "pipeline_sdlc", "logined"),
("/pipeline-sdlc/sd_test_plans/*", "pipeline_sdlc", "logined"),
("/pipeline-sdlc/sd_test_plan_list/*", "pipeline_sdlc", "logined"),
("/pipeline-sdlc/sd_test_cases/*", "pipeline_sdlc", "logined"),
("/pipeline-sdlc/sd_test_case_list/*", "pipeline_sdlc", "logined"),
("/pipeline-sdlc/sd_bugs/*", "pipeline_sdlc", "logined"),
("/pipeline-sdlc/sd_bug_list/*", "pipeline_sdlc", "logined"),
("/pipeline-sdlc/sd_deploy_envs/*", "pipeline_sdlc", "logined"),
("/pipeline-sdlc/sd_deploy_env_list/*", "pipeline_sdlc", "logined"),
("/pipeline-sdlc/sd_review/*", "pipeline_sdlc", "logined"),
("/pipeline-sdlc/api/*", "pipeline_sdlc", "logined"),
# pipeline_core
("/pipeline_core", "pipeline_core", "logined"),
("/pipeline_core/pipelines/*", "pipeline_core", "logined"),
("/pipeline_core/pipeline_steps/*", "pipeline_core", "logined"),
("/pipeline_core/pipeline_versions/*", "pipeline_core", "logined"),
("/pipeline_core/pipeline_editor/*", "pipeline_core", "logined"),
("/pipeline_core/api/*", "pipeline_core", "logined"),
# pipeline_ops
("/pipeline_ops", "pipeline_ops", "logined"),
("/pipeline_ops/api/*", "pipeline_ops", "logined"),
("/pipeline_ops/pipeline_pricing/*", "pipeline_ops", "logined"),
("/pipeline_ops/pipeline_capacity/*", "pipeline_ops", "logined"),
("/pipeline_ops/pipeline_usage_log/*", "pipeline_ops", "logined"),
# pipeline_dist
("/pipeline_dist", "pipeline_dist", "logined"),
("/pipeline_dist/*", "pipeline_dist", "logined"),
# showcase
("/showcase", "showcase", "logined"),
("/showcase/*", "showcase", "logined"),
# app root (any)
("/**", "app", "any"),
("/index.ui", "app", "any"),
("/todo_badge.js", "app", "any"),
("/index_tab.js", "app", "any"),
("/theme_toggle.js", "app", "any"),
("/pipeline-sdlc/index.ui", "pipeline_sdlc", "any"),
("/pipeline_core/index.ui", "pipeline_core", "any"),
("/pipeline_ops/index.ui", "pipeline_ops", "any"),
("/pipeline_dist/index.ui", "pipeline_dist", "any"),
]
async def register():
config = getConfig(ROOT, NS={"workdir": ROOT, "ProgramPath": ProgramPath()})
DBPools(config.databases)
initEnv()
env = ServerEnv()
env.get_module_dbname = lambda m: "pipeline"
async with DBPools().sqlorContext("pipeline") as sor:
total = 0
for path, module, role_name in PERMS:
sql = "SELECT id FROM permission WHERE path=" + repr(path) + " LIMIT 1"
existing = await sor.sqlExe(sql, {})
pid = None
if existing:
pid = existing[0].id
else:
pid = getID()
await sor.C("permission", {
"id": pid, "name": module + ":" + path,
"path": path, "permtype": module
})
total += 1
# 补 role 关联permission 已存在但 rolepermission 缺失时也要补,修复 /** 等历史漏关联)
role_sql = "SELECT id FROM role WHERE name=" + repr(role_name) + " LIMIT 1"
role_recs = await sor.sqlExe(role_sql, {})
if role_recs:
rp_sql = ("SELECT id FROM rolepermission WHERE roleid=" + repr(role_recs[0].id)
+ " AND permid=" + repr(pid) + " LIMIT 1")
rp_existing = await sor.sqlExe(rp_sql, {})
if not rp_existing:
await sor.C("rolepermission", {
"id": getID(),
"roleid": role_recs[0].id,
"permid": pid
})
print(f"Registered {total} new permissions")
# Verify
async with DBPools().sqlorContext("pipeline") as sor:
cnt = await sor.sqlExe(
"SELECT COUNT(*) as n FROM permission WHERE path LIKE '/pipeline%' OR path LIKE '/showcase%'", {})
print(f"Total pipeline permissions: {cnt[0].n}")
if __name__ == "__main__":
asyncio.run(register())