66from rest_framework .views import APIView
77
88from common .auth import TokenAuth
9- from common .auth .authentication import has_permissions
9+ from common .auth .authentication import has_permissions , check_batch_permissions
1010from common .constants .permission_constants import PermissionConstants , RoleConstants , ViewPermission , CompareConstants
1111from common .log .log import log
12- from common . result import result
12+ from common import result
1313from tools .api .tool import ToolCreateAPI , ToolEditAPI , ToolReadAPI , ToolDeleteAPI , ToolTreeReadAPI , ToolDebugApi , \
14- ToolExportAPI , ToolImportAPI , ToolPageAPI , PylintAPI , EditIconAPI , GetInternalToolAPI , AddInternalToolAPI
14+ ToolExportAPI , ToolImportAPI , ToolPageAPI , PylintAPI , EditIconAPI , GetInternalToolAPI , AddInternalToolAPI , \
15+ ToolBatchOperateAPI
1516from tools .models import ToolScope , Tool
16- from tools .serializers .tool import ToolSerializer , ToolTreeSerializer
17+ from tools .serializers .tool import ToolSerializer , ToolTreeSerializer , ToolBatchOperateSerializer
1718
1819
1920def get_tool_operation_object (tool_id ):
@@ -24,6 +25,15 @@ def get_tool_operation_object(tool_id):
2425 }
2526 return {}
2627
28+ def get_tool_operation_object_batch (tool_id_list ):
29+ tool_model_list = QuerySet (model = Tool ).filter (id__in = tool_id_list )
30+ if tool_model_list is not None :
31+ return {
32+ "name" : f'[{ "," .join ([t .name for t in tool_model_list ])} ]' ,
33+ 'tool_list' : [{'name' : t .name } for t in tool_model_list ]
34+ }
35+ return {}
36+
2737
2838class ToolView (APIView ):
2939 authentication_classes = [TokenAuth ]
@@ -186,6 +196,83 @@ def delete(self, request: Request, workspace_id: str, tool_id: str):
186196 data = {'id' : tool_id , 'workspace_id' : workspace_id }
187197 ).delete ())
188198
199+ class BatchDelete (APIView ):
200+ authentication_classes = [TokenAuth ]
201+
202+ @extend_schema (
203+ methods = ['PUT' ],
204+ description = _ ("Batch delete tools" ),
205+ summary = _ ("Batch delete tools" ),
206+ operation_id = _ ("Batch delete tools" ),
207+ parameters = ToolBatchOperateAPI .get_parameters (),
208+ request = ToolBatchOperateAPI .get_request (),
209+ responses = result .DefaultResultSerializer ,
210+ tags = [_ ('Tool' )]
211+ )
212+ @has_permissions (PermissionConstants .TOOL_BATCH_DELETE .get_workspace_permission (),
213+ RoleConstants .USER .get_workspace_role (),
214+ RoleConstants .WORKSPACE_MANAGE .get_workspace_role ()
215+ )
216+ def put (self , request : Request , workspace_id : str ):
217+ id_list = request .data .get ('id_list' , [])
218+ permitted_ids = check_batch_permissions (
219+ request , id_list , 'tool_id' ,
220+ (PermissionConstants .TOOL_DELETE .get_workspace_tool_permission (),
221+ PermissionConstants .TOOL_DELETE .get_workspace_permission_workspace_manage_role (),
222+ ViewPermission ([RoleConstants .USER .get_workspace_role ()],
223+ [PermissionConstants .TOOL .get_workspace_tool_permission ()],
224+ CompareConstants .AND ),
225+ RoleConstants .WORKSPACE_MANAGE .get_workspace_role ()), workspace_id = workspace_id
226+ )
227+
228+ @log (menu = 'Tool' , operate = 'Batch delete tools' ,
229+ get_operation_object = lambda r , k : get_tool_operation_object_batch (permitted_ids ))
230+ def inner (view , r , ** kwargs ):
231+ return ToolBatchOperateSerializer (
232+ data = {'workspace_id' : workspace_id }
233+ ).batch_delete ({'id_list' : permitted_ids })
234+
235+ return result .success (inner (self , request , workspace_id = workspace_id ))
236+
237+ class BatchMove (APIView ):
238+ authentication_classes = [TokenAuth ]
239+
240+ @extend_schema (
241+ methods = ['PUT' ],
242+ description = _ ("Batch move tools" ),
243+ summary = _ ("Batch move tools" ),
244+ operation_id = _ ("Batch move tools" ),
245+ parameters = ToolBatchOperateAPI .get_parameters (),
246+ request = ToolBatchOperateAPI .get_move_request (),
247+ responses = result .DefaultResultSerializer ,
248+ tags = [_ ('Tool' )]
249+ )
250+ @has_permissions (PermissionConstants .TOOL_BATCH_MOVE .get_workspace_permission (),
251+ RoleConstants .USER .get_workspace_role (),
252+ RoleConstants .WORKSPACE_MANAGE .get_workspace_role ()
253+ )
254+ def put (self , request : Request , workspace_id : str ):
255+ id_list = request .data .get ('id_list' , [])
256+ permitted_ids = check_batch_permissions (
257+ request , id_list , 'tool_id' ,
258+ (PermissionConstants .TOOL_EDIT .get_workspace_tool_permission (),
259+ PermissionConstants .TOOL_EDIT .get_workspace_permission_workspace_manage_role (),
260+ ViewPermission ([RoleConstants .USER .get_workspace_role ()],
261+ [PermissionConstants .TOOL .get_workspace_tool_permission ()],
262+ CompareConstants .AND ),
263+ RoleConstants .WORKSPACE_MANAGE .get_workspace_role ()),
264+ workspace_id = workspace_id
265+ )
266+
267+ @log (menu = 'Tool' , operate = 'Batch move tools' ,
268+ get_operation_object = lambda r , k : get_tool_operation_object_batch (permitted_ids ))
269+ def inner (view , r , ** kwargs ):
270+ return ToolBatchOperateSerializer (
271+ data = {'workspace_id' : workspace_id }
272+ ).batch_move ({'id_list' : permitted_ids , 'folder_id' : request .data .get ('folder_id' )})
273+
274+ return result .success (inner (self , request , workspace_id = workspace_id ))
275+
189276 class Page (APIView ):
190277 authentication_classes = [TokenAuth ]
191278
0 commit comments