fix: 全面修复所有dspy文件和数据库访问模式

dspy文件修复(27个entcms + 10个dingdingflow):
- 删除所有import语句(dspy环境已预加载)
- 替换 sor = DBPools().sqlorContext() 为 async with db.sqlorContext() as sor:
- 替换 print(json.dumps()) 为 return
- 替换 uuid() 为 getID()
- 替换 datetime.datetime.now() 为 datetime.now()
- 修复 get_user() 缺少 await
- 删除shebang/docstrings等无关内容
- 修正缩进

Python模块修复:
- entcms/init.py: DBNAME从'entcms'改为'ocai_cms'
- app/global_func.py: get_module_dbname返回'ocai_cms'而非'sage'
- 所有函数使用 async with db.sqlorContext() as sor: 正确模式
This commit is contained in:
yumoqing 2026-06-03 18:04:53 +08:00
parent 7abdc336b7
commit f70e8e4d26
39 changed files with 596 additions and 717 deletions

View File

@ -4,8 +4,8 @@ CMS全局函数 — 注册到ServerEnv供.dspy和.ui调用
from ahserver.serverenv import ServerEnv from ahserver.serverenv import ServerEnv
def get_module_dbname(mname): def get_module_dbname(mname):
"""所有模块共享sage数据库""" """CMS应用统一使用ocai_cms数据库"""
return 'sage' return 'ocai_cms'
def UiWindow(title, icon, content, cheight=10, cwidth=15): def UiWindow(title, icon, content, cheight=10, cwidth=15):
return { return {

View File

@ -10,7 +10,7 @@ from sqlor.dbpools import DBPools
MODULE_NAME = "entcms" MODULE_NAME = "entcms"
MODULE_VERSION = "1.0.0" MODULE_VERSION = "1.0.0"
DBNAME = "entcms" DBNAME = "ocai_cms"
# ===== CMS Content CRUD ===== # ===== CMS Content CRUD =====

View File

@ -1,10 +1,8 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.') config = getConfig('.')
DBPools(config.databases) DBPools(config.databases)
dbname = get_module_dbname('entcms') dbname = get_module_dbname('entcms')
sor = DBPools().sqlorContext(dbname) async with db.sqlorContext(dbname) as sor:
content_type = params_kw.get('content_type', None) content_type = params_kw.get('content_type', None)
ns = {'sort': 'sort_order asc'} ns = {'sort': 'sort_order asc'}
@ -12,4 +10,4 @@ if content_type:
ns['content_type'] = content_type ns['content_type'] = content_type
rows = await sor.R('cms_categories', ns) rows = await sor.R('cms_categories', ns)
options = [{'value': r['id'], 'text': r['name']} for r in rows] options = [{'value': r['id'], 'text': r['name']} for r in rows]
print(json.dumps({'status': 'ok', 'data': {'options': options}}, ensure_ascii=False)) return {'status': 'ok', 'data': {'options': options}}

View File

@ -1,10 +1,8 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.') config = getConfig('.')
DBPools(config.databases) DBPools(config.databases)
dbname = get_module_dbname('entcms') dbname = get_module_dbname('entcms')
sor = DBPools().sqlorContext(dbname) async with db.sqlorContext(dbname) as sor:
data = {'id': getID()} data = {'id': getID()}
@ -33,4 +31,4 @@ if v is not None:
data['sort_order'] = v data['sort_order'] = v
await sor.C('cms_categories', data) await sor.C('cms_categories', data)
print(json.dumps({'widgettype': 'Message', 'options': {'text': '创建成功', 'messagetype': 'success'}}, ensure_ascii=False)) return {'widgettype': 'Message', 'options': {'text': '创建成功', 'messagetype': 'success'}}

View File

@ -1,14 +1,11 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.') config = getConfig('.')
DBPools(config.databases) DBPools(config.databases)
dbname = get_module_dbname('entcms') dbname = get_module_dbname('entcms')
sor = DBPools().sqlorContext(dbname) async with db.sqlorContext(dbname) as sor:
_id = params_kw.get('id', '') _id = params_kw.get('id', '')
if not _id: if not _id:
print(json.dumps({'widgettype': 'Message', 'options': {'text': '缺少ID', 'messagetype': 'error'}}, ensure_ascii=False)) return {'widgettype': 'Message', 'options': {'text': '缺少ID', 'messagetype': 'error'}}
return
await sor.D('cms_categories', {'id': _id}) await sor.D('cms_categories', {'id': _id})
print(json.dumps({'widgettype': 'Message', 'options': {'text': '删除成功', 'messagetype': 'success'}}, ensure_ascii=False)) return {'widgettype': 'Message', 'options': {'text': '删除成功', 'messagetype': 'success'}}

View File

@ -1,10 +1,8 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.') config = getConfig('.')
DBPools(config.databases) DBPools(config.databases)
dbname = get_module_dbname('entcms') dbname = get_module_dbname('entcms')
sor = DBPools().sqlorContext(dbname) async with db.sqlorContext(dbname) as sor:
ns = {'sort': 'sort_order asc'} ns = {'sort': 'sort_order asc'}
@ -29,4 +27,4 @@ if _content_type:
rows = await sor.R('cms_categories', ns) rows = await sor.R('cms_categories', ns)
total = len(rows) total = len(rows)
print(json.dumps({'status': 'ok', 'rows': rows, 'total': total}, ensure_ascii=False)) return {'status': 'ok', 'rows': rows, 'total': total}

View File

@ -1,15 +1,12 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.') config = getConfig('.')
DBPools(config.databases) DBPools(config.databases)
dbname = get_module_dbname('entcms') dbname = get_module_dbname('entcms')
sor = DBPools().sqlorContext(dbname) async with db.sqlorContext(dbname) as sor:
data = {'id': params_kw.get('id', '')} data = {'id': params_kw.get('id', '')}
if not data['id']: if not data['id']:
print(json.dumps({'widgettype': 'Message', 'options': {'text': '缺少ID', 'messagetype': 'error'}}, ensure_ascii=False)) return {'widgettype': 'Message', 'options': {'text': '缺少ID', 'messagetype': 'error'}}
return
v = params_kw.get('org_id', None) v = params_kw.get('org_id', None)
if v is not None: if v is not None:
@ -36,4 +33,4 @@ if v is not None:
data['sort_order'] = v data['sort_order'] = v
await sor.U('cms_categories', data) await sor.U('cms_categories', data)
print(json.dumps({'widgettype': 'Message', 'options': {'text': '更新成功', 'messagetype': 'success'}}, ensure_ascii=False)) return {'widgettype': 'Message', 'options': {'text': '更新成功', 'messagetype': 'success'}}

View File

@ -1,10 +1,8 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.') config = getConfig('.')
DBPools(config.databases) DBPools(config.databases)
dbname = get_module_dbname('entcms') dbname = get_module_dbname('entcms')
sor = DBPools().sqlorContext(dbname) async with db.sqlorContext(dbname) as sor:
data = {'id': getID()} data = {'id': getID()}
@ -57,4 +55,4 @@ if v is not None:
data['extra_json'] = v data['extra_json'] = v
await sor.C('cms_content', data) await sor.C('cms_content', data)
print(json.dumps({'widgettype': 'Message', 'options': {'text': '创建成功', 'messagetype': 'success'}}, ensure_ascii=False)) return {'widgettype': 'Message', 'options': {'text': '创建成功', 'messagetype': 'success'}}

View File

@ -1,14 +1,11 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.') config = getConfig('.')
DBPools(config.databases) DBPools(config.databases)
dbname = get_module_dbname('entcms') dbname = get_module_dbname('entcms')
sor = DBPools().sqlorContext(dbname) async with db.sqlorContext(dbname) as sor:
_id = params_kw.get('id', '') _id = params_kw.get('id', '')
if not _id: if not _id:
print(json.dumps({'widgettype': 'Message', 'options': {'text': '缺少ID', 'messagetype': 'error'}}, ensure_ascii=False)) return {'widgettype': 'Message', 'options': {'text': '缺少ID', 'messagetype': 'error'}}
return
await sor.D('cms_content', {'id': _id}) await sor.D('cms_content', {'id': _id})
print(json.dumps({'widgettype': 'Message', 'options': {'text': '删除成功', 'messagetype': 'success'}}, ensure_ascii=False)) return {'widgettype': 'Message', 'options': {'text': '删除成功', 'messagetype': 'success'}}

View File

@ -1,10 +1,8 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.') config = getConfig('.')
DBPools(config.databases) DBPools(config.databases)
dbname = get_module_dbname('entcms') dbname = get_module_dbname('entcms')
sor = DBPools().sqlorContext(dbname) async with db.sqlorContext(dbname) as sor:
ns = {'sort': 'sort_order asc, created_at desc'} ns = {'sort': 'sort_order asc, created_at desc'}
@ -33,4 +31,4 @@ if _status:
rows = await sor.R('cms_content', ns) rows = await sor.R('cms_content', ns)
total = len(rows) total = len(rows)
print(json.dumps({'status': 'ok', 'rows': rows, 'total': total}, ensure_ascii=False)) return {'status': 'ok', 'rows': rows, 'total': total}

View File

@ -1,15 +1,12 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.') config = getConfig('.')
DBPools(config.databases) DBPools(config.databases)
dbname = get_module_dbname('entcms') dbname = get_module_dbname('entcms')
sor = DBPools().sqlorContext(dbname) async with db.sqlorContext(dbname) as sor:
data = {'id': params_kw.get('id', '')} data = {'id': params_kw.get('id', '')}
if not data['id']: if not data['id']:
print(json.dumps({'widgettype': 'Message', 'options': {'text': '缺少ID', 'messagetype': 'error'}}, ensure_ascii=False)) return {'widgettype': 'Message', 'options': {'text': '缺少ID', 'messagetype': 'error'}}
return
v = params_kw.get('org_id', None) v = params_kw.get('org_id', None)
if v is not None: if v is not None:
@ -68,4 +65,4 @@ if v is not None:
data['published_at'] = v data['published_at'] = v
await sor.U('cms_content', data) await sor.U('cms_content', data)
print(json.dumps({'widgettype': 'Message', 'options': {'text': '更新成功', 'messagetype': 'success'}}, ensure_ascii=False)) return {'widgettype': 'Message', 'options': {'text': '更新成功', 'messagetype': 'success'}}

View File

@ -1,10 +1,8 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.') config = getConfig('.')
DBPools(config.databases) DBPools(config.databases)
dbname = get_module_dbname('entcms') dbname = get_module_dbname('entcms')
sor = DBPools().sqlorContext(dbname) async with db.sqlorContext(dbname) as sor:
data = {'id': getID()} data = {'id': getID()}
@ -65,4 +63,4 @@ if v is not None:
data['notes'] = v data['notes'] = v
await sor.C('cms_leads', data) await sor.C('cms_leads', data)
print(json.dumps({'widgettype': 'Message', 'options': {'text': '创建成功', 'messagetype': 'success'}}, ensure_ascii=False)) return {'widgettype': 'Message', 'options': {'text': '创建成功', 'messagetype': 'success'}}

View File

@ -1,14 +1,11 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.') config = getConfig('.')
DBPools(config.databases) DBPools(config.databases)
dbname = get_module_dbname('entcms') dbname = get_module_dbname('entcms')
sor = DBPools().sqlorContext(dbname) async with db.sqlorContext(dbname) as sor:
_id = params_kw.get('id', '') _id = params_kw.get('id', '')
if not _id: if not _id:
print(json.dumps({'widgettype': 'Message', 'options': {'text': '缺少ID', 'messagetype': 'error'}}, ensure_ascii=False)) return {'widgettype': 'Message', 'options': {'text': '缺少ID', 'messagetype': 'error'}}
return
await sor.D('cms_leads', {'id': _id}) await sor.D('cms_leads', {'id': _id})
print(json.dumps({'widgettype': 'Message', 'options': {'text': '删除成功', 'messagetype': 'success'}}, ensure_ascii=False)) return {'widgettype': 'Message', 'options': {'text': '删除成功', 'messagetype': 'success'}}

View File

@ -1,10 +1,8 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.') config = getConfig('.')
DBPools(config.databases) DBPools(config.databases)
dbname = get_module_dbname('entcms') dbname = get_module_dbname('entcms')
sor = DBPools().sqlorContext(dbname) async with db.sqlorContext(dbname) as sor:
ns = {'sort': 'created_at desc'} ns = {'sort': 'created_at desc'}
@ -33,4 +31,4 @@ if _source:
rows = await sor.R('cms_leads', ns) rows = await sor.R('cms_leads', ns)
total = len(rows) total = len(rows)
print(json.dumps({'status': 'ok', 'rows': rows, 'total': total}, ensure_ascii=False)) return {'status': 'ok', 'rows': rows, 'total': total}

View File

@ -1,15 +1,12 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.') config = getConfig('.')
DBPools(config.databases) DBPools(config.databases)
dbname = get_module_dbname('entcms') dbname = get_module_dbname('entcms')
sor = DBPools().sqlorContext(dbname) async with db.sqlorContext(dbname) as sor:
data = {'id': params_kw.get('id', '')} data = {'id': params_kw.get('id', '')}
if not data['id']: if not data['id']:
print(json.dumps({'widgettype': 'Message', 'options': {'text': '缺少ID', 'messagetype': 'error'}}, ensure_ascii=False)) return {'widgettype': 'Message', 'options': {'text': '缺少ID', 'messagetype': 'error'}}
return
v = params_kw.get('org_id', None) v = params_kw.get('org_id', None)
if v is not None: if v is not None:
@ -68,4 +65,4 @@ if v is not None:
data['notes'] = v data['notes'] = v
await sor.U('cms_leads', data) await sor.U('cms_leads', data)
print(json.dumps({'widgettype': 'Message', 'options': {'text': '更新成功', 'messagetype': 'success'}}, ensure_ascii=False)) return {'widgettype': 'Message', 'options': {'text': '更新成功', 'messagetype': 'success'}}

View File

@ -1,10 +1,8 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.') config = getConfig('.')
DBPools(config.databases) DBPools(config.databases)
dbname = get_module_dbname('entcms') dbname = get_module_dbname('entcms')
sor = DBPools().sqlorContext(dbname) async with db.sqlorContext(dbname) as sor:
data = {'id': getID()} data = {'id': getID()}
v = params_kw.get('org_id', None) v = params_kw.get('org_id', None)
@ -41,4 +39,4 @@ v = params_kw.get('static_content', None)
if v is not None: if v is not None:
data['static_content'] = v data['static_content'] = v
await sor.C('cms_sections', data) await sor.C('cms_sections', data)
print(json.dumps({'widgettype': 'Message', 'options': {'text': '创建成功', 'messagetype': 'success'}}, ensure_ascii=False)) return {'widgettype': 'Message', 'options': {'text': '创建成功', 'messagetype': 'success'}}

View File

@ -1,14 +1,11 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.') config = getConfig('.')
DBPools(config.databases) DBPools(config.databases)
dbname = get_module_dbname('entcms') dbname = get_module_dbname('entcms')
sor = DBPools().sqlorContext(dbname) async with db.sqlorContext(dbname) as sor:
_id = params_kw.get('id', '') _id = params_kw.get('id', '')
if not _id: if not _id:
print(json.dumps({'widgettype': 'Message', 'options': {'text': '缺少ID', 'messagetype': 'error'}}, ensure_ascii=False)) return {'widgettype': 'Message', 'options': {'text': '缺少ID', 'messagetype': 'error'}}
return
await sor.D('cms_sections', {'id': _id}) await sor.D('cms_sections', {'id': _id})
print(json.dumps({'widgettype': 'Message', 'options': {'text': '删除成功', 'messagetype': 'success'}}, ensure_ascii=False)) return {'widgettype': 'Message', 'options': {'text': '删除成功', 'messagetype': 'success'}}

View File

@ -1,10 +1,8 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.') config = getConfig('.')
DBPools(config.databases) DBPools(config.databases)
dbname = get_module_dbname('entcms') dbname = get_module_dbname('entcms')
sor = DBPools().sqlorContext(dbname) async with db.sqlorContext(dbname) as sor:
ns = {'sort': 'sort_order asc'} ns = {'sort': 'sort_order asc'}
filter_json = params_kw.get('data_filter', None) filter_json = params_kw.get('data_filter', None)
@ -19,4 +17,4 @@ if filter_json:
except Exception: except Exception:
pass pass
rows = await sor.R('cms_sections', ns) rows = await sor.R('cms_sections', ns)
print(json.dumps({'status': 'ok', 'rows': rows, 'total': len(rows)}, ensure_ascii=False)) return {'status': 'ok', 'rows': rows, 'total': len(rows)}

View File

@ -1,15 +1,12 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.') config = getConfig('.')
DBPools(config.databases) DBPools(config.databases)
dbname = get_module_dbname('entcms') dbname = get_module_dbname('entcms')
sor = DBPools().sqlorContext(dbname) async with db.sqlorContext(dbname) as sor:
data = {'id': params_kw.get('id', '')} data = {'id': params_kw.get('id', '')}
if not data['id']: if not data['id']:
print(json.dumps({'widgettype': 'Message', 'options': {'text': '缺少ID', 'messagetype': 'error'}}, ensure_ascii=False)) return {'widgettype': 'Message', 'options': {'text': '缺少ID', 'messagetype': 'error'}}
return
v = params_kw.get('org_id', None) v = params_kw.get('org_id', None)
if v is not None: if v is not None:
data['org_id'] = v data['org_id'] = v
@ -44,4 +41,4 @@ v = params_kw.get('static_content', None)
if v is not None: if v is not None:
data['static_content'] = v data['static_content'] = v
await sor.U('cms_sections', data) await sor.U('cms_sections', data)
print(json.dumps({'widgettype': 'Message', 'options': {'text': '更新成功', 'messagetype': 'success'}}, ensure_ascii=False)) return {'widgettype': 'Message', 'options': {'text': '更新成功', 'messagetype': 'success'}}

View File

@ -1,10 +1,8 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.') config = getConfig('.')
DBPools(config.databases) DBPools(config.databases)
dbname = get_module_dbname('entcms') dbname = get_module_dbname('entcms')
sor = DBPools().sqlorContext(dbname) async with db.sqlorContext(dbname) as sor:
data = {'id': getID()} data = {'id': getID()}
@ -33,4 +31,4 @@ if v is not None:
data['sort_order'] = v data['sort_order'] = v
await sor.C('cms_site_config', data) await sor.C('cms_site_config', data)
print(json.dumps({'widgettype': 'Message', 'options': {'text': '创建成功', 'messagetype': 'success'}}, ensure_ascii=False)) return {'widgettype': 'Message', 'options': {'text': '创建成功', 'messagetype': 'success'}}

View File

@ -1,14 +1,11 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.') config = getConfig('.')
DBPools(config.databases) DBPools(config.databases)
dbname = get_module_dbname('entcms') dbname = get_module_dbname('entcms')
sor = DBPools().sqlorContext(dbname) async with db.sqlorContext(dbname) as sor:
_id = params_kw.get('id', '') _id = params_kw.get('id', '')
if not _id: if not _id:
print(json.dumps({'widgettype': 'Message', 'options': {'text': '缺少ID', 'messagetype': 'error'}}, ensure_ascii=False)) return {'widgettype': 'Message', 'options': {'text': '缺少ID', 'messagetype': 'error'}}
return
await sor.D('cms_site_config', {'id': _id}) await sor.D('cms_site_config', {'id': _id})
print(json.dumps({'widgettype': 'Message', 'options': {'text': '删除成功', 'messagetype': 'success'}}, ensure_ascii=False)) return {'widgettype': 'Message', 'options': {'text': '删除成功', 'messagetype': 'success'}}

View File

@ -1,10 +1,8 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.') config = getConfig('.')
DBPools(config.databases) DBPools(config.databases)
dbname = get_module_dbname('entcms') dbname = get_module_dbname('entcms')
sor = DBPools().sqlorContext(dbname) async with db.sqlorContext(dbname) as sor:
ns = {'sort': 'config_group asc, sort_order asc'} ns = {'sort': 'config_group asc, sort_order asc'}
@ -29,4 +27,4 @@ if _config_group:
rows = await sor.R('cms_site_config', ns) rows = await sor.R('cms_site_config', ns)
total = len(rows) total = len(rows)
print(json.dumps({'status': 'ok', 'rows': rows, 'total': total}, ensure_ascii=False)) return {'status': 'ok', 'rows': rows, 'total': total}

View File

@ -1,15 +1,12 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.') config = getConfig('.')
DBPools(config.databases) DBPools(config.databases)
dbname = get_module_dbname('entcms') dbname = get_module_dbname('entcms')
sor = DBPools().sqlorContext(dbname) async with db.sqlorContext(dbname) as sor:
data = {'id': params_kw.get('id', '')} data = {'id': params_kw.get('id', '')}
if not data['id']: if not data['id']:
print(json.dumps({'widgettype': 'Message', 'options': {'text': '缺少ID', 'messagetype': 'error'}}, ensure_ascii=False)) return {'widgettype': 'Message', 'options': {'text': '缺少ID', 'messagetype': 'error'}}
return
v = params_kw.get('org_id', None) v = params_kw.get('org_id', None)
if v is not None: if v is not None:
@ -36,4 +33,4 @@ if v is not None:
data['sort_order'] = v data['sort_order'] = v
await sor.U('cms_site_config', data) await sor.U('cms_site_config', data)
print(json.dumps({'widgettype': 'Message', 'options': {'text': '更新成功', 'messagetype': 'success'}}, ensure_ascii=False)) return {'widgettype': 'Message', 'options': {'text': '更新成功', 'messagetype': 'success'}}

View File

@ -1,10 +1,8 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.') config = getConfig('.')
DBPools(config.databases) DBPools(config.databases)
dbname = get_module_dbname('entcms') dbname = get_module_dbname('entcms')
sor = DBPools().sqlorContext(dbname) async with db.sqlorContext(dbname) as sor:
group = params_kw.get('group', None) group = params_kw.get('group', None)
ns = {'sort': 'sort_order asc'} ns = {'sort': 'sort_order asc'}
@ -17,4 +15,4 @@ for r in rows:
if g not in result: if g not in result:
result[g] = {} result[g] = {}
result[g][r.get('config_key', '')] = r.get('config_value', '') result[g][r.get('config_key', '')] = r.get('config_value', '')
print(json.dumps({'status': 'ok', 'data': result}, ensure_ascii=False)) return {'status': 'ok', 'data': result}

View File

@ -1,18 +1,16 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.') config = getConfig('.')
DBPools(config.databases) DBPools(config.databases)
dbname = get_module_dbname('entcms') dbname = get_module_dbname('entcms')
sor = DBPools().sqlorContext(dbname) async with db.sqlorContext(dbname) as sor:
_id = params_kw.get('id', '') _id = params_kw.get('id', '')
if not _id: if not _id:
print(json.dumps({'status': 'error', 'message': '缺少ID'}, ensure_ascii=False)) return {'status': 'error', 'message': '缺少ID'}
else: else:
ns = {'id': _id} ns = {'id': _id}
rows = await sor.R('cms_content', ns) rows = await sor.R('cms_content', ns)
if rows: if rows:
print(json.dumps({'status': 'ok', 'data': rows[0]}, ensure_ascii=False)) return {'status': 'ok', 'data': rows[0]}
else: else:
print(json.dumps({'status': 'error', 'message': '内容不存在'}, ensure_ascii=False)) return {'status': 'error', 'message': '内容不存在'}

View File

@ -1,10 +1,8 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.') config = getConfig('.')
DBPools(config.databases) DBPools(config.databases)
dbname = get_module_dbname('entcms') dbname = get_module_dbname('entcms')
sor = DBPools().sqlorContext(dbname) async with db.sqlorContext(dbname) as sor:
content_type = params_kw.get('content_type', None) content_type = params_kw.get('content_type', None)
limit = int(params_kw.get('limit', '10')) limit = int(params_kw.get('limit', '10'))
@ -14,4 +12,4 @@ if content_type:
rows = await sor.R('cms_content', ns) rows = await sor.R('cms_content', ns)
if limit: if limit:
rows = rows[:limit] rows = rows[:limit]
print(json.dumps({'status': 'ok', 'rows': rows, 'total': len(rows)}, ensure_ascii=False)) return {'status': 'ok', 'rows': rows, 'total': len(rows)}

View File

@ -1,10 +1,8 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.') config = getConfig('.')
DBPools(config.databases) DBPools(config.databases)
dbname = get_module_dbname('entcms') dbname = get_module_dbname('entcms')
sor = DBPools().sqlorContext(dbname) async with db.sqlorContext(dbname) as sor:
ns = {'is_visible': '1', 'sort': 'sort_order asc'} ns = {'is_visible': '1', 'sort': 'sort_order asc'}
rows = await sor.R('cms_sections', ns) rows = await sor.R('cms_sections', ns)
@ -17,4 +15,4 @@ for r in rows:
r[field] = json.loads(v) r[field] = json.loads(v)
except: except:
pass pass
print(json.dumps({'status': 'ok', 'rows': rows, 'total': len(rows)}, ensure_ascii=False)) return {'status': 'ok', 'rows': rows, 'total': len(rows)}

View File

@ -1,14 +1,12 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.') config = getConfig('.')
DBPools(config.databases) DBPools(config.databases)
dbname = get_module_dbname('entcms') dbname = get_module_dbname('entcms')
sor = DBPools().sqlorContext(dbname) async with db.sqlorContext(dbname) as sor:
content_id = params_kw.get('content_id', '') content_id = params_kw.get('content_id', '')
if not content_id: if not content_id:
print(json.dumps({'widgettype': 'Message', 'options': {'text': '缺少内容ID', 'messagetype': 'error'}}, ensure_ascii=False)) return {'widgettype': 'Message', 'options': {'text': '缺少内容ID', 'messagetype': 'error'}}
else: else:
# Update status to pending # Update status to pending
await sor.U('cms_content', {'id': content_id, 'status': 'pending'}) await sor.U('cms_content', {'id': content_id, 'status': 'pending'})
@ -23,6 +21,6 @@ else:
result = await submit_approval('content_publish', content_id, title, user_id) result = await submit_approval('content_publish', content_id, title, user_id)
if result and result.get('approval_id'): if result and result.get('approval_id'):
await sor.U('cms_content', {'id': content_id, 'approval_id': result['approval_id']}) await sor.U('cms_content', {'id': content_id, 'approval_id': result['approval_id']})
print(json.dumps({'widgettype': 'Message', 'options': {'text': '已提交审批', 'messagetype': 'success'}}, ensure_ascii=False)) return {'widgettype': 'Message', 'options': {'text': '已提交审批', 'messagetype': 'success'}}
except ImportError: except ImportError:
print(json.dumps({'widgettype': 'Message', 'options': {'text': '审批模块未安装,状态已改为待审批', 'messagetype': 'warning'}}, ensure_ascii=False)) return {'widgettype': 'Message', 'options': {'text': '审批模块未安装,状态已改为待审批', 'messagetype': 'warning'}}

View File

@ -1,10 +1,7 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.') config = getConfig('.')
DBPools(config.databases) DBPools(config.databases)
dbname = get_module_dbname('entcms') dbname = get_module_dbname('entcms')
sor = DBPools().sqlorContext(dbname) async with db.sqlorContext(dbname) as sor:
data = { data = {
'id': getID(), 'id': getID(),
@ -19,7 +16,7 @@ for field in ['name', 'company', 'phone', 'email', 'industry', 'region',
data[field] = v data[field] = v
await sor.C('cms_leads', data) await sor.C('cms_leads', data)
print(json.dumps({ return {
'widgettype': 'Message', 'widgettype': 'Message',
'options': {'text': '感谢您的留言,我们会尽快联系您!', 'messagetype': 'success'} 'options': {'text': '感谢您的留言,我们会尽快联系您!', 'messagetype': 'success'}
}, ensure_ascii=False)) }

View File

@ -1,7 +1,3 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""dd_approval_configs create API"""
result = {'widgettype': 'Message', 'options': {'title': 'Error', 'message': 'Invalid request', 'type': 'error'}} result = {'widgettype': 'Message', 'options': {'title': 'Error', 'message': 'Invalid request', 'type': 'error'}}
try: try:
@ -12,9 +8,9 @@ try:
if not biz_type: if not biz_type:
result['options'] = {'title': 'Error', 'message': 'biz_type is required', 'type': 'error'} result['options'] = {'title': 'Error', 'message': 'biz_type is required', 'type': 'error'}
else: else:
new_id = uuid() new_id = getID()
org_id = (await get_userorgid()) or '0' org_id = (await get_userorgid()) or '0'
now_str = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') now_str = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
dbname = get_module_dbname('dingdingflow') dbname = get_module_dbname('dingdingflow')
async with DBPools().sqlorContext(dbname) as sor: async with DBPools().sqlorContext(dbname) as sor:
@ -38,4 +34,4 @@ try:
except Exception as e: except Exception as e:
result['options'] = {'title': 'Error', 'message': f'创建失败: {str(e)}', 'type': 'error'} result['options'] = {'title': 'Error', 'message': f'创建失败: {str(e)}', 'type': 'error'}
return json.dumps(result, ensure_ascii=False) return result

View File

@ -1,7 +1,3 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""dd_approval_configs delete API"""
result = {'widgettype': 'Message', 'options': {'title': 'Error', 'message': 'Invalid request', 'type': 'error'}} result = {'widgettype': 'Message', 'options': {'title': 'Error', 'message': 'Invalid request', 'type': 'error'}}
try: try:
@ -17,4 +13,4 @@ try:
except Exception as e: except Exception as e:
result['options'] = {'title': 'Error', 'message': f'删除失败: {str(e)}', 'type': 'error'} result['options'] = {'title': 'Error', 'message': f'删除失败: {str(e)}', 'type': 'error'}
return json.dumps(result, ensure_ascii=False) return result

View File

@ -1,7 +1,3 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""dd_approval_configs list API"""
result = {'success': False, 'rows': [], 'total': 0} result = {'success': False, 'rows': [], 'total': 0}
try: try:
@ -55,4 +51,4 @@ try:
except Exception as e: except Exception as e:
result['error'] = str(e) result['error'] = str(e)
return json.dumps(result, ensure_ascii=False, default=str) return result

View File

@ -1,7 +1,3 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""dd_approval_configs update API"""
result = {'widgettype': 'Message', 'options': {'title': 'Error', 'message': 'Invalid request', 'type': 'error'}} result = {'widgettype': 'Message', 'options': {'title': 'Error', 'message': 'Invalid request', 'type': 'error'}}
try: try:
@ -21,7 +17,7 @@ try:
update_ns[field] = val update_ns[field] = val
# Always update updated_at # Always update updated_at
now_str = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') now_str = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
update_fields.append("updated_at=${updated_at}$") update_fields.append("updated_at=${updated_at}$")
update_ns['updated_at'] = now_str update_ns['updated_at'] = now_str
@ -33,4 +29,4 @@ try:
except Exception as e: except Exception as e:
result['options'] = {'title': 'Error', 'message': f'更新失败: {str(e)}', 'type': 'error'} result['options'] = {'title': 'Error', 'message': f'更新失败: {str(e)}', 'type': 'error'}
return json.dumps(result, ensure_ascii=False) return result

View File

@ -1,7 +1,3 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""dd_approvals create API"""
result = {'widgettype': 'Message', 'options': {'title': 'Error', 'message': 'Invalid request', 'type': 'error'}} result = {'widgettype': 'Message', 'options': {'title': 'Error', 'message': 'Invalid request', 'type': 'error'}}
try: try:
@ -13,9 +9,9 @@ try:
if not biz_type or not title: if not biz_type or not title:
result['options'] = {'title': 'Error', 'message': 'biz_type and title are required', 'type': 'error'} result['options'] = {'title': 'Error', 'message': 'biz_type and title are required', 'type': 'error'}
else: else:
new_id = uuid() new_id = getID()
org_id = (await get_userorgid()) or '0' org_id = (await get_userorgid()) or '0'
now_str = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') now_str = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
dbname = get_module_dbname('dingdingflow') dbname = get_module_dbname('dingdingflow')
async with DBPools().sqlorContext(dbname) as sor: async with DBPools().sqlorContext(dbname) as sor:
@ -40,4 +36,4 @@ try:
except Exception as e: except Exception as e:
result['options'] = {'title': 'Error', 'message': f'创建失败: {str(e)}', 'type': 'error'} result['options'] = {'title': 'Error', 'message': f'创建失败: {str(e)}', 'type': 'error'}
return json.dumps(result, ensure_ascii=False) return result

View File

@ -1,7 +1,3 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""dd_approvals delete API"""
result = {'widgettype': 'Message', 'options': {'title': 'Error', 'message': 'Invalid request', 'type': 'error'}} result = {'widgettype': 'Message', 'options': {'title': 'Error', 'message': 'Invalid request', 'type': 'error'}}
try: try:
@ -17,4 +13,4 @@ try:
except Exception as e: except Exception as e:
result['options'] = {'title': 'Error', 'message': f'删除失败: {str(e)}', 'type': 'error'} result['options'] = {'title': 'Error', 'message': f'删除失败: {str(e)}', 'type': 'error'}
return json.dumps(result, ensure_ascii=False) return result

View File

@ -1,7 +1,3 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""dd_approvals list API with data_filter support"""
result = {'success': False, 'rows': [], 'total': 0} result = {'success': False, 'rows': [], 'total': 0}
try: try:
@ -73,4 +69,4 @@ try:
except Exception as e: except Exception as e:
result['error'] = str(e) result['error'] = str(e)
return json.dumps(result, ensure_ascii=False, default=str) return result

View File

@ -1,7 +1,3 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""dd_approvals update API"""
result = {'widgettype': 'Message', 'options': {'title': 'Error', 'message': 'Invalid request', 'type': 'error'}} result = {'widgettype': 'Message', 'options': {'title': 'Error', 'message': 'Invalid request', 'type': 'error'}}
try: try:
@ -33,4 +29,4 @@ try:
except Exception as e: except Exception as e:
result['options'] = {'title': 'Error', 'message': f'更新失败: {str(e)}', 'type': 'error'} result['options'] = {'title': 'Error', 'message': f'更新失败: {str(e)}', 'type': 'error'}
return json.dumps(result, ensure_ascii=False) return result

View File

@ -1,20 +1,3 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
DingTalk webhook callback endpoint.
PUBLIC endpoint (any permission) - DingTalk servers call this when approval status changes.
Expected POST body:
{
"processInstanceId": "xxx",
"processCode": "xxx",
"type": "bpms_instance_change",
"result": "agree" / "refuse",
"staffId": "xxx",
"remark": "optional comment"
}
"""
result = {'success': False, 'message': 'Invalid callback'} result = {'success': False, 'message': 'Invalid callback'}
try: try:
@ -59,4 +42,4 @@ try:
except Exception as e: except Exception as e:
result = {'success': False, 'message': f'Callback processing error: {str(e)}'} result = {'success': False, 'message': f'Callback processing error: {str(e)}'}
return json.dumps(result, ensure_ascii=False, default=str) return result

View File

@ -1,10 +1,3 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Submit approval API - triggered by entcms when content needs approval.
Creates a dd_approvals record and calls DingTalk API to start the approval process.
"""
result = {'success': False, 'message': 'Invalid request'} result = {'success': False, 'message': 'Invalid request'}
try: try:
@ -22,7 +15,7 @@ try:
else: else:
# Use current user as applicant if not specified # Use current user as applicant if not specified
if not applicant_id: if not applicant_id:
applicant_id = get_user() or '' applicant_id = (await get_user()) or ''
org_id = (await get_userorgid()) or '0' org_id = (await get_userorgid()) or '0'
@ -33,4 +26,4 @@ try:
except Exception as e: except Exception as e:
result = {'success': False, 'message': f'提交审批失败: {str(e)}'} result = {'success': False, 'message': f'提交审批失败: {str(e)}'}
return json.dumps(result, ensure_ascii=False, default=str) return result