55from functools import reduce
66from typing import Dict , List
77
8+ import requests
89import uuid_utils .compat as uuid
910from django .core .cache import cache
1011from django .db import transaction
2526from common .exception .app_exception import AppApiException
2627from common .field .common import UploadedFileField
2728from common .result import result
29+ from common .utils .common import bytes_to_uploaded_file
2830from common .utils .common import restricted_loads , generate_uuid
31+ from common .utils .logger import maxkb_logger
2932from common .utils .rsa_util import rsa_long_decrypt
3033from common .utils .tool_code import ToolExecutor
3134from knowledge .models import KnowledgeScope , Knowledge , KnowledgeType , KnowledgeWorkflow , KnowledgeWorkflowVersion
@@ -70,6 +73,7 @@ class KnowledgeWorkflowActionListQuerySerializer(serializers.Serializer):
7073 user_name = serializers .CharField (required = False , label = _ ('Name' ), allow_blank = True , allow_null = True )
7174 state = serializers .CharField (required = False , label = _ ("State" ), allow_blank = True , allow_null = True )
7275
76+
7377class KBWFInstance :
7478
7579 def __init__ (self , knowledge_workflow : dict , function_lib_list : List [dict ], version : str , tool_list : List [dict ]):
@@ -81,6 +85,7 @@ def __init__(self, knowledge_workflow: dict, function_lib_list: List[dict], vers
8185 def get_tool_list (self ):
8286 return [* (self .tool_list or []), * (self .function_lib_list or [])]
8387
88+
8489class KnowledgeWorkflowActionSerializer (serializers .Serializer ):
8590 workspace_id = serializers .CharField (required = True , label = _ ('workspace id' ))
8691 knowledge_id = serializers .UUIDField (required = True , label = _ ('knowledge id' ))
@@ -248,13 +253,32 @@ def save_workflow(self, instance: Dict):
248253
249254 knowledge_workflow .save ()
250255 save_workflow_mapping (instance .get ('work_flow' , {}), ResourceType .KNOWLEDGE , str (knowledge_id ))
256+
257+ # 处理 work_flow_template
258+ if instance .get ('work_flow_template' ) is not None :
259+ template_instance = instance .get ('work_flow_template' )
260+ download_url = template_instance .get ('downloadUrl' )
261+ # 查找匹配的版本名称
262+ res = requests .get (download_url , timeout = 5 )
263+ KnowledgeWorkflowSerializer .Import (data = {
264+ 'user_id' : self .data .get ('user_id' ),
265+ 'workspace_id' : self .data .get ('workspace_id' ),
266+ 'knowledge_id' : str (knowledge_id ),
267+ }).import_ ({'file' : bytes_to_uploaded_file (res .content , 'file.kbwf' )}, is_import_tool = True )
268+
269+ try :
270+ requests .get (template_instance .get ('downloadCallbackUrl' ), timeout = 5 )
271+ except Exception as e :
272+ maxkb_logger .error (f"callback appstore tool download error: { e } " )
273+
251274 return {** KnowledgeModelSerializer (knowledge ).data , 'document_list' : []}
252275
253276 class Import (serializers .Serializer ):
254277 user_id = serializers .UUIDField (required = True , label = _ ('user id' ))
255278 workspace_id = serializers .CharField (required = True , label = _ ('workspace id' ))
256279 knowledge_id = serializers .UUIDField (required = True , label = _ ('knowledge id' ))
257280
281+ @transaction .atomic
258282 def import_ (self , instance : dict , is_import_tool , with_valid = True ):
259283 if with_valid :
260284 self .is_valid ()
@@ -296,8 +320,10 @@ def import_(self, instance: dict, is_import_tool, with_valid=True):
296320 update_tool_map ,
297321 )
298322 tool_model_list = [self .to_tool (tool , workspace_id , user_id ) for tool in tool_list ]
299- KnowledgeWorkflow .objects .filter (workspace_id = workspace_id ,knowledge_id = knowledge_id ).update (
300- work_flow = work_flow
323+ KnowledgeWorkflow .objects .filter (workspace_id = workspace_id , knowledge_id = knowledge_id ).update_or_create (
324+ knowledge_id = knowledge_id ,
325+ workspace_id = workspace_id ,
326+ defaults = {'work_flow' : work_flow }
301327 )
302328
303329 if is_import_tool :
@@ -373,7 +399,6 @@ def export(self, with_valid=True):
373399 except Exception as e :
374400 return result .error (str (e ), response_status = status .HTTP_500_INTERNAL_SERVER_ERROR )
375401
376-
377402 class Operate (serializers .Serializer ):
378403 user_id = serializers .UUIDField (required = True , label = _ ('user id' ))
379404 workspace_id = serializers .CharField (required = True , label = _ ('workspace id' ))
@@ -416,6 +441,23 @@ def edit(self, instance: Dict):
416441 'work_flow' : instance .get ('work_flow' )
417442 })
418443 return self .one ()
444+ if instance .get ("work_flow_template" ):
445+ template_instance = instance .get ('work_flow_template' )
446+ download_url = template_instance .get ('downloadUrl' )
447+ # 查找匹配的版本名称
448+ res = requests .get (download_url , timeout = 5 )
449+ KnowledgeWorkflowSerializer .Import (data = {
450+ 'user_id' : self .data .get ('user_id' ),
451+ 'workspace_id' : self .data .get ('workspace_id' ),
452+ 'knowledge_id' : str (self .data .get ('knowledge_id' )),
453+ }).import_ ({'file' : bytes_to_uploaded_file (res .content , 'file.kbwf' )}, is_import_tool = False )
454+
455+ try :
456+ requests .get (template_instance .get ('downloadCallbackUrl' ), timeout = 5 )
457+ except Exception as e :
458+ maxkb_logger .error (f"callback appstore tool download error: { e } " )
459+
460+ return self .one ()
419461
420462 def one (self ):
421463 self .is_valid (raise_exception = True )
0 commit comments