cms/scripts/load_path.py
Hermes Agent d98ef560c0 feat: add Excel export for leads and content
- export_leads.dspy: generate xlsx with openpyxl, base64 return
- export_content.dspy: generate xlsx for content list
- admin.ui: add export section with download buttons
- load_path.py: register export endpoints for RBAC
- pyproject.toml: add openpyxl dependency
2026-06-15 16:24:02 +08:00

116 lines
3.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.

"""
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",
# Export
f"/{MOD}/api/export_leads.dspy",
f"/{MOD}/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} 个权限已设置")