5555from system_manage .models .resource_mapping import ResourceMapping
5656from system_manage .serializers .resource_mapping_serializers import ResourceMappingSerializer
5757from system_manage .serializers .user_resource_permission import UserResourcePermissionSerializer
58- from tools .models import Tool , ToolScope , ToolType
58+ from tools .models import Tool , ToolScope , ToolType , ToolWorkflow
5959from tools .serializers .tool import ToolExportModelSerializer
6060from trigger .models import TriggerTask , Trigger
6161from users .models import User
@@ -93,6 +93,10 @@ def hand_node(node, update_tool_map):
9393 mcp_tool_id = (node .get ('properties' , {}).get ('node_data' , {}).get ('mcp_tool_id' ) or '' )
9494 node .get ('properties' , {}).get ('node_data' , {})['mcp_tool_id' ] = update_tool_map .get (mcp_tool_id ,
9595 mcp_tool_id )
96+ if node .get ('type' ) == 'tool-workflow-lib-node' :
97+ tool_lib_id = (node .get ('properties' , {}).get ('node_data' , {}).get ('tool_lib_id' ) or '' )
98+ node .get ('properties' , {}).get ('node_data' , {})['tool_lib_id' ] = update_tool_map .get (tool_lib_id ,
99+ tool_lib_id )
96100
97101
98102class MKInstance :
@@ -628,6 +632,12 @@ def import_(self, instance: dict, is_import_tool, with_valid=True):
628632 if is_import_tool :
629633 if len (tool_model_list ) > 0 :
630634 QuerySet (Tool ).bulk_create (tool_model_list )
635+ QuerySet (ToolWorkflow ).bulk_create (
636+ [ToolWorkflow (workspace_id = workspace_id ,
637+ work_flow = self .reset_workflow (tool .get ('work_flow' ), update_tool_map ),
638+ tool_id = tool .get ('id' ))
639+ for
640+ tool in tool_list if tool .get ('tool_type' ) == ToolType .WORKFLOW ])
631641 UserResourcePermissionSerializer (data = {
632642 'workspace_id' : self .data .get ('workspace_id' ),
633643 'user_id' : self .data .get ('user_id' ),
@@ -670,6 +680,15 @@ def to_tool(tool, workspace_id, user_id):
670680 folder_id = workspace_id ,
671681 workspace_id = workspace_id )
672682
683+ @staticmethod
684+ def reset_workflow (work_flow , update_tool_map ):
685+ for node in work_flow .get ('nodes' , []):
686+ hand_node (node , update_tool_map )
687+ if node .get ('type' ) == 'loop-node' :
688+ for n in node .get ('properties' , {}).get ('node_data' , {}).get ('loop_body' , {}).get ('nodes' , []):
689+ hand_node (n , update_tool_map )
690+ return work_flow
691+
673692 @staticmethod
674693 def to_application (application , workspace_id , user_id , update_tool_map , folder_id ):
675694 work_flow = application .get ('work_flow' )
@@ -844,13 +863,16 @@ def export(self, with_valid=True):
844863 application_id = self .data .get ('application_id' )
845864 application = QuerySet (Application ).filter (id = application_id ).first ()
846865 from application .flow .tools import get_tool_id_list
847- tool_id_list = get_tool_id_list (application .work_flow )
866+ tool_id_list = get_tool_id_list (application .work_flow , True )
848867 if len (tool_id_list ) > 0 :
849868 tool_list = QuerySet (Tool ).filter (id__in = tool_id_list ).exclude (scope = ToolScope .SHARED )
850869 else :
851870 tool_list = QuerySet (Tool ).filter (
852871 id__in = application .tool_ids + application .mcp_tool_ids + application .skill_tool_ids
853872 ).exclude (scope = ToolScope .SHARED )
873+ tw_dict = {tw .tool_id : tw
874+ for tw in QuerySet (ToolWorkflow ).filter (
875+ tool_id__in = [tool .id for tool in tool_list if tool .tool_type == ToolType .WORKFLOW ])}
854876 # 如果是技能工具,则需要将code字段转换为文件内容的base64字符串
855877 for tool in tool_list :
856878 if tool .tool_type == ToolType .SKILL :
@@ -862,7 +884,7 @@ def export(self, with_valid=True):
862884 mk_instance = MKInstance (application_dict ,
863885 [],
864886 'v2' ,
865- [ToolExportModelSerializer (tool ). data for tool in
887+ [self . to_tool_dict (tool , tw_dict ) for tool in
866888 tool_list ])
867889 application_pickle = pickle .dumps (mk_instance )
868890 response = HttpResponse (content_type = 'text/plain' , content = application_pickle )
@@ -871,6 +893,12 @@ def export(self, with_valid=True):
871893 except Exception as e :
872894 return result .error (str (e ), response_status = status .HTTP_500_INTERNAL_SERVER_ERROR )
873895
896+ @staticmethod
897+ def to_tool_dict (tool , tool_workflow_dict ):
898+ if tool .tool_type == ToolType .WORKFLOW :
899+ return {** ToolExportModelSerializer (tool ).data , 'work_flow' : tool_workflow_dict .get (tool .id ).work_flow }
900+ return ToolExportModelSerializer (tool ).data
901+
874902 @staticmethod
875903 def reset_application_version (application_version , application ):
876904 update_field_dict = {
@@ -1329,7 +1357,7 @@ def batch_delete(self, instance: Dict, with_valid=True):
13291357 from trigger .serializers .trigger import TriggerModelSerializer
13301358
13311359 if with_valid :
1332- BatchSerializer (data = instance ).is_valid (model = Application ,raise_exception = True )
1360+ BatchSerializer (data = instance ).is_valid (model = Application , raise_exception = True )
13331361 self .is_valid (raise_exception = True )
13341362 id_list = instance .get ("id_list" )
13351363 workspace_id = self .data .get ('workspace_id' )
0 commit comments