bugfix
This commit is contained in:
parent
1c11a995d7
commit
61f7e03b89
@ -17,6 +17,40 @@ from random import randint
|
|||||||
from appPublic.log import debug, exception, error, info
|
from appPublic.log import debug, exception, error, info
|
||||||
from appPublic.timeUtils import timestampstr
|
from appPublic.timeUtils import timestampstr
|
||||||
from sqlor.dbpools import get_sor_context
|
from sqlor.dbpools import get_sor_context
|
||||||
|
from asteval import Interpreter, NameNotFound
|
||||||
|
|
||||||
|
# 1. 创建一个全局的 Interpreter 实例(复用以提高性能)
|
||||||
|
aeval = Interpreter()
|
||||||
|
|
||||||
|
# 2. 在你的 node_transfer 或条件判断逻辑中
|
||||||
|
def safe_eval_condition(cond_str, ctx_dict):
|
||||||
|
"""
|
||||||
|
安全地评估条件表达式
|
||||||
|
Args:
|
||||||
|
cond_str: 表达式字符串,例如 "ctx['age'] > 18 and ctx['score'] >= 60"
|
||||||
|
ctx_dict: 上下文数据字典
|
||||||
|
Returns: None 错误或的确是None
|
||||||
|
其他: 表达式结果
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
# 将 ctx 注入到 asteval 的符号表中
|
||||||
|
aeval.symtable['ctx'] = ctx_dict
|
||||||
|
|
||||||
|
# 执行表达式
|
||||||
|
# mode='eval' 表示只允许单个表达式,不允许语句(如赋值、import)
|
||||||
|
result = aeval(cond_str, mode='eval')
|
||||||
|
|
||||||
|
# 检查是否有语法错误或运行时错误
|
||||||
|
if aeval.error:
|
||||||
|
print(f"asteval Error: {aeval.error}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
return bool(result)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
# asteval 通常很安全,但以防万一
|
||||||
|
print(f"Eval Exception: {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
# ---------------------------------------------------------------------
|
# ---------------------------------------------------------------------
|
||||||
# Table definitions
|
# Table definitions
|
||||||
@ -311,21 +345,27 @@ where backid=${backid}$
|
|||||||
|
|
||||||
async def node_transfer(self, sor, dsl, inst, ne, node, flow_def):
|
async def node_transfer(self, sor, dsl, inst, ne, node, flow_def):
|
||||||
nnode = []
|
nnode = []
|
||||||
|
ctx = inst.ctx.copy()
|
||||||
for edge in dsl.get('edges', []):
|
for edge in dsl.get('edges', []):
|
||||||
if edge['from'] != ne.node_id:
|
if edge['from'] != ne.node_id:
|
||||||
continue
|
continue
|
||||||
cond = edge.get('when')
|
cond = edge.get('when')
|
||||||
if cond and not eval(cond, {}, {'ctx': ctx}):
|
if cond and not safe_eval_condition(cond, {'ctx': ctx}):
|
||||||
continue
|
continue
|
||||||
m_on = edge.get('foreach')
|
m_on = edge.get('foreach')
|
||||||
ns = {
|
if m_on:
|
||||||
|
ns = DictObject(**{
|
||||||
|
'sor': sor,
|
||||||
'm_on': m_on,
|
'm_on': m_on,
|
||||||
'ctx': ctx,
|
'ctx': ctx,
|
||||||
'node': node
|
'node': node
|
||||||
}
|
})
|
||||||
on_array = await self.get_multiple_array(m_on)
|
on_array = safe_eval_condition(m_on, ctx)
|
||||||
for e in on_array:
|
for e in on_array:
|
||||||
nnodes.add((edge['to'], str(e)))
|
nnodes.add((edge['to'], str(e)))
|
||||||
|
else:
|
||||||
|
nnodes.add(edge['to'], None)
|
||||||
|
|
||||||
for node, ctx_ext in nnodes:
|
for node, ctx_ext in nnodes:
|
||||||
x = await self.is_ok_to_create_new_node_exe(sor, node, edges, inst)
|
x = await self.is_ok_to_create_new_node_exe(sor, node, edges, inst)
|
||||||
if x:
|
if x:
|
||||||
@ -400,7 +440,7 @@ where backid=${backid}$
|
|||||||
sql = """select * from node_execution
|
sql = """select * from node_execution
|
||||||
where node_id in ${backnodes}$
|
where node_id in ${backnodes}$
|
||||||
and instance_id = ${instance_id}$"""
|
and instance_id = ${instance_id}$"""
|
||||||
recs = sor.sqlExe(sql, {
|
recs = await sor.sqlExe(sql, {
|
||||||
'backnodes': backnodes,
|
'backnodes': backnodes,
|
||||||
'instance_id': inst['id']
|
'instance_id': inst['id']
|
||||||
})
|
})
|
||||||
@ -425,7 +465,7 @@ where status in ['pending', 'running']
|
|||||||
sql = """select * from node_transfer
|
sql = """select * from node_transfer
|
||||||
where instance_id=${instance_id}$
|
where instance_id=${instance_id}$
|
||||||
and to_node_id = ${node_id}$"""
|
and to_node_id = ${node_id}$"""
|
||||||
trecs = sor.sqlExe(sql, {
|
trecs = await sor.sqlExe(sql, {
|
||||||
'node_id': node['id'],
|
'node_id': node['id'],
|
||||||
'instance_id': inst['id']
|
'instance_id': inst['id']
|
||||||
})
|
})
|
||||||
@ -436,7 +476,8 @@ where instance_id=${instance_id}$
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
async def start_running(self, sor, node, edges, inst):
|
async def start_running(self, sor, node, edges, inst):
|
||||||
if self.s_ok_to_step_next(sor, node, edges, inst):
|
flg= self.is_ok_to_step_next(sor, node, edges, inst)
|
||||||
|
if flg:
|
||||||
await sor.R('node_execution', {
|
await sor.R('node_execution', {
|
||||||
'id': node['id'],
|
'id': node['id'],
|
||||||
'status': 'running',
|
'status': 'running',
|
||||||
@ -444,14 +485,14 @@ where instance_id=${instance_id}$
|
|||||||
})
|
})
|
||||||
try:
|
try:
|
||||||
out = await self.run_auto_task(node)
|
out = await self.run_auto_task(node)
|
||||||
sor.U('node_execution', {
|
await sor.U('node_execution', {
|
||||||
'id': node['id'],
|
'id': node['id'],
|
||||||
'status': 'done',
|
'status': 'done',
|
||||||
'stopping_at': timestampstr(),
|
'stopping_at': timestampstr(),
|
||||||
'output_ctx': json.dumps(out, ensure_ascii=False)
|
'output_ctx': json.dumps(out, ensure_ascii=False)
|
||||||
})
|
})
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
sor.U('node_execution', {
|
await sor.U('node_execution', {
|
||||||
'id': node['id'],
|
'id': node['id'],
|
||||||
'status': 'failed',
|
'status': 'failed',
|
||||||
'stopping_at': timestampstr()
|
'stopping_at': timestampstr()
|
||||||
@ -531,7 +572,7 @@ async def get_my_flow_works(request, inst_id=None):
|
|||||||
async with get_sor_context(env, 'dagflow') as sor:
|
async with get_sor_context(env, 'dagflow') as sor:
|
||||||
sql = """select *
|
sql = """select *
|
||||||
from node_execute
|
from node_execute
|
||||||
where a.type = 'human'
|
where type = 'human'
|
||||||
and status in ['pending', 'running']
|
and status in ['pending', 'running']
|
||||||
and (assignee = ${userid}$ or (assignee is NULL and role in ${myroles}$))"""
|
and (assignee = ${userid}$ or (assignee is NULL and role in ${myroles}$))"""
|
||||||
if inst_id:
|
if inst_id:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user