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,15 +1,13 @@
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'}
if content_type: 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,36 +1,34 @@
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)
if v is not None: if v is not None:
data['org_id'] = v data['org_id'] = v
v = params_kw.get('name', None) v = params_kw.get('name', None)
if v is not None: if v is not None:
data['name'] = v data['name'] = v
v = params_kw.get('parent_id', None) v = params_kw.get('parent_id', None)
if v is not None: if v is not None:
data['parent_id'] = v data['parent_id'] = v
v = params_kw.get('content_type', None) v = params_kw.get('content_type', None)
if v is not None: if v is not None:
data['content_type'] = v data['content_type'] = v
v = params_kw.get('description', None) v = params_kw.get('description', None)
if v is not None: if v is not None:
data['description'] = v data['description'] = v
v = params_kw.get('sort_order', None) v = params_kw.get('sort_order', None)
if v is not None: 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}) return {'widgettype': 'Message', 'options': {'text': '删除成功', 'messagetype': 'success'}}
print(json.dumps({'widgettype': 'Message', 'options': {'text': '删除成功', 'messagetype': 'success'}}, ensure_ascii=False))

View File

@ -1,32 +1,30 @@
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'}
# data_filter support # data_filter support
filter_json = params_kw.get('data_filter', None) filter_json = params_kw.get('data_filter', None)
if filter_json: if filter_json:
from sqlor.filter import DBFilter from sqlor.filter import DBFilter
try: try:
filter_def = json.loads(filter_json) if isinstance(filter_json, str) else filter_json filter_def = json.loads(filter_json) if isinstance(filter_json, str) else filter_json
dbf = DBFilter(filter_def) dbf = DBFilter(filter_def)
conds = dbf.gen(params_kw) conds = dbf.gen(params_kw)
ns.update(conds) ns.update(conds)
ns.update(dbf.consts) ns.update(dbf.consts)
except Exception: except Exception:
pass pass
# Manual filter params # Manual filter params
_content_type = params_kw.get('content_type', None) _content_type = params_kw.get('content_type', None)
if _content_type: 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)
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,39 +1,36 @@
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
v = params_kw.get('name', None) v = params_kw.get('name', None)
if v is not None: if v is not None:
data['name'] = v data['name'] = v
v = params_kw.get('parent_id', None) v = params_kw.get('parent_id', None)
if v is not None: if v is not None:
data['parent_id'] = v data['parent_id'] = v
v = params_kw.get('content_type', None) v = params_kw.get('content_type', None)
if v is not None: if v is not None:
data['content_type'] = v data['content_type'] = v
v = params_kw.get('description', None) v = params_kw.get('description', None)
if v is not None: if v is not None:
data['description'] = v data['description'] = v
v = params_kw.get('sort_order', None) v = params_kw.get('sort_order', None)
if v is not None: 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,60 +1,58 @@
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)
if v is not None: if v is not None:
data['org_id'] = v data['org_id'] = v
v = params_kw.get('content_type', None) v = params_kw.get('content_type', None)
if v is not None: if v is not None:
data['content_type'] = v data['content_type'] = v
v = params_kw.get('category_id', None) v = params_kw.get('category_id', None)
if v is not None: if v is not None:
data['category_id'] = v data['category_id'] = v
v = params_kw.get('title', None) v = params_kw.get('title', None)
if v is not None: if v is not None:
data['title'] = v data['title'] = v
v = params_kw.get('subtitle', None) v = params_kw.get('subtitle', None)
if v is not None: if v is not None:
data['subtitle'] = v data['subtitle'] = v
v = params_kw.get('summary_text', None) v = params_kw.get('summary_text', None)
if v is not None: if v is not None:
data['summary_text'] = v data['summary_text'] = v
v = params_kw.get('body', None) v = params_kw.get('body', None)
if v is not None: if v is not None:
data['body'] = v data['body'] = v
v = params_kw.get('image_url', None) v = params_kw.get('image_url', None)
if v is not None: if v is not None:
data['image_url'] = v data['image_url'] = v
v = params_kw.get('tags', None) v = params_kw.get('tags', None)
if v is not None: if v is not None:
data['tags'] = v data['tags'] = v
v = params_kw.get('sort_order', None) v = params_kw.get('sort_order', None)
if v is not None: if v is not None:
data['sort_order'] = v data['sort_order'] = v
v = params_kw.get('status', None) v = params_kw.get('status', None)
if v is not None: if v is not None:
data['status'] = v data['status'] = v
v = params_kw.get('extra_json', None) v = params_kw.get('extra_json', None)
if v is not None: 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}) return {'widgettype': 'Message', 'options': {'text': '删除成功', 'messagetype': 'success'}}
print(json.dumps({'widgettype': 'Message', 'options': {'text': '删除成功', 'messagetype': 'success'}}, ensure_ascii=False))

View File

@ -1,36 +1,34 @@
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'}
# data_filter support # data_filter support
filter_json = params_kw.get('data_filter', None) filter_json = params_kw.get('data_filter', None)
if filter_json: if filter_json:
from sqlor.filter import DBFilter from sqlor.filter import DBFilter
try: try:
filter_def = json.loads(filter_json) if isinstance(filter_json, str) else filter_json filter_def = json.loads(filter_json) if isinstance(filter_json, str) else filter_json
dbf = DBFilter(filter_def) dbf = DBFilter(filter_def)
conds = dbf.gen(params_kw) conds = dbf.gen(params_kw)
ns.update(conds) ns.update(conds)
ns.update(dbf.consts) ns.update(dbf.consts)
except Exception: except Exception:
pass pass
# Manual filter params # Manual filter params
_content_type = params_kw.get('content_type', None) _content_type = params_kw.get('content_type', None)
if _content_type: if _content_type:
ns['content_type'] = _content_type ns['content_type'] = _content_type
_status = params_kw.get('status', None) _status = params_kw.get('status', None)
if _status: if _status:
ns['status'] = _status ns['status'] = _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,71 +1,68 @@
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
v = params_kw.get('content_type', None) v = params_kw.get('content_type', None)
if v is not None: if v is not None:
data['content_type'] = v data['content_type'] = v
v = params_kw.get('category_id', None) v = params_kw.get('category_id', None)
if v is not None: if v is not None:
data['category_id'] = v data['category_id'] = v
v = params_kw.get('title', None) v = params_kw.get('title', None)
if v is not None: if v is not None:
data['title'] = v data['title'] = v
v = params_kw.get('subtitle', None) v = params_kw.get('subtitle', None)
if v is not None: if v is not None:
data['subtitle'] = v data['subtitle'] = v
v = params_kw.get('summary_text', None) v = params_kw.get('summary_text', None)
if v is not None: if v is not None:
data['summary_text'] = v data['summary_text'] = v
v = params_kw.get('body', None) v = params_kw.get('body', None)
if v is not None: if v is not None:
data['body'] = v data['body'] = v
v = params_kw.get('image_url', None) v = params_kw.get('image_url', None)
if v is not None: if v is not None:
data['image_url'] = v data['image_url'] = v
v = params_kw.get('tags', None) v = params_kw.get('tags', None)
if v is not None: if v is not None:
data['tags'] = v data['tags'] = v
v = params_kw.get('sort_order', None) v = params_kw.get('sort_order', None)
if v is not None: if v is not None:
data['sort_order'] = v data['sort_order'] = v
v = params_kw.get('status', None) v = params_kw.get('status', None)
if v is not None: if v is not None:
data['status'] = v data['status'] = v
v = params_kw.get('extra_json', None) v = params_kw.get('extra_json', None)
if v is not None: if v is not None:
data['extra_json'] = v data['extra_json'] = v
v = params_kw.get('approval_id', None) v = params_kw.get('approval_id', None)
if v is not None: if v is not None:
data['approval_id'] = v data['approval_id'] = v
v = params_kw.get('published_at', None) v = params_kw.get('published_at', None)
if v is not None: 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,68 +1,66 @@
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)
if v is not None: if v is not None:
data['org_id'] = v data['org_id'] = v
v = params_kw.get('source', None) v = params_kw.get('source', None)
if v is not None: if v is not None:
data['source'] = v data['source'] = v
v = params_kw.get('name', None) v = params_kw.get('name', None)
if v is not None: if v is not None:
data['name'] = v data['name'] = v
v = params_kw.get('company', None) v = params_kw.get('company', None)
if v is not None: if v is not None:
data['company'] = v data['company'] = v
v = params_kw.get('phone', None) v = params_kw.get('phone', None)
if v is not None: if v is not None:
data['phone'] = v data['phone'] = v
v = params_kw.get('email', None) v = params_kw.get('email', None)
if v is not None: if v is not None:
data['email'] = v data['email'] = v
v = params_kw.get('industry', None) v = params_kw.get('industry', None)
if v is not None: if v is not None:
data['industry'] = v data['industry'] = v
v = params_kw.get('region', None) v = params_kw.get('region', None)
if v is not None: if v is not None:
data['region'] = v data['region'] = v
v = params_kw.get('interest_products', None) v = params_kw.get('interest_products', None)
if v is not None: if v is not None:
data['interest_products'] = v data['interest_products'] = v
v = params_kw.get('message', None) v = params_kw.get('message', None)
if v is not None: if v is not None:
data['message'] = v data['message'] = v
v = params_kw.get('raw_text', None) v = params_kw.get('raw_text', None)
if v is not None: if v is not None:
data['raw_text'] = v data['raw_text'] = v
v = params_kw.get('status', None) v = params_kw.get('status', None)
if v is not None: if v is not None:
data['status'] = v data['status'] = v
v = params_kw.get('assigned_to', None) v = params_kw.get('assigned_to', None)
if v is not None: if v is not None:
data['assigned_to'] = v data['assigned_to'] = v
v = params_kw.get('notes', None) v = params_kw.get('notes', None)
if v is not None: 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}) return {'widgettype': 'Message', 'options': {'text': '删除成功', 'messagetype': 'success'}}
print(json.dumps({'widgettype': 'Message', 'options': {'text': '删除成功', 'messagetype': 'success'}}, ensure_ascii=False))

View File

@ -1,36 +1,34 @@
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'}
# data_filter support # data_filter support
filter_json = params_kw.get('data_filter', None) filter_json = params_kw.get('data_filter', None)
if filter_json: if filter_json:
from sqlor.filter import DBFilter from sqlor.filter import DBFilter
try: try:
filter_def = json.loads(filter_json) if isinstance(filter_json, str) else filter_json filter_def = json.loads(filter_json) if isinstance(filter_json, str) else filter_json
dbf = DBFilter(filter_def) dbf = DBFilter(filter_def)
conds = dbf.gen(params_kw) conds = dbf.gen(params_kw)
ns.update(conds) ns.update(conds)
ns.update(dbf.consts) ns.update(dbf.consts)
except Exception: except Exception:
pass pass
# Manual filter params # Manual filter params
_status = params_kw.get('status', None) _status = params_kw.get('status', None)
if _status: if _status:
ns['status'] = _status ns['status'] = _status
_source = params_kw.get('source', None) _source = params_kw.get('source', None)
if _source: if _source:
ns['source'] = _source ns['source'] = _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,71 +1,68 @@
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
v = params_kw.get('source', None) v = params_kw.get('source', None)
if v is not None: if v is not None:
data['source'] = v data['source'] = v
v = params_kw.get('name', None) v = params_kw.get('name', None)
if v is not None: if v is not None:
data['name'] = v data['name'] = v
v = params_kw.get('company', None) v = params_kw.get('company', None)
if v is not None: if v is not None:
data['company'] = v data['company'] = v
v = params_kw.get('phone', None) v = params_kw.get('phone', None)
if v is not None: if v is not None:
data['phone'] = v data['phone'] = v
v = params_kw.get('email', None) v = params_kw.get('email', None)
if v is not None: if v is not None:
data['email'] = v data['email'] = v
v = params_kw.get('industry', None) v = params_kw.get('industry', None)
if v is not None: if v is not None:
data['industry'] = v data['industry'] = v
v = params_kw.get('region', None) v = params_kw.get('region', None)
if v is not None: if v is not None:
data['region'] = v data['region'] = v
v = params_kw.get('interest_products', None) v = params_kw.get('interest_products', None)
if v is not None: if v is not None:
data['interest_products'] = v data['interest_products'] = v
v = params_kw.get('message', None) v = params_kw.get('message', None)
if v is not None: if v is not None:
data['message'] = v data['message'] = v
v = params_kw.get('raw_text', None) v = params_kw.get('raw_text', None)
if v is not None: if v is not None:
data['raw_text'] = v data['raw_text'] = v
v = params_kw.get('status', None) v = params_kw.get('status', None)
if v is not None: if v is not None:
data['status'] = v data['status'] = v
v = params_kw.get('assigned_to', None) v = params_kw.get('assigned_to', None)
if v is not None: if v is not None:
data['assigned_to'] = v data['assigned_to'] = v
v = params_kw.get('notes', None) v = params_kw.get('notes', None)
if v is not None: 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,44 +1,42 @@
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)
if v is not None: if v is not None:
data['org_id'] = v data['org_id'] = v
v = params_kw.get('section_key', None) v = params_kw.get('section_key', None)
if v is not None: if v is not None:
data['section_key'] = v data['section_key'] = v
v = params_kw.get('title', None) v = params_kw.get('title', None)
if v is not None: if v is not None:
data['title'] = v data['title'] = v
v = params_kw.get('subtitle', None) v = params_kw.get('subtitle', None)
if v is not None: if v is not None:
data['subtitle'] = v data['subtitle'] = v
v = params_kw.get('section_type', None) v = params_kw.get('section_type', None)
if v is not None: if v is not None:
data['section_type'] = v data['section_type'] = v
v = params_kw.get('content_type', None) v = params_kw.get('content_type', None)
if v is not None: if v is not None:
data['content_type'] = v data['content_type'] = v
v = params_kw.get('sort_order', None) v = params_kw.get('sort_order', None)
if v is not None: if v is not None:
data['sort_order'] = v data['sort_order'] = v
v = params_kw.get('is_visible', None) v = params_kw.get('is_visible', None)
if v is not None: if v is not None:
data['is_visible'] = v data['is_visible'] = v
v = params_kw.get('display_config', None) v = params_kw.get('display_config', None)
if v is not None: if v is not None:
data['display_config'] = v data['display_config'] = v
v = params_kw.get('style_config', None) v = params_kw.get('style_config', None)
if v is not None: if v is not None:
data['style_config'] = v data['style_config'] = v
v = params_kw.get('static_content', None) 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}) return {'widgettype': 'Message', 'options': {'text': '删除成功', 'messagetype': 'success'}}
print(json.dumps({'widgettype': 'Message', 'options': {'text': '删除成功', 'messagetype': 'success'}}, ensure_ascii=False))

View File

@ -1,22 +1,20 @@
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)
if filter_json: if filter_json:
from sqlor.filter import DBFilter from sqlor.filter import DBFilter
try: try:
filter_def = json.loads(filter_json) if isinstance(filter_json, str) else filter_json filter_def = json.loads(filter_json) if isinstance(filter_json, str) else filter_json
dbf = DBFilter(filter_def) dbf = DBFilter(filter_def)
conds = dbf.gen(params_kw) conds = dbf.gen(params_kw)
ns.update(conds) ns.update(conds)
ns.update(dbf.consts) ns.update(dbf.consts)
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,47 +1,44 @@
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 v = params_kw.get('section_key', None)
v = params_kw.get('section_key', None) if v is not None:
if v is not None: data['section_key'] = v
data['section_key'] = v v = params_kw.get('title', None)
v = params_kw.get('title', None) if v is not None:
if v is not None: data['title'] = v
data['title'] = v v = params_kw.get('subtitle', None)
v = params_kw.get('subtitle', None) if v is not None:
if v is not None: data['subtitle'] = v
data['subtitle'] = v v = params_kw.get('section_type', None)
v = params_kw.get('section_type', None) if v is not None:
if v is not None: data['section_type'] = v
data['section_type'] = v v = params_kw.get('content_type', None)
v = params_kw.get('content_type', None) if v is not None:
if v is not None: data['content_type'] = v
data['content_type'] = v v = params_kw.get('sort_order', None)
v = params_kw.get('sort_order', None) if v is not None:
if v is not None: data['sort_order'] = v
data['sort_order'] = v v = params_kw.get('is_visible', None)
v = params_kw.get('is_visible', None) if v is not None:
if v is not None: data['is_visible'] = v
data['is_visible'] = v v = params_kw.get('display_config', None)
v = params_kw.get('display_config', None) if v is not None:
if v is not None: data['display_config'] = v
data['display_config'] = v v = params_kw.get('style_config', None)
v = params_kw.get('style_config', None) if v is not None:
if v is not None: data['style_config'] = v
data['style_config'] = v v = params_kw.get('static_content', None)
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) return {'widgettype': 'Message', 'options': {'text': '更新成功', 'messagetype': 'success'}}
print(json.dumps({'widgettype': 'Message', 'options': {'text': '更新成功', 'messagetype': 'success'}}, ensure_ascii=False))

View File

@ -1,36 +1,34 @@
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)
if v is not None: if v is not None:
data['org_id'] = v data['org_id'] = v
v = params_kw.get('config_group', None) v = params_kw.get('config_group', None)
if v is not None: if v is not None:
data['config_group'] = v data['config_group'] = v
v = params_kw.get('config_key', None) v = params_kw.get('config_key', None)
if v is not None: if v is not None:
data['config_key'] = v data['config_key'] = v
v = params_kw.get('config_value', None) v = params_kw.get('config_value', None)
if v is not None: if v is not None:
data['config_value'] = v data['config_value'] = v
v = params_kw.get('config_type', None) v = params_kw.get('config_type', None)
if v is not None: if v is not None:
data['config_type'] = v data['config_type'] = v
v = params_kw.get('sort_order', None) v = params_kw.get('sort_order', None)
if v is not None: 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}) return {'widgettype': 'Message', 'options': {'text': '删除成功', 'messagetype': 'success'}}
print(json.dumps({'widgettype': 'Message', 'options': {'text': '删除成功', 'messagetype': 'success'}}, ensure_ascii=False))

View File

@ -1,32 +1,30 @@
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'}
# data_filter support # data_filter support
filter_json = params_kw.get('data_filter', None) filter_json = params_kw.get('data_filter', None)
if filter_json: if filter_json:
from sqlor.filter import DBFilter from sqlor.filter import DBFilter
try: try:
filter_def = json.loads(filter_json) if isinstance(filter_json, str) else filter_json filter_def = json.loads(filter_json) if isinstance(filter_json, str) else filter_json
dbf = DBFilter(filter_def) dbf = DBFilter(filter_def)
conds = dbf.gen(params_kw) conds = dbf.gen(params_kw)
ns.update(conds) ns.update(conds)
ns.update(dbf.consts) ns.update(dbf.consts)
except Exception: except Exception:
pass pass
# Manual filter params # Manual filter params
_config_group = params_kw.get('config_group', None) _config_group = params_kw.get('config_group', None)
if _config_group: if _config_group:
ns['config_group'] = _config_group ns['config_group'] = _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,39 +1,36 @@
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
v = params_kw.get('config_group', None) v = params_kw.get('config_group', None)
if v is not None: if v is not None:
data['config_group'] = v data['config_group'] = v
v = params_kw.get('config_key', None) v = params_kw.get('config_key', None)
if v is not None: if v is not None:
data['config_key'] = v data['config_key'] = v
v = params_kw.get('config_value', None) v = params_kw.get('config_value', None)
if v is not None: if v is not None:
data['config_value'] = v data['config_value'] = v
v = params_kw.get('config_type', None) v = params_kw.get('config_type', None)
if v is not None: if v is not None:
data['config_type'] = v data['config_type'] = v
v = params_kw.get('sort_order', None) v = params_kw.get('sort_order', None)
if v is not None: 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,20 +1,18 @@
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'}
if group: if group:
ns['config_group'] = group ns['config_group'] = group
rows = await sor.R('cms_site_config', ns) rows = await sor.R('cms_site_config', ns)
result = {} result = {}
for r in rows: for r in rows:
g = r.get('config_group', '') g = r.get('config_group', '')
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:
ns = {'id': _id}
rows = await sor.R('cms_content', ns)
if rows:
print(json.dumps({'status': 'ok', 'data': rows[0]}, ensure_ascii=False))
else: 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('.') 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'))
ns = {'status': 'published', 'sort': 'sort_order asc, published_at desc'} ns = {'status': 'published', 'sort': 'sort_order asc, published_at desc'}
if content_type: if content_type:
ns['content_type'] = content_type ns['content_type'] = 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,20 +1,18 @@
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)
# Parse JSON fields # Parse JSON fields
for r in rows: for r in rows:
for field in ['display_config', 'style_config', 'static_content']: for field in ['display_config', 'style_config', 'static_content']:
v = r.get(field, None) v = r.get(field, None)
if v and isinstance(v, str): if v and isinstance(v, str):
try: try:
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,28 +1,26 @@
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'})
# Try to call dingdingflow # Try to call dingdingflow
try: try:
from dingdingflow.init import submit_approval from dingdingflow.init import submit_approval
user_id = await get_user() user_id = await get_user()
ns_detail = {'id': content_id} ns_detail = {'id': content_id}
rows = await sor.R('cms_content', ns_detail) rows = await sor.R('cms_content', ns_detail)
title = rows[0].get('title', '内容审批') if rows else '内容审批' title = rows[0].get('title', '内容审批') if rows 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,25 +1,22 @@
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(),
'source': 'website', 'source': 'website',
'status': 'new', 'status': 'new',
'org_id': '0' 'org_id': '0'
} }
for field in ['name', 'company', 'phone', 'email', 'industry', 'region', for field in ['name', 'company', 'phone', 'email', 'industry', 'region',
'interest_products', 'message']: 'interest_products', 'message']:
v = params_kw.get(field, None) v = params_kw.get(field, None)
if v is not None: if v is not None:
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