cms/scripts/load_path.py
Hermes Agent 4495e9589b refactor: 从独立webapp重构为纯Sage模块
- cms/: Python包(合并原entcms+dingdingflow)
  - init.py: 791行,load_cms()注册所有CRUD+审批函数
  - dingtalk_client.py: 钉钉API客户端
- models/: 7个表定义JSON(5个CMS+2个DD)
- json/: 7个CRUD定义JSON
- wwwroot/: 管理后台CRUD页面和API(37个dspy)
- init/data.yaml: 模块初始数据(appcodes/appcodes_kv/分类/栏目/配置)
- scripts/load_path.py: RBAC权限配置
- pyproject.toml: pip-installable包定义
- 删除: app/, conf/, build.sh, entcms/, dingdingflow/等webapp文件
- 数据库访问统一为DBPools()+_get_dbname()动态模式
2026-06-15 11:06:11 +08:00

113 lines
3.7 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
f"/{MOD}/dd_approvals", f"/{MOD}/dd_approvals/%",
f"/{MOD}/api/dd_approvals_create.dspy",
f"/{MOD}/api/dd_approvals_update.dspy",
f"/{MOD}/api/dd_approvals_delete.dspy",
f"/{MOD}/api/dd_approvals_list.dspy",
# DD Approval Configs
f"/{MOD}/dd_approval_configs", f"/{MOD}/dd_approval_configs/%",
f"/{MOD}/api/dd_approval_configs_create.dspy",
f"/{MOD}/api/dd_approval_configs_update.dspy",
f"/{MOD}/api/dd_approval_configs_delete.dspy",
f"/{MOD}/api/dd_approval_configs_list.dspy",
# DingTalk
f"/{MOD}/api/submit_approval.dspy",
f"/{MOD}/api/dingtalk_callback.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} 个权限已设置")