Skip to content

Commit c386d6d

Browse files
committed
feat: Batch operate
1 parent f3f0d9e commit c386d6d

File tree

4 files changed

+101
-10
lines changed

4 files changed

+101
-10
lines changed

apps/trigger/api/trigger.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
from rest_framework import serializers
1212

1313
from common.mixins.api_mixin import APIMixin
14-
from trigger.serializers.trigger import TriggerCreateRequest, TriggerResponse
14+
from knowledge.serializers.common import BatchSerializer
15+
from trigger.serializers.trigger import TriggerCreateRequest, TriggerResponse, BatchActiveSerializer
1516

1617

1718
class TriggerCreateAPI(APIMixin):
@@ -35,6 +36,27 @@ def get_request():
3536
def get_response():
3637
return TriggerResponse
3738

39+
class TriggerBatchDeleteAPI(APIMixin):
40+
@staticmethod
41+
def get_parameters():
42+
return [
43+
OpenApiParameter(
44+
name="workspace_id",
45+
description="工作空间id",
46+
type=OpenApiTypes.STR,
47+
location='path',
48+
required=True,
49+
)
50+
]
51+
@staticmethod
52+
def get_request():
53+
return BatchSerializer
54+
55+
class TriggerBatchActiveAPI(APIMixin):
56+
@staticmethod
57+
def get_request():
58+
return BatchActiveSerializer
59+
3860

3961
class TriggerOperateAPI(APIMixin):
4062
@staticmethod

apps/trigger/serializers/trigger.py

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,15 @@
2020
from common.db.search import page_search
2121
from common.exception.app_exception import AppApiException
2222
from common.field.common import ObjectField
23+
from knowledge.serializers.common import BatchSerializer
2324
from tools.models import Tool
2425
from trigger.models import TriggerTypeChoices, Trigger, TriggerTaskTypeChoices, TriggerTask
2526

2627

28+
class BatchActiveSerializer(serializers.Serializer):
29+
id_list = serializers.ListField(required=True, child=serializers.UUIDField(required=True), label=_('id list'))
30+
is_active = serializers.BooleanField(required=True, label=_("is_active"))
31+
2732
class InputField(serializers.Serializer):
2833
source = serializers.CharField(required=True, label=_("source"), validators=[
2934
validators.RegexValidator(regex=re.compile("^custom|reference$"),
@@ -65,7 +70,7 @@ def validate_user_input_field_list(self, value):
6570
class ToolTaskParameterSerializer(serializers.Serializer):
6671
input_field_list = serializers.JSONField(required=False)
6772

68-
def validate_input_field_list(self,value):
73+
def validate_input_field_list(self, value):
6974
if not value:
7075
return value
7176
if not isinstance(value, dict):
@@ -315,6 +320,36 @@ def to_trigger_task_model(trigger_id: str, task_data: dict):
315320
meta=task_data.get('meta', {})
316321
)
317322

323+
class Batch(serializers.Serializer):
324+
workspace_id = serializers.CharField(required=True, label=_('workspace id'))
325+
user_id = serializers.UUIDField(required=True, label=_("User ID"))
326+
327+
def is_valid(self, *, raise_exception=False):
328+
super().is_valid(raise_exception=True)
329+
330+
@transaction.atomic
331+
def batch_delete(self, instance: Dict, with_valid=True):
332+
if with_valid:
333+
BatchSerializer(data=instance).is_valid(model=Trigger, raise_exception=True)
334+
self.is_valid(raise_exception=True)
335+
workspace_id = self.data.get("workspace_id")
336+
trigger_id_list = instance.get("id_list")
337+
338+
TriggerTask.objects.filter(trigger_id__in=trigger_id_list).delete()
339+
Trigger.objects.filter(workspace_id=workspace_id, id__in=trigger_id_list).delete()
340+
341+
return True
342+
343+
def batch_switch(self, instance: Dict, with_valid=True):
344+
if with_valid:
345+
BatchSerializer(data=instance).is_valid(model=Trigger, raise_exception=True)
346+
self.is_valid(raise_exception=True)
347+
workspace_id = self.data.get("workspace_id")
348+
trigger_id_list = instance.get("id_list")
349+
is_active = instance.get("is_active")
350+
Trigger.objects.filter(workspace_id=workspace_id, id__in=trigger_id_list).update(is_active=is_active)
351+
352+
return True
318353

319354
class TriggerOperateSerializer(serializers.Serializer):
320355
trigger_id = serializers.UUIDField(required=True, label=_('trigger id'))
@@ -367,6 +402,7 @@ def edit(self, instance: Dict, with_valid=True):
367402
def delete(self):
368403
self.is_valid(raise_exception=True)
369404
trigger_id = self.data.get('trigger_id')
405+
TriggerTask.objects.filter(trigger_id=trigger_id).delete()
370406
Trigger.objects.filter(id=trigger_id).delete()
371407
return True
372408

apps/trigger/urls.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515

1616
urlpatterns = [
1717
path('workspace/<str:workspace_id>/trigger', views.TriggerView.as_view(), name='trigger'),
18-
path('workspace/<str:workspace_id>/trigger/<str:trigger_id>', views.TriggerView.Operate.as_view(), name='trigger'),
18+
path('workspace/<str:workspace_id>/trigger/<str:trigger_id>', views.TriggerView.Operate.as_view(), name='trigger operate'),
19+
path('workspace/<str:workspace_id>/trigger/batch_delete', views.TriggerView.BatchDelete.as_view(), name='delete batch'),
20+
path('workspace/<str:workspace_id>/trigger/batch_activate', views.TriggerView.BatchActivate.as_view(), name='activate batch'),
1921
path('workspace/<str:workspace_id>/trigger/<int:current_page>/<int:page_size>', views.TriggerView.Page.as_view(),
2022
name='trigger_page'),
2123
path('workspace/<str:workspace_id>/task', views.TriggerTaskView.as_view(), name='task'),

apps/trigger/views/trigger.py

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,16 @@
88
"""
99
from django.utils.translation import gettext_lazy as _
1010
from drf_spectacular.utils import extend_schema
11-
from rest_framework import serializers
1211
from rest_framework.request import Request
1312
from rest_framework.views import APIView
1413

1514
from application.api.application_api import ApplicationCreateAPI
1615
from common import result
1716
from common.auth import TokenAuth
18-
from trigger.serializers.trigger import TriggerSerializer, TriggerQuerySerializer, TriggerOperateSerializer
19-
from common.auth.authentication import has_permissions, get_is_permissions
20-
from common.constants.permission_constants import PermissionConstants, RoleConstants, ViewPermission, CompareConstants
21-
from common.log.log import log
22-
from tools.api.tool import GetInternalToolAPI
23-
from trigger.api.trigger import TriggerCreateAPI, TriggerOperateAPI, TriggerEditAPI
17+
from trigger.serializers.trigger import TriggerQuerySerializer, TriggerOperateSerializer
18+
19+
from trigger.api.trigger import TriggerCreateAPI, TriggerOperateAPI, TriggerEditAPI, TriggerBatchDeleteAPI, \
20+
TriggerBatchActiveAPI
2421
from trigger.serializers.trigger import TriggerSerializer
2522

2623

@@ -102,7 +99,41 @@ def delete(self, request: Request, workspace_id: str, trigger_id: str):
10299
data={'trigger_id': trigger_id, 'workspace_id': workspace_id, 'user_id': request.user.id}
103100
).delete())
104101

102+
class BatchDelete(APIView):
103+
authentication_classes = [TokenAuth]
104+
105+
@extend_schema(
106+
methods=['PUT'],
107+
description=_('Delete trigger in batches'),
108+
summary=_('Delete trigger in batches'),
109+
operation_id=_('Delete trigger in batches'), # type: ignore
110+
parameters=TriggerBatchDeleteAPI.get_parameters(),
111+
request=TriggerBatchDeleteAPI.get_request(),
112+
responses=result.DefaultResultSerializer,
113+
tags=[_('Trigger')] # type: ignore
114+
)
115+
def put(self, request: Request, workspace_id: str):
116+
return result.success(TriggerSerializer.Batch(
117+
data={'workspace_id': workspace_id, 'user_id': request.user.id}
118+
).batch_delete(request.data))
105119

120+
class BatchActivate(APIView):
121+
authentication_classes = [TokenAuth]
122+
123+
@extend_schema(
124+
methods=['PUT'],
125+
description=_('Activate trigger in batches'),
126+
summary=_('Activate trigger in batches'),
127+
operation_id=_('Activate trigger in batches'), # type: ignore
128+
parameters=TriggerBatchDeleteAPI.get_parameters(),
129+
request=TriggerBatchActiveAPI.get_request(),
130+
responses=result.DefaultResultSerializer,
131+
tags=[_('Trigger')] # type: ignore
132+
)
133+
def put(self, request: Request, workspace_id: str):
134+
return result.success(TriggerSerializer.Batch(
135+
data={'workspace_id': workspace_id, 'user_id': request.user.id}
136+
).batch_switch(request.data))
106137

107138
class Page(APIView):
108139
authentication_classes = [TokenAuth]

0 commit comments

Comments
 (0)