cms/scripts/load_path.py
yumoqing 20602fadfb refactor: 钉钉审批独立为 dingdingflow 模块,cms 侧剔除
- 删除 cms/dingtalk_client.py、dd_approvals*/dd_approval_configs* 的 models/json/dspy(共14文件)
- cms/init.py 删钉钉段 355 行(792->450)
- submit_content_for_approval 改走 ServerEnv 软依赖调 submit_approval,
  未加载 dingdingflow 时只置 pending 不报错
- 新增 on_content_approval_done 回调钩子:原先硬编码在钉钉回调里的
  cms_content 回写逻辑归位到 cms 自己,由 load_cms() 注册到 content_publish
- load_path 移除 11 条钉钉路径;i18n 移除钉钉专属文案;README 更新依赖说明
2026-08-25 18:17:04 +08:00

105 lines
3.3 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.

"""
cms 模块 RBAC 权限配置
CMS管理后台的CRUD页面和API挂载在 /cms/ 路径下
用法:
cd ~/repos/portal
py3/bin/python ~/repos/cms/scripts/load_path.py
"""
import subprocess, os, sys
def find_portal_root():
candidates = [
os.path.expanduser("~/repos/portal"),
os.path.expanduser("~/portal"),
]
for c in candidates:
if os.path.isdir(os.path.join(c, "py3")):
return c
# fallback: sage
for c in [os.path.expanduser("~/repos/sage"), os.path.expanduser("~/sage")]:
if os.path.isdir(os.path.join(c, "py3")):
return c
return None
PORTAL_ROOT = find_portal_root()
if not PORTAL_ROOT:
print("ERROR: Cannot find Portal or Sage root")
sys.exit(1)
PYTHON = os.path.join(PORTAL_ROOT, "py3", "bin", "python")
SET_PERM = os.path.join(PORTAL_ROOT, "set_role_perm.py")
if not os.path.exists(SET_PERM):
for c in [os.path.expanduser("~/repos/sage"), os.path.expanduser("~/sage")]:
sp = os.path.join(c, "set_role_perm.py")
if os.path.exists(sp):
SET_PERM = sp
break
MOD = "cms"
env = os.environ.copy()
env['SAGE_RBAC_DB'] = 'ocai_cms'
# CMS管理后台所有路径
PATHS = [
f"/{MOD}",
f"/{MOD}/admin.ui",
f"/{MOD}/menu.ui",
# Content
f"/{MOD}/cms_content_list", f"/{MOD}/cms_content_list/%",
f"/{MOD}/api/cms_content_create.dspy",
f"/{MOD}/api/cms_content_update.dspy",
f"/{MOD}/api/cms_content_delete.dspy",
f"/{MOD}/api/cms_content_list.dspy",
f"/{MOD}/api/submit_content_approval.dspy",
# Categories
f"/{MOD}/cms_categories_list", f"/{MOD}/cms_categories_list/%",
f"/{MOD}/api/cms_categories_create.dspy",
f"/{MOD}/api/cms_categories_update.dspy",
f"/{MOD}/api/cms_categories_delete.dspy",
f"/{MOD}/api/cms_categories_list.dspy",
f"/{MOD}/api/category_options.dspy",
# Sections
f"/{MOD}/cms_sections_list", f"/{MOD}/cms_sections_list/%",
f"/{MOD}/api/cms_sections_create.dspy",
f"/{MOD}/api/cms_sections_update.dspy",
f"/{MOD}/api/cms_sections_delete.dspy",
f"/{MOD}/api/cms_sections_list.dspy",
# Leads
f"/{MOD}/cms_leads_list", f"/{MOD}/cms_leads_list/%",
f"/{MOD}/api/cms_leads_create.dspy",
f"/{MOD}/api/cms_leads_update.dspy",
f"/{MOD}/api/cms_leads_delete.dspy",
f"/{MOD}/api/cms_leads_list.dspy",
# Site Config
f"/{MOD}/cms_site_config_list", f"/{MOD}/cms_site_config_list/%",
f"/{MOD}/api/cms_site_config_create.dspy",
f"/{MOD}/api/cms_site_config_update.dspy",
f"/{MOD}/api/cms_site_config_delete.dspy",
f"/{MOD}/api/cms_site_config_list.dspy",
# DD Approvals
# DD Approval Configs
# DingTalk
f"/{MOD}/api/submit_approval.dspy",
# Export (in portal wwwroot/api/, not /cms/ prefix)
f"/api/export_leads.dspy",
f"/api/export_content.dspy",
]
def run(role, paths):
count = 0
for p in paths:
result = subprocess.run(
[PYTHON, SET_PERM, role, p],
cwd=PORTAL_ROOT, capture_output=True, text=True, env=env
)
status = "" if result.returncode == 0 else ""
print(f" {status} {role:20s} {p}")
count += 1
return count
print(f"=== CMS模块 RBAC权限初始化 ===")
print(f"Portal: {PORTAL_ROOT}")
n = run("owner.superuser", PATHS)
print(f"\n完成: {n} 个权限已设置")