trigger.py 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403
  1. # coding=utf-8
  2. """
  3. @project: MaxKB
  4. @Author:niu
  5. @file: trigger.py
  6. @date:2026/1/14 11:44
  7. @desc:
  8. """
  9. from django.db.models import QuerySet
  10. from django.utils.translation import gettext_lazy as _
  11. from drf_spectacular.utils import extend_schema
  12. from rest_framework.request import Request
  13. from rest_framework.views import APIView
  14. from application.api.application_api import ApplicationCreateAPI
  15. from common import result
  16. from common.auth import TokenAuth
  17. from common.auth.authentication import has_permissions
  18. from common.constants.permission_constants import PermissionConstants, RoleConstants, ViewPermission, CompareConstants, \
  19. Permission, Group, Operate
  20. from common.log.log import log
  21. from common.result import DefaultResultSerializer
  22. from trigger.models import Trigger
  23. from trigger.serializers.task_source_trigger import TaskSourceTriggerListSerializer, TaskSourceTriggerOperateSerializer, \
  24. TaskSourceTriggerSerializer
  25. from trigger.serializers.trigger import TriggerQuerySerializer, TriggerOperateSerializer
  26. from trigger.api.trigger import TriggerCreateAPI, TriggerOperateAPI, TriggerEditAPI, TriggerBatchDeleteAPI, \
  27. TriggerBatchActiveAPI, TaskSourceTriggerOperateAPI, TaskSourceTriggerAPI, TaskSourceTriggerCreateAPI, \
  28. TriggerQueryAPI, TriggerQueryPageAPI
  29. from trigger.serializers.trigger import TriggerSerializer
  30. def get_trigger_operation_object(trigger_id):
  31. trigger_model = QuerySet(model=Trigger).filter(id=trigger_id).first()
  32. if trigger_model is not None:
  33. return {
  34. "name": trigger_model.name
  35. }
  36. def get_trigger_operation_object_batch(trigger_id_list):
  37. trigger_model_list = QuerySet(model=Trigger).filter(id__in=trigger_id_list)
  38. if trigger_model_list is not None:
  39. return {
  40. "name": f'[{",".join([trigger_model.name for trigger_model in trigger_model_list])}]',
  41. "trigger_list": [{'name': trigger_model.name, 'type': trigger_model.type} for trigger_model in
  42. trigger_model_list]
  43. }
  44. class TriggerView(APIView):
  45. authentication_classes = [TokenAuth]
  46. @extend_schema(
  47. methods=['POST'],
  48. description=_('Create trigger'),
  49. summary=_('Create trigger'),
  50. operation_id=_('Create trigger'), # type: ignore
  51. parameters=TriggerCreateAPI.get_parameters(),
  52. request=TriggerCreateAPI.get_request(),
  53. responses=TriggerCreateAPI.get_response(),
  54. tags=[_('Trigger')] # type: ignore
  55. )
  56. @has_permissions(
  57. PermissionConstants.TRIGGER_CREATE.get_workspace_permission_workspace_manage_role(),
  58. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  59. )
  60. @log(
  61. menu="Trigger", operate="Create trigger",
  62. get_operation_object=lambda r, k: r.data.get('name'),
  63. )
  64. def post(self, request: Request, workspace_id: str):
  65. return result.success(TriggerSerializer(
  66. data={'workspace_id': workspace_id, 'user_id': request.user.id}).insert(request.data))
  67. @extend_schema(
  68. methods=['GET'],
  69. description=_('Get the trigger list'),
  70. summary=_('Get the trigger list'),
  71. operation_id=_('Get the trigger list'), # type: ignore
  72. parameters=TriggerQueryAPI.get_parameters(),
  73. responses=TriggerQueryAPI.get_response(),
  74. tags=[_('Trigger')] # type: ignore
  75. )
  76. @has_permissions(
  77. PermissionConstants.TRIGGER_READ.get_workspace_permission_workspace_manage_role(),
  78. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  79. )
  80. def get(self, request: Request, workspace_id: str):
  81. return result.success(TriggerQuerySerializer(data={
  82. 'workspace_id': workspace_id,
  83. 'name': request.query_params.get('name'),
  84. 'type': request.query_params.get('type'),
  85. 'task': request.query_params.get('task'),
  86. 'is_active': request.query_params.get('is_active'),
  87. 'create_user': request.query_params.get('create_user'),
  88. }).list())
  89. class Operate(APIView):
  90. authentication_classes = [TokenAuth]
  91. @extend_schema(
  92. methods=['GET'],
  93. description=_('Get trigger details'),
  94. summary=_('Get trigger details'),
  95. operation_id=_('Get trigger details'), # type: ignore
  96. parameters=TriggerOperateAPI.get_parameters(),
  97. responses=result.DefaultResultSerializer,
  98. tags=[_('Trigger')] # type: ignore
  99. )
  100. @has_permissions(
  101. PermissionConstants.TRIGGER_READ.get_workspace_permission_workspace_manage_role(),
  102. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  103. )
  104. @log(
  105. menu="Trigger", operate="Get trigger details",
  106. get_operation_object=lambda r, k: get_trigger_operation_object(k.get('trigger_id')),
  107. )
  108. def get(self, request: Request, workspace_id: str, trigger_id: str):
  109. return result.success(TriggerOperateSerializer(
  110. data={'trigger_id': trigger_id, 'workspace_id': workspace_id, 'user_id': request.user.id}
  111. ).one())
  112. @extend_schema(
  113. methods=['PUT'],
  114. description=_('Modify the trigger'),
  115. summary=_('Modify the trigger'),
  116. operation_id=_('Modify the trigger'), # type: ignore
  117. parameters=TriggerOperateAPI.get_parameters(),
  118. request=TriggerEditAPI.get_request(),
  119. responses=result.DefaultResultSerializer,
  120. tags=[_('Trigger')] # type: ignore
  121. )
  122. @has_permissions(
  123. PermissionConstants.TRIGGER_EDIT.get_workspace_permission_workspace_manage_role(),
  124. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  125. )
  126. @log(
  127. menu="Trigger", operate="Modify the trigger",
  128. get_operation_object=lambda r, k: get_trigger_operation_object(k.get('trigger_id')),
  129. )
  130. def put(self, request: Request, workspace_id: str, trigger_id: str):
  131. return result.success(TriggerOperateSerializer(
  132. data={'trigger_id': trigger_id, 'workspace_id': workspace_id, 'user_id': request.user.id}
  133. ).edit(request.data))
  134. @extend_schema(
  135. methods=['DELETE'],
  136. description=_('Delete the trigger'),
  137. summary=_('Delete the trigger'),
  138. operation_id=_('Delete the trigger'), # type: ignore
  139. parameters=TriggerOperateAPI.get_parameters(),
  140. responses=result.DefaultResultSerializer,
  141. tags=[_('Trigger')] # type: ignore
  142. )
  143. @has_permissions(
  144. PermissionConstants.TRIGGER_DELETE.get_workspace_permission_workspace_manage_role(),
  145. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  146. )
  147. @log(
  148. menu="Trigger", operate="Delete the trigger",
  149. get_operation_object=lambda r, k: get_trigger_operation_object(k.get('trigger_id')),
  150. )
  151. def delete(self, request: Request, workspace_id: str, trigger_id: str):
  152. return result.success(TriggerOperateSerializer(
  153. data={'trigger_id': trigger_id, 'workspace_id': workspace_id, 'user_id': request.user.id}
  154. ).delete())
  155. class BatchDelete(APIView):
  156. authentication_classes = [TokenAuth]
  157. @extend_schema(
  158. methods=['PUT'],
  159. description=_('Delete trigger in batches'),
  160. summary=_('Delete trigger in batches'),
  161. operation_id=_('Delete trigger in batches'), # type: ignore
  162. parameters=TriggerBatchDeleteAPI.get_parameters(),
  163. request=TriggerBatchDeleteAPI.get_request(),
  164. responses=result.DefaultResultSerializer,
  165. tags=[_('Trigger')] # type: ignore
  166. )
  167. @has_permissions(
  168. PermissionConstants.TRIGGER_DELETE.get_workspace_permission_workspace_manage_role(),
  169. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  170. )
  171. @log(
  172. menu="Trigger", operate="Delete trigger in batches",
  173. get_operation_object=lambda r, k: get_trigger_operation_object_batch(r.data.get('id_list')),
  174. )
  175. def put(self, request: Request, workspace_id: str):
  176. return result.success(TriggerSerializer.Batch(
  177. data={'workspace_id': workspace_id, 'user_id': request.user.id}
  178. ).batch_delete(request.data))
  179. class BatchActivate(APIView):
  180. authentication_classes = [TokenAuth]
  181. @extend_schema(
  182. methods=['PUT'],
  183. description=_('Activate trigger in batches'),
  184. summary=_('Activate trigger in batches'),
  185. operation_id=_('Activate trigger in batches'), # type: ignore
  186. parameters=TriggerBatchDeleteAPI.get_parameters(),
  187. request=TriggerBatchActiveAPI.get_request(),
  188. responses=result.DefaultResultSerializer,
  189. tags=[_('Trigger')] # type: ignore
  190. )
  191. @has_permissions(
  192. PermissionConstants.TRIGGER_EDIT.get_workspace_permission_workspace_manage_role(),
  193. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  194. )
  195. @log(
  196. menu="Trigger", operate="Activate trigger in batches",
  197. get_operation_object=lambda r, k: get_trigger_operation_object_batch(r.data.get('id_list')),
  198. )
  199. def put(self, request: Request, workspace_id: str):
  200. return result.success(TriggerSerializer.Batch(
  201. data={'workspace_id': workspace_id, 'user_id': request.user.id}
  202. ).batch_switch(request.data))
  203. class Page(APIView):
  204. authentication_classes = [TokenAuth]
  205. @extend_schema(
  206. methods=['GET'],
  207. description=_('Get the trigger list by page'),
  208. summary=_('Get the trigger list by page'),
  209. operation_id=_('Get the trigger list by page'), # type: ignore
  210. parameters=TriggerQueryPageAPI.get_parameters(),
  211. responses=TriggerQueryPageAPI.get_response(),
  212. tags=[_('Trigger')] # type: ignore
  213. )
  214. @has_permissions(
  215. PermissionConstants.TRIGGER_READ.get_workspace_permission_workspace_manage_role(),
  216. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  217. )
  218. def get(self, request: Request, workspace_id: str, current_page: int, page_size: int):
  219. return result.success(TriggerQuerySerializer(data={
  220. 'workspace_id': workspace_id,
  221. 'name': request.query_params.get('name'),
  222. 'task': request.query_params.get('task'),
  223. 'type': request.query_params.get('type'),
  224. 'is_active': request.query_params.get('is_active'),
  225. 'create_user': request.query_params.get('create_user'),
  226. }).page(current_page, page_size))
  227. class TaskSourceTriggerView(APIView):
  228. authentication_classes = [TokenAuth]
  229. @extend_schema(
  230. methods=['POST'],
  231. description=_('Create trigger in source'),
  232. summary=_('Create trigger in source'),
  233. operation_id=_('Create trigger in source'), # type: ignore
  234. parameters=TaskSourceTriggerCreateAPI.get_parameters(),
  235. request=TaskSourceTriggerCreateAPI.get_request(),
  236. responses=TaskSourceTriggerCreateAPI.get_response(),
  237. tags=[_('Trigger')] # type: ignore
  238. )
  239. @has_permissions(
  240. lambda r, kwargs: Permission(group=Group(kwargs.get("source_type")), operate=Operate.TRIGGER_CREATE,
  241. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}:ROLE/WORKSPACE_MANAGE"
  242. ),
  243. lambda r, kwargs: Permission(group=Group(kwargs.get("source_type")), operate=Operate.TRIGGER_CREATE,
  244. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('source_type')}/{kwargs.get('source_id')}"
  245. ),
  246. ViewPermission([RoleConstants.USER.get_workspace_role()],
  247. [lambda r, kwargs: Permission(group=Group(kwargs.get('source_type')),
  248. operate=Operate.SELF,
  249. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('source_type')}/{kwargs.get('source_id')}")],
  250. CompareConstants.AND),
  251. RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
  252. @log(
  253. menu="Trigger", operate="Create trigger in source",
  254. get_operation_object=lambda r, k: r.data.get('name'),
  255. )
  256. def post(self, request: Request, workspace_id: str, source_type: str, source_id: str):
  257. return result.success(TaskSourceTriggerSerializer(data={
  258. 'workspace_id': workspace_id,
  259. 'user_id': request.user.id
  260. }).insert({**request.data, 'source_id': source_id,
  261. 'workspace_id': workspace_id,
  262. 'is_active': True,
  263. 'source_type': source_type}))
  264. @extend_schema(
  265. methods=['GET'],
  266. description=_('Get the trigger list of source'),
  267. summary=_('Get the trigger list of source'),
  268. operation_id=_('Get the trigger list of source'), # type: ignore
  269. parameters=TaskSourceTriggerAPI.get_parameters(),
  270. responses=DefaultResultSerializer,
  271. tags=[_('Trigger')] # type: ignore
  272. )
  273. @has_permissions(
  274. lambda r, kwargs: Permission(group=Group(kwargs.get("source_type")), operate=Operate.TRIGGER_READ,
  275. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}:ROLE/WORKSPACE_MANAGE"
  276. ),
  277. lambda r, kwargs: Permission(group=Group(kwargs.get("source_type")), operate=Operate.TRIGGER_READ,
  278. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('source_type')}/{kwargs.get('source_id')}"
  279. ),
  280. RoleConstants.USER.get_workspace_role(),
  281. RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
  282. def get(self, request: Request, workspace_id: str, source_type: str, source_id: str):
  283. return result.success(TaskSourceTriggerListSerializer(data={
  284. 'workspace_id': workspace_id,
  285. 'source_id': source_id,
  286. 'source_type': source_type,
  287. }).list())
  288. class Operate(APIView):
  289. authentication_classes = [TokenAuth]
  290. @extend_schema(
  291. methods=['GET'],
  292. description=_('Get Task source trigger details'),
  293. summary=_('Get Task source trigger details'),
  294. operation_id=_('Get Task source trigger details'), # type: ignore
  295. parameters=TaskSourceTriggerOperateAPI.get_parameters(),
  296. responses=result.DefaultResultSerializer,
  297. tags=[_('Trigger')] # type: ignore
  298. )
  299. @has_permissions(
  300. lambda r, kwargs: Permission(group=Group(kwargs.get("source_type")), operate=Operate.TRIGGER_READ,
  301. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}:ROLE/WORKSPACE_MANAGE"
  302. ),
  303. lambda r, kwargs: Permission(group=Group(kwargs.get("source_type")), operate=Operate.TRIGGER_READ,
  304. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('source_type')}/{kwargs.get('source_id')}"
  305. ),
  306. RoleConstants.USER.get_workspace_role(),
  307. RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
  308. def get(self, request: Request, workspace_id: str, source_type: str, source_id: str, trigger_id: str):
  309. return result.success(TaskSourceTriggerOperateSerializer(
  310. data={'trigger_id': trigger_id, 'workspace_id': workspace_id,
  311. 'source_id': source_id, 'source_type': source_type}
  312. ).one())
  313. @extend_schema(
  314. methods=['PUT'],
  315. description=_('Modify the task source trigger'),
  316. summary=_('Modify the task source trigger'),
  317. operation_id=_('Modify the task source trigger'), # type: ignore
  318. parameters=TaskSourceTriggerOperateAPI.get_parameters(),
  319. request=TaskSourceTriggerOperateAPI.get_request(),
  320. responses=result.DefaultResultSerializer,
  321. tags=[_('Trigger')] # type: ignore
  322. )
  323. @has_permissions(
  324. lambda r, kwargs: Permission(group=Group(kwargs.get("source_type")), operate=Operate.TRIGGER_EDIT,
  325. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}:ROLE/WORKSPACE_MANAGE"
  326. ),
  327. lambda r, kwargs: Permission(group=Group(kwargs.get("source_type")), operate=Operate.TRIGGER_EDIT,
  328. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('source_type')}/{kwargs.get('source_id')}"
  329. ),
  330. ViewPermission([RoleConstants.USER.get_workspace_role()],
  331. [lambda r, kwargs: Permission(group=Group(kwargs.get('source_type')),
  332. operate=Operate.SELF,
  333. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('source_type')}/{kwargs.get('source_id')}")],
  334. CompareConstants.AND),
  335. RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
  336. @log(
  337. menu="Trigger", operate="Modify the source point trigger",
  338. get_operation_object=lambda r, k: get_trigger_operation_object(k.get('trigger_id')),
  339. )
  340. def put(self, request: Request, workspace_id: str, source_type: str, source_id: str, trigger_id: str):
  341. return result.success(TaskSourceTriggerOperateSerializer(
  342. data={'trigger_id': trigger_id, 'workspace_id': workspace_id,
  343. 'source_id': source_id, 'source_type': source_type}
  344. ).edit(request.data))
  345. @extend_schema(
  346. methods=['DELETE'],
  347. description=_('Delete the task source trigger'),
  348. summary=_('Delete the task source trigger'),
  349. operation_id=_('Delete the task source trigger'), # type: ignore
  350. parameters=TaskSourceTriggerOperateAPI.get_parameters(),
  351. responses=result.DefaultResultSerializer,
  352. tags=[_('Trigger')] # type: ignore
  353. )
  354. @has_permissions(
  355. lambda r, kwargs: Permission(group=Group(kwargs.get("source_type")), operate=Operate.TRIGGER_DELETE,
  356. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}:ROLE/WORKSPACE_MANAGE"
  357. ),
  358. lambda r, kwargs: Permission(group=Group(kwargs.get("source_type")), operate=Operate.TRIGGER_DELETE,
  359. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('source_type')}/{kwargs.get('source_id')}"
  360. ),
  361. ViewPermission([RoleConstants.USER.get_workspace_role()],
  362. [lambda r, kwargs: Permission(group=Group(kwargs.get('source_type')),
  363. operate=Operate.SELF,
  364. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('source_type')}/{kwargs.get('source_id')}")],
  365. CompareConstants.AND),
  366. RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
  367. @log(
  368. menu="Trigger", operate="Delete the source point trigger",
  369. get_operation_object=lambda r, k: get_trigger_operation_object(k.get('trigger_id')),
  370. )
  371. def delete(self, request: Request, workspace_id: str, source_type: str, source_id: str, trigger_id: str):
  372. return result.success(TaskSourceTriggerOperateSerializer(
  373. data={'trigger_id': trigger_id, 'workspace_id': workspace_id,
  374. 'source_id': source_id, 'source_type': source_type}
  375. ).delete())