Skip to content

Commit 5877ce2

Browse files
committed
fix: Application task parameters
1 parent 6537aaa commit 5877ce2

File tree

1 file changed

+125
-24
lines changed

1 file changed

+125
-24
lines changed

apps/trigger/handler/impl/task/application_task.py

Lines changed: 125 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,17 @@
66
@date:2026/1/14 19:14
77
@desc:
88
"""
9+
import json
10+
from functools import reduce
911

1012
import uuid_utils.compat as uuid
1113
from django.db.models import QuerySet
1214

13-
from application.models import ChatUserType, Chat, ChatRecord, ChatSourceChoices
15+
from application.models import ChatUserType, Chat, ChatRecord, ChatSourceChoices, Application
1416
from chat.serializers.chat import ChatSerializers
1517
from knowledge.models.knowledge_action import State
16-
1718
from trigger.handler.base_task import BaseTriggerTask
18-
from trigger.models import TaskRecord
19+
from trigger.models import TaskRecord, TriggerTask
1920

2021

2122
def get_reference(fields, obj):
@@ -28,32 +29,82 @@ def get_reference(fields, obj):
2829
return obj
2930

3031

31-
def get_field_value(value, kwargs):
32+
def conversion_custom_value(value, _type):
33+
if ['array', 'dict', 'float', 'int', 'boolean'].__contains__(_type):
34+
return json.loads(value)
35+
if _type == 'any':
36+
try:
37+
return json.loads(value)
38+
except Exception as e:
39+
pass
40+
return value
41+
42+
43+
def valid_value_type(value, _type):
44+
if _type == 'array':
45+
return isinstance(value, list)
46+
if _type == 'dict':
47+
return isinstance(value, dict)
48+
if _type == 'float':
49+
return isinstance(value, float)
50+
if _type == 'int':
51+
return isinstance(value, int)
52+
if _type == 'boolean':
53+
return isinstance(value, bool)
54+
return isinstance(value, str)
55+
56+
57+
def get_field_value(value, kwargs, _type, required, default_value, field):
3258
source = value.get('source')
3359
if source == 'custom':
34-
return value.get('value')
60+
_value = value.get('value')
61+
if _value:
62+
_value = conversion_custom_value(_value, _type)
63+
else:
64+
if default_value:
65+
return default_value
66+
if required:
67+
raise Exception(f'{field} is required')
68+
else:
69+
return None
3570
else:
36-
return get_reference(value.get('value'), kwargs)
71+
_value = get_reference(value.get('value'), kwargs)
72+
valid = valid_value_type(_value, _type)
73+
if not valid:
74+
raise Exception(f'{field} type error')
75+
return _value
3776

3877

39-
def get_application_execute_parameters(parameter_setting, kwargs):
78+
def get_application_execute_parameters(parameter_setting, application_parameters_setting, kwargs):
79+
many_field = ['api_input_field_list', 'user_input_field_list']
4080
parameters = {'form_data': {}}
41-
question_setting = parameter_setting.get('question')
42-
if question_setting:
43-
parameters['message'] = get_field_value(question_setting, kwargs)
44-
filed_list = ['image_list', 'document_list', 'audio_list', 'video_list', 'other_list']
45-
for field in filed_list:
46-
field_setting = parameter_setting.get(field)
47-
if field_setting:
48-
parameters[field] = get_field_value(field_setting, kwargs)
49-
api_input_field_list = parameter_setting.get('api_input_field_list')
50-
if api_input_field_list:
51-
for key, value in api_input_field_list.items():
52-
parameters['form_data'][key] = get_field_value(value, kwargs)
53-
user_input_field_list = parameter_setting.get('user_input_field_list')
54-
if user_input_field_list:
55-
for key, value in user_input_field_list.items():
56-
parameters['form_data'][key] = get_field_value(value, kwargs)
81+
for key, value in application_parameters_setting.items():
82+
setting = parameter_setting.get(key)
83+
if setting:
84+
if many_field.__contains__(key):
85+
for ck, cv in value.items():
86+
_setting = setting.get(ck)
87+
if _setting:
88+
_value = get_field_value(_setting, kwargs, cv.get('type'), cv.get('required'),
89+
cv.get('default_value'), cv.get('field'))
90+
parameters['form_data'][ck] = _value
91+
else:
92+
if cv.get('default_value'):
93+
parameters['form_data'][ck] = cv.get('default_value')
94+
else:
95+
if cv.get('required'):
96+
raise Exception(f'{ck} is required')
97+
else:
98+
value = get_field_value(setting, kwargs, value.get('type'), value.get('required'),
99+
value.get('default_value'), value.get('field'))
100+
parameters['message' if key == 'question' else key] = value
101+
else:
102+
if value.get('default_value'):
103+
parameters['message' if key == 'question' else key] = value.get('default_value')
104+
else:
105+
if value.get('required'):
106+
raise Exception(f'{"message" if key == "question" else key} is required')
107+
57108
return parameters
58109

59110

@@ -76,13 +127,63 @@ def get_workflow_state(details):
76127
return State.SUCCESS
77128

78129

130+
def get_user_field_component_input_type(input_type):
131+
if input_type == "MultiRow":
132+
return 'array'
133+
if input_type == "SwitchInput":
134+
return 'boolean'
135+
return 'string'
136+
137+
138+
def get_application_parameters_setting(application):
139+
application_parameter_setting = {'question': {
140+
'required': True,
141+
'type': 'string'
142+
}}
143+
if application.type == 'SIMPLE':
144+
return application_parameter_setting
145+
else:
146+
base_node_list = [n for n in application.work_flow.get('nodes') if n.get('type') == "base-node"]
147+
if len(base_node_list) == 0:
148+
raise Exception('错误的应用工作流信息')
149+
base_node = base_node_list[0]
150+
api_input_field_list = base_node.get('properties').get('api_input_field_list') or []
151+
api_input_field_list = {user_field.get('variable'): {
152+
'required': user_field.get('is_required'),
153+
'default_value': user_field.get('default_value'),
154+
'type': 'string'
155+
} for user_field in api_input_field_list}
156+
user_input_field_list = base_node.get('properties').get('user_input_field_list') or []
157+
user_input_field_list = {user_field.get('field'): {
158+
'required': user_field.get('required'),
159+
'default_value': user_field.get('default_value'),
160+
'type': get_user_field_component_input_type(user_field.get('input_type'))
161+
} for user_field in user_input_field_list}
162+
application_parameter_setting['api_input_field_list'] = api_input_field_list
163+
application_parameter_setting['user_input_field_list'] = user_input_field_list
164+
node_data = base_node.get('properties').get('node_data') or {}
165+
file_upload_enable = node_data.get('file_upload_enable')
166+
if file_upload_enable:
167+
file_upload_setting = node_data.get('file_upload_setting') or {}
168+
for field in ['audio', 'document', 'image', 'other', 'video']:
169+
v = file_upload_setting.get(field)
170+
if v:
171+
application_parameter_setting[field] = {'required': False, 'default_value': [], 'type': 'array'}
172+
return application_parameter_setting
173+
174+
79175
class ApplicationTask(BaseTriggerTask):
80176
def support(self, trigger_task, **kwargs):
81177
return trigger_task.get('source_type') == 'APPLICATION'
82178

83179
def execute(self, trigger_task, **kwargs):
84180
parameter_setting = trigger_task.get('parameter')
85-
parameters = get_application_execute_parameters(parameter_setting, kwargs)
181+
application = QuerySet(Application).filter(id=trigger_task.get('source_id')).only('type', 'work_flow').first()
182+
if application is None:
183+
QuerySet(TriggerTask).filter(id=trigger_task.get('id')).delete()
184+
return
185+
application_parameters_setting = get_application_parameters_setting(application)
186+
parameters = get_application_execute_parameters(parameter_setting, application_parameters_setting, kwargs)
86187
parameters['re_chat'] = False
87188
parameters['stream'] = True
88189
chat_id = uuid.uuid7()

0 commit comments

Comments
 (0)