Skip to content

Commit bc2e644

Browse files
committed
feat: Create trigger
1 parent 16c5c4e commit bc2e644

6 files changed

Lines changed: 116 additions & 57 deletions

File tree

apps/trigger/api/__init__.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# coding=utf-8
2+
"""
3+
@project: MaxKB
4+
@Author:niu
5+
@file: __init__.py.py
6+
@date:2026/1/14 15:48
7+
@desc:
8+
"""

apps/trigger/api/trigger.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# coding=utf-8
2+
"""
3+
@project: MaxKB
4+
@Author:niu
5+
@file: trigger.py
6+
@date:2026/1/14 15:49
7+
@desc:
8+
"""
9+
from drf_spectacular.types import OpenApiTypes
10+
from drf_spectacular.utils import OpenApiParameter
11+
12+
from common.mixins.api_mixin import APIMixin
13+
from trigger.serializers.trigger import TriggerCreateRequest, TriggerResponse
14+
15+
16+
class TriggerCreateAPI(APIMixin):
17+
@staticmethod
18+
def get_parameters():
19+
return [
20+
OpenApiParameter(
21+
name="workspace_id",
22+
description="工作空间id",
23+
type=OpenApiTypes.STR,
24+
location='path',
25+
required=True,
26+
)
27+
]
28+
29+
@staticmethod
30+
def get_request():
31+
return TriggerCreateRequest
32+
33+
@staticmethod
34+
def get_response():
35+
return TriggerResponse
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Generated by Django 5.2.9 on 2026-01-14 08:07
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('trigger', '0001_initial'),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name='triggertask',
15+
name='meta',
16+
field=models.JSONField(default=dict),
17+
),
18+
migrations.AddField(
19+
model_name='triggertask',
20+
name='parameter',
21+
field=models.JSONField(default=list),
22+
),
23+
]

apps/trigger/models/trigger.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ class TriggerTask(AppModelMixin):
4747
)
4848
source_id = models.UUIDField(verbose_name="资源id", blank=True, null=True)
4949
is_active = models.BooleanField(default=True, db_index=True)
50+
parameter = models.JSONField(default=list)
51+
meta = models.JSONField(default=dict)
5052

5153
class Meta:
5254
db_table = "event_trigger_task"

apps/trigger/serializers/trigger.py

Lines changed: 39 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -6,71 +6,32 @@
66
@date:2026/1/14 11:48
77
@desc:
88
"""
9-
import asyncio
10-
import hashlib
11-
import json
12-
import os
13-
import pickle
14-
import re
15-
import tempfile
16-
import zipfile
17-
from functools import reduce
18-
from typing import Dict, List
19-
20-
import requests
9+
2110
import uuid_utils.compat as uuid
22-
from django.core import validators
2311
from django.db import models, transaction
24-
from django.db.models import QuerySet, Q
25-
from django.http import HttpResponse
26-
from django.utils import timezone
12+
from django.db.models import QuerySet
2713
from django.utils.translation import gettext_lazy as _
28-
from langchain_mcp_adapters.client import MultiServerMCPClient
29-
from rest_framework import serializers, status
30-
from rest_framework.utils.formatting import lazy_format
31-
32-
from application.flow.common import Workflow
33-
from application.models.application import Application, ApplicationTypeChoices, \
34-
ApplicationFolder, ApplicationVersion, ApplicationKnowledgeMapping
35-
from application.models.application_access_token import ApplicationAccessToken
36-
from application.serializers.common import update_resource_mapping_by_application
37-
from common import result
38-
from common.cache_data.application_access_token_cache import del_application_access_token
39-
from common.database_model_manage.database_model_manage import DatabaseModelManage
40-
from common.db.search import native_search, native_page_search, page_search
14+
from rest_framework import serializers
15+
16+
from common.db.search import page_search
4117
from common.exception.app_exception import AppApiException
42-
from common.field.common import UploadedFileField
43-
from common.utils.common import get_file_content, restricted_loads, generate_uuid, _remove_empty_lines, \
44-
bytes_to_uploaded_file
45-
from common.utils.logger import maxkb_logger
46-
from knowledge.models import Knowledge, KnowledgeScope
47-
from knowledge.serializers.knowledge import KnowledgeSerializer, KnowledgeModelSerializer
48-
from maxkb.conf import PROJECT_DIR
49-
from models_provider.models import Model
50-
from models_provider.tools import get_model_instance_by_model_workspace_id
51-
from system_manage.models import WorkspaceUserResourcePermission, AuthTargetType
52-
from system_manage.models.resource_mapping import ResourceMapping
53-
from system_manage.serializers.resource_mapping_serializers import ResourceMappingSerializer
54-
from system_manage.serializers.user_resource_permission import UserResourcePermissionSerializer
55-
from tools.models import Tool, ToolScope
56-
from tools.serializers.tool import ToolExportModelSerializer
57-
from trigger.models import TriggerTypeChoices, Trigger
58-
from users.models import User
59-
from users.serializers.user import is_workspace_manage
18+
from trigger.models import TriggerTypeChoices, Trigger, TriggerTaskTypeChoices, TriggerTask
6019

6120

6221
class TriggerTaskCreateRequest(serializers.Serializer):
63-
pass
22+
source_type = serializers.ChoiceField(required=True, choices=TriggerTaskTypeChoices)
23+
source_id = serializers.CharField(required=True, label=_('source_id'))
24+
is_active = serializers.BooleanField(required=False, label=_('Is active'))
6425

6526

6627
class TriggerCreateRequest(serializers.Serializer):
6728
name = serializers.CharField(required=True, label=_('trigger name'))
6829
desc = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_('trigger description'))
69-
trigger_type = serializers.ChoiceField(choices=TriggerTypeChoices)
30+
trigger_type = serializers.ChoiceField(required=True, choices=TriggerTypeChoices)
7031
trigger_setting = serializers.DictField(required=True, label=_("trigger setting"))
71-
meta = models.JSONField(required=False, allow_null=True, allow_blank=True, default=dict)
32+
meta = models.JSONField(default=dict)
7233
is_active = serializers.BooleanField(required=False, label=_('Is active'))
73-
trigger_task = serializers
34+
trigger_task = TriggerTaskCreateRequest(many=True)
7435

7536

7637
class TriggerResponse(serializers.ModelSerializer):
@@ -89,8 +50,10 @@ def insert(self, instance, with_valid=True):
8950
self.is_valid(raise_exception=True)
9051
TriggerCreateRequest(data=instance).is_valid(raise_exception=True)
9152

53+
trigger_id = uuid.uuid7()
54+
9255
trigger_model = Trigger(
93-
id=uuid.uuid7(),
56+
id=trigger_id,
9457
name=instance.get('name'),
9558
workspace_id=self.data.get('workspace_id'),
9659
desc=instance.get('desc'),
@@ -102,8 +65,30 @@ def insert(self, instance, with_valid=True):
10265
)
10366
trigger_model.save()
10467

68+
trigger_tasks = instance.get('trigger_task')
69+
if trigger_tasks:
70+
trigger_task_models = [
71+
self.to_trigger_task_model(trigger_id, task.get('source_type'), task.get('source_id')) for task in
72+
trigger_tasks
73+
]
74+
TriggerTask.objects.bulk_create(trigger_task_models)
75+
else:
76+
raise AppApiException(500, _('Trigger task can not be empty'))
77+
78+
10579
return TriggerResponse(trigger_model).data
10680

81+
@staticmethod
82+
def to_trigger_task_model(trigger_id: str, source_type: str, source_id: str):
83+
return TriggerTask(
84+
id=uuid.uuid7(),
85+
trigger_id=trigger_id,
86+
source_type=source_type,
87+
source_id=source_id,
88+
is_active=False
89+
)
90+
91+
10792

10893
class TriggerOperateSerializer(serializers.Serializer):
10994
trigger_id = serializers.UUIDField(required=True, label=_('trigger id'))
@@ -136,9 +121,9 @@ def get_query_set(self):
136121
def page(self, current_page: int, page_size: int, with_valid=True):
137122
if with_valid:
138123
self.is_valid(raise_exception=True)
139-
return page_search(current_page, page_size, self.get_query_set(), lambda row: TriggerResponse(data=row).data)
124+
return page_search(current_page, page_size, self.get_query_set(), lambda row: TriggerResponse(row).data)
140125

141126
def list(self, with_valid=True):
142127
if with_valid:
143128
self.is_valid(raise_exception=True)
144-
return [TriggerResponse(data=row).data for row in self.get_query_set()]
129+
return [TriggerResponse(row).data for row in self.get_query_set()]

apps/trigger/views/trigger.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@
1515
from common import result
1616
from common.auth import TokenAuth
1717
from trigger.serializers.trigger import TriggerSerializer, TriggerQuerySerializer
18+
from common.auth.authentication import has_permissions, get_is_permissions
19+
from common.constants.permission_constants import PermissionConstants, RoleConstants, ViewPermission, CompareConstants
20+
from common.log.log import log
21+
from tools.api.tool import GetInternalToolAPI
22+
from trigger.api.trigger import TriggerCreateAPI
23+
from trigger.serializers.trigger import TriggerSerializer
1824

1925

2026
class TriggerView(APIView):
@@ -25,9 +31,9 @@ class TriggerView(APIView):
2531
description=_('Create trigger'),
2632
summary=_('Create trigger'),
2733
operation_id=_('Create trigger'), # type: ignore
28-
parameters=ApplicationCreateAPI.get_parameters(),
29-
request=ApplicationCreateAPI.get_request(),
30-
responses=ApplicationCreateAPI.get_response(),
34+
parameters=TriggerCreateAPI.get_parameters(),
35+
request=TriggerCreateAPI.get_request(),
36+
responses=TriggerCreateAPI.get_response(),
3137
tags=[_('Trigger')] # type: ignore
3238
)
3339
def post(self, request: Request, workspace_id: str):

0 commit comments

Comments
 (0)