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
def get_module_dbname(mname):
"""所有模块共享sage数据库"""
return 'sage'
"""CMS应用统一使用ocai_cms数据库"""
return 'ocai_cms'
def UiWindow(title, icon, content, cheight=10, cwidth=15):
return {

View File

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

View File

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

View File

@ -1,36 +1,34 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.')
DBPools(config.databases)
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)
if v is not None:
data['org_id'] = v
v = params_kw.get('org_id', None)
if v is not None:
data['org_id'] = v
v = params_kw.get('name', None)
if v is not None:
data['name'] = v
v = params_kw.get('name', None)
if v is not None:
data['name'] = v
v = params_kw.get('parent_id', None)
if v is not None:
data['parent_id'] = v
v = params_kw.get('parent_id', None)
if v is not None:
data['parent_id'] = v
v = params_kw.get('content_type', None)
if v is not None:
data['content_type'] = v
v = params_kw.get('content_type', None)
if v is not None:
data['content_type'] = v
v = params_kw.get('description', None)
if v is not None:
data['description'] = v
v = params_kw.get('description', None)
if v is not None:
data['description'] = v
v = params_kw.get('sort_order', None)
if v is not None:
data['sort_order'] = v
v = params_kw.get('sort_order', None)
if v is not None:
data['sort_order'] = v
await sor.C('cms_categories', data)
print(json.dumps({'widgettype': 'Message', 'options': {'text': '创建成功', 'messagetype': 'success'}}, ensure_ascii=False))
await sor.C('cms_categories', data)
return {'widgettype': 'Message', 'options': {'text': '创建成功', 'messagetype': 'success'}}

View File

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

View File

@ -1,32 +1,30 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.')
DBPools(config.databases)
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'}
# data_filter support
filter_json = params_kw.get('data_filter', None)
if filter_json:
from sqlor.filter import DBFilter
try:
filter_def = json.loads(filter_json) if isinstance(filter_json, str) else filter_json
dbf = DBFilter(filter_def)
conds = dbf.gen(params_kw)
ns.update(conds)
ns.update(dbf.consts)
except Exception:
pass
# data_filter support
filter_json = params_kw.get('data_filter', None)
if filter_json:
from sqlor.filter import DBFilter
try:
filter_def = json.loads(filter_json) if isinstance(filter_json, str) else filter_json
dbf = DBFilter(filter_def)
conds = dbf.gen(params_kw)
ns.update(conds)
ns.update(dbf.consts)
except Exception:
pass
# Manual filter params
# Manual filter params
_content_type = params_kw.get('content_type', None)
if _content_type:
ns['content_type'] = _content_type
_content_type = params_kw.get('content_type', None)
if _content_type:
ns['content_type'] = _content_type
rows = await sor.R('cms_categories', ns)
total = len(rows)
print(json.dumps({'status': 'ok', 'rows': rows, 'total': total}, ensure_ascii=False))
rows = await sor.R('cms_categories', ns)
total = len(rows)
return {'status': 'ok', 'rows': rows, 'total': total}

View File

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

View File

@ -1,60 +1,58 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.')
DBPools(config.databases)
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)
if v is not None:
data['org_id'] = v
v = params_kw.get('org_id', None)
if v is not None:
data['org_id'] = v
v = params_kw.get('content_type', None)
if v is not None:
data['content_type'] = v
v = params_kw.get('content_type', None)
if v is not None:
data['content_type'] = v
v = params_kw.get('category_id', None)
if v is not None:
data['category_id'] = v
v = params_kw.get('category_id', None)
if v is not None:
data['category_id'] = v
v = params_kw.get('title', None)
if v is not None:
data['title'] = v
v = params_kw.get('title', None)
if v is not None:
data['title'] = v
v = params_kw.get('subtitle', None)
if v is not None:
data['subtitle'] = v
v = params_kw.get('subtitle', None)
if v is not None:
data['subtitle'] = v
v = params_kw.get('summary_text', None)
if v is not None:
data['summary_text'] = v
v = params_kw.get('summary_text', None)
if v is not None:
data['summary_text'] = v
v = params_kw.get('body', None)
if v is not None:
data['body'] = v
v = params_kw.get('body', None)
if v is not None:
data['body'] = v
v = params_kw.get('image_url', None)
if v is not None:
data['image_url'] = v
v = params_kw.get('image_url', None)
if v is not None:
data['image_url'] = v
v = params_kw.get('tags', None)
if v is not None:
data['tags'] = v
v = params_kw.get('tags', None)
if v is not None:
data['tags'] = v
v = params_kw.get('sort_order', None)
if v is not None:
data['sort_order'] = v
v = params_kw.get('sort_order', None)
if v is not None:
data['sort_order'] = v
v = params_kw.get('status', None)
if v is not None:
data['status'] = v
v = params_kw.get('status', None)
if v is not None:
data['status'] = v
v = params_kw.get('extra_json', None)
if v is not None:
data['extra_json'] = v
v = params_kw.get('extra_json', None)
if v is not None:
data['extra_json'] = v
await sor.C('cms_content', data)
print(json.dumps({'widgettype': 'Message', 'options': {'text': '创建成功', 'messagetype': 'success'}}, ensure_ascii=False))
await sor.C('cms_content', data)
return {'widgettype': 'Message', 'options': {'text': '创建成功', 'messagetype': 'success'}}

View File

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

View File

@ -1,36 +1,34 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.')
DBPools(config.databases)
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'}
# data_filter support
filter_json = params_kw.get('data_filter', None)
if filter_json:
from sqlor.filter import DBFilter
try:
filter_def = json.loads(filter_json) if isinstance(filter_json, str) else filter_json
dbf = DBFilter(filter_def)
conds = dbf.gen(params_kw)
ns.update(conds)
ns.update(dbf.consts)
except Exception:
pass
# data_filter support
filter_json = params_kw.get('data_filter', None)
if filter_json:
from sqlor.filter import DBFilter
try:
filter_def = json.loads(filter_json) if isinstance(filter_json, str) else filter_json
dbf = DBFilter(filter_def)
conds = dbf.gen(params_kw)
ns.update(conds)
ns.update(dbf.consts)
except Exception:
pass
# Manual filter params
# Manual filter params
_content_type = params_kw.get('content_type', None)
if _content_type:
ns['content_type'] = _content_type
_content_type = params_kw.get('content_type', None)
if _content_type:
ns['content_type'] = _content_type
_status = params_kw.get('status', None)
if _status:
ns['status'] = _status
_status = params_kw.get('status', None)
if _status:
ns['status'] = _status
rows = await sor.R('cms_content', ns)
total = len(rows)
print(json.dumps({'status': 'ok', 'rows': rows, 'total': total}, ensure_ascii=False))
rows = await sor.R('cms_content', ns)
total = len(rows)
return {'status': 'ok', 'rows': rows, 'total': total}

View File

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

View File

@ -1,68 +1,66 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.')
DBPools(config.databases)
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)
if v is not None:
data['org_id'] = v
v = params_kw.get('org_id', None)
if v is not None:
data['org_id'] = v
v = params_kw.get('source', None)
if v is not None:
data['source'] = v
v = params_kw.get('source', None)
if v is not None:
data['source'] = v
v = params_kw.get('name', None)
if v is not None:
data['name'] = v
v = params_kw.get('name', None)
if v is not None:
data['name'] = v
v = params_kw.get('company', None)
if v is not None:
data['company'] = v
v = params_kw.get('company', None)
if v is not None:
data['company'] = v
v = params_kw.get('phone', None)
if v is not None:
data['phone'] = v
v = params_kw.get('phone', None)
if v is not None:
data['phone'] = v
v = params_kw.get('email', None)
if v is not None:
data['email'] = v
v = params_kw.get('email', None)
if v is not None:
data['email'] = v
v = params_kw.get('industry', None)
if v is not None:
data['industry'] = v
v = params_kw.get('industry', None)
if v is not None:
data['industry'] = v
v = params_kw.get('region', None)
if v is not None:
data['region'] = v
v = params_kw.get('region', None)
if v is not None:
data['region'] = v
v = params_kw.get('interest_products', None)
if v is not None:
data['interest_products'] = v
v = params_kw.get('interest_products', None)
if v is not None:
data['interest_products'] = v
v = params_kw.get('message', None)
if v is not None:
data['message'] = v
v = params_kw.get('message', None)
if v is not None:
data['message'] = v
v = params_kw.get('raw_text', None)
if v is not None:
data['raw_text'] = v
v = params_kw.get('raw_text', None)
if v is not None:
data['raw_text'] = v
v = params_kw.get('status', None)
if v is not None:
data['status'] = v
v = params_kw.get('status', None)
if v is not None:
data['status'] = v
v = params_kw.get('assigned_to', None)
if v is not None:
data['assigned_to'] = v
v = params_kw.get('assigned_to', None)
if v is not None:
data['assigned_to'] = v
v = params_kw.get('notes', None)
if v is not None:
data['notes'] = v
v = params_kw.get('notes', None)
if v is not None:
data['notes'] = v
await sor.C('cms_leads', data)
print(json.dumps({'widgettype': 'Message', 'options': {'text': '创建成功', 'messagetype': 'success'}}, ensure_ascii=False))
await sor.C('cms_leads', data)
return {'widgettype': 'Message', 'options': {'text': '创建成功', 'messagetype': 'success'}}

View File

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

View File

@ -1,36 +1,34 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.')
DBPools(config.databases)
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'}
# data_filter support
filter_json = params_kw.get('data_filter', None)
if filter_json:
from sqlor.filter import DBFilter
try:
filter_def = json.loads(filter_json) if isinstance(filter_json, str) else filter_json
dbf = DBFilter(filter_def)
conds = dbf.gen(params_kw)
ns.update(conds)
ns.update(dbf.consts)
except Exception:
pass
# data_filter support
filter_json = params_kw.get('data_filter', None)
if filter_json:
from sqlor.filter import DBFilter
try:
filter_def = json.loads(filter_json) if isinstance(filter_json, str) else filter_json
dbf = DBFilter(filter_def)
conds = dbf.gen(params_kw)
ns.update(conds)
ns.update(dbf.consts)
except Exception:
pass
# Manual filter params
# Manual filter params
_status = params_kw.get('status', None)
if _status:
ns['status'] = _status
_status = params_kw.get('status', None)
if _status:
ns['status'] = _status
_source = params_kw.get('source', None)
if _source:
ns['source'] = _source
_source = params_kw.get('source', None)
if _source:
ns['source'] = _source
rows = await sor.R('cms_leads', ns)
total = len(rows)
print(json.dumps({'status': 'ok', 'rows': rows, 'total': total}, ensure_ascii=False))
rows = await sor.R('cms_leads', ns)
total = len(rows)
return {'status': 'ok', 'rows': rows, 'total': total}

View File

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

View File

@ -1,44 +1,42 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.')
DBPools(config.databases)
dbname = get_module_dbname('entcms')
sor = DBPools().sqlorContext(dbname)
async with db.sqlorContext(dbname) as sor:
data = {'id': getID()}
v = params_kw.get('org_id', None)
if v is not None:
data['org_id'] = v
v = params_kw.get('section_key', None)
if v is not None:
data['section_key'] = v
v = params_kw.get('title', None)
if v is not None:
data['title'] = v
v = params_kw.get('subtitle', None)
if v is not None:
data['subtitle'] = v
v = params_kw.get('section_type', None)
if v is not None:
data['section_type'] = v
v = params_kw.get('content_type', None)
if v is not None:
data['content_type'] = v
v = params_kw.get('sort_order', None)
if v is not None:
data['sort_order'] = v
v = params_kw.get('is_visible', None)
if v is not None:
data['is_visible'] = v
v = params_kw.get('display_config', None)
if v is not None:
data['display_config'] = v
v = params_kw.get('style_config', None)
if v is not None:
data['style_config'] = v
v = params_kw.get('static_content', None)
if v is not None:
data['static_content'] = v
await sor.C('cms_sections', data)
print(json.dumps({'widgettype': 'Message', 'options': {'text': '创建成功', 'messagetype': 'success'}}, ensure_ascii=False))
data = {'id': getID()}
v = params_kw.get('org_id', None)
if v is not None:
data['org_id'] = v
v = params_kw.get('section_key', None)
if v is not None:
data['section_key'] = v
v = params_kw.get('title', None)
if v is not None:
data['title'] = v
v = params_kw.get('subtitle', None)
if v is not None:
data['subtitle'] = v
v = params_kw.get('section_type', None)
if v is not None:
data['section_type'] = v
v = params_kw.get('content_type', None)
if v is not None:
data['content_type'] = v
v = params_kw.get('sort_order', None)
if v is not None:
data['sort_order'] = v
v = params_kw.get('is_visible', None)
if v is not None:
data['is_visible'] = v
v = params_kw.get('display_config', None)
if v is not None:
data['display_config'] = v
v = params_kw.get('style_config', None)
if v is not None:
data['style_config'] = v
v = params_kw.get('static_content', None)
if v is not None:
data['static_content'] = v
await sor.C('cms_sections', data)
return {'widgettype': 'Message', 'options': {'text': '创建成功', 'messagetype': 'success'}}

View File

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

View File

@ -1,22 +1,20 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.')
DBPools(config.databases)
dbname = get_module_dbname('entcms')
sor = DBPools().sqlorContext(dbname)
async with db.sqlorContext(dbname) as sor:
ns = {'sort': 'sort_order asc'}
filter_json = params_kw.get('data_filter', None)
if filter_json:
from sqlor.filter import DBFilter
try:
filter_def = json.loads(filter_json) if isinstance(filter_json, str) else filter_json
dbf = DBFilter(filter_def)
conds = dbf.gen(params_kw)
ns.update(conds)
ns.update(dbf.consts)
except Exception:
pass
rows = await sor.R('cms_sections', ns)
print(json.dumps({'status': 'ok', 'rows': rows, 'total': len(rows)}, ensure_ascii=False))
ns = {'sort': 'sort_order asc'}
filter_json = params_kw.get('data_filter', None)
if filter_json:
from sqlor.filter import DBFilter
try:
filter_def = json.loads(filter_json) if isinstance(filter_json, str) else filter_json
dbf = DBFilter(filter_def)
conds = dbf.gen(params_kw)
ns.update(conds)
ns.update(dbf.consts)
except Exception:
pass
rows = await sor.R('cms_sections', ns)
return {'status': 'ok', 'rows': rows, 'total': len(rows)}

View File

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

View File

@ -1,36 +1,34 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.')
DBPools(config.databases)
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)
if v is not None:
data['org_id'] = v
v = params_kw.get('org_id', None)
if v is not None:
data['org_id'] = v
v = params_kw.get('config_group', None)
if v is not None:
data['config_group'] = v
v = params_kw.get('config_group', None)
if v is not None:
data['config_group'] = v
v = params_kw.get('config_key', None)
if v is not None:
data['config_key'] = v
v = params_kw.get('config_key', None)
if v is not None:
data['config_key'] = v
v = params_kw.get('config_value', None)
if v is not None:
data['config_value'] = v
v = params_kw.get('config_value', None)
if v is not None:
data['config_value'] = v
v = params_kw.get('config_type', None)
if v is not None:
data['config_type'] = v
v = params_kw.get('config_type', None)
if v is not None:
data['config_type'] = v
v = params_kw.get('sort_order', None)
if v is not None:
data['sort_order'] = v
v = params_kw.get('sort_order', None)
if v is not None:
data['sort_order'] = v
await sor.C('cms_site_config', data)
print(json.dumps({'widgettype': 'Message', 'options': {'text': '创建成功', 'messagetype': 'success'}}, ensure_ascii=False))
await sor.C('cms_site_config', data)
return {'widgettype': 'Message', 'options': {'text': '创建成功', 'messagetype': 'success'}}

View File

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

View File

@ -1,32 +1,30 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.')
DBPools(config.databases)
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'}
# data_filter support
filter_json = params_kw.get('data_filter', None)
if filter_json:
from sqlor.filter import DBFilter
try:
filter_def = json.loads(filter_json) if isinstance(filter_json, str) else filter_json
dbf = DBFilter(filter_def)
conds = dbf.gen(params_kw)
ns.update(conds)
ns.update(dbf.consts)
except Exception:
pass
# data_filter support
filter_json = params_kw.get('data_filter', None)
if filter_json:
from sqlor.filter import DBFilter
try:
filter_def = json.loads(filter_json) if isinstance(filter_json, str) else filter_json
dbf = DBFilter(filter_def)
conds = dbf.gen(params_kw)
ns.update(conds)
ns.update(dbf.consts)
except Exception:
pass
# Manual filter params
# Manual filter params
_config_group = params_kw.get('config_group', None)
if _config_group:
ns['config_group'] = _config_group
_config_group = params_kw.get('config_group', None)
if _config_group:
ns['config_group'] = _config_group
rows = await sor.R('cms_site_config', ns)
total = len(rows)
print(json.dumps({'status': 'ok', 'rows': rows, 'total': total}, ensure_ascii=False))
rows = await sor.R('cms_site_config', ns)
total = len(rows)
return {'status': 'ok', 'rows': rows, 'total': total}

View File

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

View File

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

View File

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

View File

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

View File

@ -1,20 +1,18 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.')
DBPools(config.databases)
dbname = get_module_dbname('entcms')
sor = DBPools().sqlorContext(dbname)
async with db.sqlorContext(dbname) as sor:
ns = {'is_visible': '1', 'sort': 'sort_order asc'}
rows = await sor.R('cms_sections', ns)
# Parse JSON fields
for r in rows:
for field in ['display_config', 'style_config', 'static_content']:
v = r.get(field, None)
if v and isinstance(v, str):
try:
r[field] = json.loads(v)
except:
pass
print(json.dumps({'status': 'ok', 'rows': rows, 'total': len(rows)}, ensure_ascii=False))
ns = {'is_visible': '1', 'sort': 'sort_order asc'}
rows = await sor.R('cms_sections', ns)
# Parse JSON fields
for r in rows:
for field in ['display_config', 'style_config', 'static_content']:
v = r.get(field, None)
if v and isinstance(v, str):
try:
r[field] = json.loads(v)
except:
pass
return {'status': 'ok', 'rows': rows, 'total': len(rows)}

View File

@ -1,28 +1,26 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.')
DBPools(config.databases)
dbname = get_module_dbname('entcms')
sor = DBPools().sqlorContext(dbname)
async with db.sqlorContext(dbname) as sor:
content_id = params_kw.get('content_id', '')
if not content_id:
print(json.dumps({'widgettype': 'Message', 'options': {'text': '缺少内容ID', 'messagetype': 'error'}}, ensure_ascii=False))
else:
# Update status to pending
await sor.U('cms_content', {'id': content_id, 'status': 'pending'})
# Try to call dingdingflow
try:
from dingdingflow.init import submit_approval
user_id = await get_user()
ns_detail = {'id': content_id}
rows = await sor.R('cms_content', ns_detail)
title = rows[0].get('title', '内容审批') if rows else '内容审批'
result = await submit_approval('content_publish', content_id, title, user_id)
if result and result.get('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))
except ImportError:
print(json.dumps({'widgettype': 'Message', 'options': {'text': '审批模块未安装,状态已改为待审批', 'messagetype': 'warning'}}, ensure_ascii=False))
content_id = params_kw.get('content_id', '')
if not content_id:
return {'widgettype': 'Message', 'options': {'text': '缺少内容ID', 'messagetype': 'error'}}
else:
# Update status to pending
await sor.U('cms_content', {'id': content_id, 'status': 'pending'})
# Try to call dingdingflow
try:
from dingdingflow.init import submit_approval
user_id = await get_user()
ns_detail = {'id': content_id}
rows = await sor.R('cms_content', ns_detail)
title = rows[0].get('title', '内容审批') if rows else '内容审批'
result = await submit_approval('content_publish', content_id, title, user_id)
if result and result.get('approval_id'):
await sor.U('cms_content', {'id': content_id, 'approval_id': result['approval_id']})
return {'widgettype': 'Message', 'options': {'text': '已提交审批', 'messagetype': 'success'}}
except ImportError:
return {'widgettype': 'Message', 'options': {'text': '审批模块未安装,状态已改为待审批', 'messagetype': 'warning'}}

View File

@ -1,25 +1,22 @@
import json
from appPublic.uniqueID import getID
config = getConfig('.')
DBPools(config.databases)
dbname = get_module_dbname('entcms')
sor = DBPools().sqlorContext(dbname)
async with db.sqlorContext(dbname) as sor:
data = {
'id': getID(),
'source': 'website',
'status': 'new',
'org_id': '0'
}
for field in ['name', 'company', 'phone', 'email', 'industry', 'region',
'interest_products', 'message']:
v = params_kw.get(field, None)
if v is not None:
data[field] = v
data = {
'id': getID(),
'source': 'website',
'status': 'new',
'org_id': '0'
}
for field in ['name', 'company', 'phone', 'email', 'industry', 'region',
'interest_products', 'message']:
v = params_kw.get(field, None)
if v is not None:
data[field] = v
await sor.C('cms_leads', data)
print(json.dumps({
'widgettype': 'Message',
'options': {'text': '感谢您的留言,我们会尽快联系您!', 'messagetype': 'success'}
}, ensure_ascii=False))
await sor.C('cms_leads', data)
return {
'widgettype': 'Message',
'options': {'text': '感谢您的留言,我们会尽快联系您!', 'messagetype': 'success'}
}

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'}}
try:
@ -12,9 +8,9 @@ try:
if not biz_type:
result['options'] = {'title': 'Error', 'message': 'biz_type is required', 'type': 'error'}
else:
new_id = uuid()
new_id = getID()
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')
async with DBPools().sqlorContext(dbname) as sor:
@ -38,4 +34,4 @@ try:
except Exception as e:
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'}}
try:
@ -17,4 +13,4 @@ try:
except Exception as e:
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}
try:
@ -55,4 +51,4 @@ try:
except Exception as 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'}}
try:
@ -21,7 +17,7 @@ try:
update_ns[field] = val
# 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_ns['updated_at'] = now_str
@ -33,4 +29,4 @@ try:
except Exception as e:
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'}}
try:
@ -13,9 +9,9 @@ try:
if not biz_type or not title:
result['options'] = {'title': 'Error', 'message': 'biz_type and title are required', 'type': 'error'}
else:
new_id = uuid()
new_id = getID()
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')
async with DBPools().sqlorContext(dbname) as sor:
@ -40,4 +36,4 @@ try:
except Exception as e:
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'}}
try:
@ -17,4 +13,4 @@ try:
except Exception as e:
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}
try:
@ -73,4 +69,4 @@ try:
except Exception as 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'}}
try:
@ -33,4 +29,4 @@ try:
except Exception as e:
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'}
try:
@ -59,4 +42,4 @@ try:
except Exception as 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'}
try:
@ -22,7 +15,7 @@ try:
else:
# Use current user as applicant if not specified
if not applicant_id:
applicant_id = get_user() or ''
applicant_id = (await get_user()) or ''
org_id = (await get_userorgid()) or '0'
@ -33,4 +26,4 @@ try:
except Exception as e:
result = {'success': False, 'message': f'提交审批失败: {str(e)}'}
return json.dumps(result, ensure_ascii=False, default=str)
return result