Skip to content

Commit cbbdef0

Browse files
authored
feat: Knowledge base workflow release, version management function (#4405)
* feat: Knowledge base workflow release, version management function * feat: Knowledge base workflow release, version management function
1 parent e3c36b3 commit cbbdef0

File tree

16 files changed

+716
-133
lines changed

16 files changed

+716
-133
lines changed
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
# coding=utf-8
2+
"""
3+
@project: MaxKB
4+
@Author:虎虎
5+
@file: application_version.py
6+
@date:2025/6/4 17:33
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 common.result import ResultSerializer, ResultPageSerializer
14+
from knowledge.serializers.knowledge_version import KnowledgeVersionModelSerializer
15+
16+
17+
class KnowledgeListVersionResult(ResultSerializer):
18+
def get_data(self):
19+
return KnowledgeVersionModelSerializer(many=True)
20+
21+
22+
class KnowledgePageVersionResult(ResultPageSerializer):
23+
def get_data(self):
24+
return KnowledgeVersionModelSerializer(many=True)
25+
26+
27+
class KnowledgeWorkflowVersionResult(ResultSerializer):
28+
def get_data(self):
29+
return KnowledgeVersionModelSerializer()
30+
31+
32+
class KnowledgeVersionAPI(APIMixin):
33+
@staticmethod
34+
def get_parameters():
35+
return [
36+
OpenApiParameter(
37+
name="workspace_id",
38+
description="工作空间id",
39+
type=OpenApiTypes.STR,
40+
location='path',
41+
required=True,
42+
),
43+
OpenApiParameter(
44+
name="knowledge_id",
45+
description="knowledge ID",
46+
type=OpenApiTypes.STR,
47+
location='path',
48+
required=True,
49+
)
50+
]
51+
52+
53+
class KnowledgeVersionOperateAPI(APIMixin):
54+
@staticmethod
55+
def get_parameters():
56+
return [
57+
OpenApiParameter(
58+
name="knowledge_version_id",
59+
description="工作流版本id",
60+
type=OpenApiTypes.STR,
61+
location='path',
62+
required=True,
63+
)
64+
, *KnowledgeVersionAPI.get_parameters()
65+
]
66+
67+
@staticmethod
68+
def get_response():
69+
return KnowledgeWorkflowVersionResult
70+
71+
72+
class KnowledgeVersionListAPI(APIMixin):
73+
@staticmethod
74+
def get_parameters():
75+
return [
76+
OpenApiParameter(
77+
name="name",
78+
description="Version Name",
79+
type=OpenApiTypes.STR,
80+
required=False,
81+
)
82+
, *KnowledgeVersionOperateAPI.get_parameters()]
83+
84+
@staticmethod
85+
def get_response():
86+
return KnowledgeListVersionResult
87+
88+
89+
class KnowledgeVersionPageAPI(APIMixin):
90+
@staticmethod
91+
def get_parameters():
92+
return KnowledgeVersionListAPI.get_parameters()
93+
94+
@staticmethod
95+
def get_response():
96+
return KnowledgePageVersionResult

apps/knowledge/api/knowledge_workflow.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
# coding=utf-8
2+
from drf_spectacular.types import OpenApiTypes
3+
from drf_spectacular.utils import OpenApiParameter
24

35
from common.mixins.api_mixin import APIMixin
6+
from knowledge.serializers.knowledge_workflow import KnowledgeWorkflowActionRequestSerializer
47

58

69
class KnowledgeWorkflowApi(APIMixin):
@@ -9,3 +12,55 @@ class KnowledgeWorkflowApi(APIMixin):
912

1013
class KnowledgeWorkflowVersionApi(APIMixin):
1114
pass
15+
16+
17+
class KnowledgeWorkflowActionApi(APIMixin):
18+
@staticmethod
19+
def get_request():
20+
return KnowledgeWorkflowActionRequestSerializer
21+
22+
@staticmethod
23+
def get_parameters():
24+
return [
25+
OpenApiParameter(
26+
name="workspace_id",
27+
description="工作空间id",
28+
type=OpenApiTypes.STR,
29+
location='path',
30+
required=True,
31+
),
32+
OpenApiParameter(
33+
name="knowledge_id",
34+
description="知识库id",
35+
type=OpenApiTypes.STR,
36+
location='path',
37+
required=True,
38+
)
39+
]
40+
41+
class Operate(APIMixin):
42+
@staticmethod
43+
def get_parameters():
44+
return [
45+
OpenApiParameter(
46+
name="workspace_id",
47+
description="工作空间id",
48+
type=OpenApiTypes.STR,
49+
location='path',
50+
required=True,
51+
),
52+
OpenApiParameter(
53+
name="knowledge_id",
54+
description="知识库id",
55+
type=OpenApiTypes.STR,
56+
location='path',
57+
required=True,
58+
),
59+
OpenApiParameter(
60+
name="knowledge_action_id",
61+
description="知识库执行id",
62+
type=OpenApiTypes.STR,
63+
location='path',
64+
required=True,
65+
)
66+
]
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Generated by Django 5.2.8 on 2025-12-01 06:28
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('knowledge', '0006_paragraph_chunks'),
10+
]
11+
12+
operations = [
13+
migrations.RemoveField(
14+
model_name='knowledgeworkflowversion',
15+
name='workflow',
16+
),
17+
migrations.AddField(
18+
model_name='knowledgeworkflowversion',
19+
name='name',
20+
field=models.CharField(default='', max_length=128, verbose_name='版本名称'),
21+
),
22+
]

apps/knowledge/models/knowledge.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,9 +159,8 @@ class KnowledgeWorkflowVersion(AppModelMixin):
159159
"""
160160
id = models.UUIDField(primary_key=True, max_length=128, default=uuid.uuid7, editable=False, verbose_name="主键id")
161161
knowledge = models.ForeignKey(Knowledge, on_delete=models.CASCADE, verbose_name="知识库", db_constraint=False)
162-
workflow = models.ForeignKey(KnowledgeWorkflow, on_delete=models.CASCADE, verbose_name="工作流",
163-
db_constraint=False, related_name='versions')
164162
workspace_id = models.CharField(max_length=64, verbose_name="工作空间id", default="default", db_index=True)
163+
name = models.CharField(verbose_name="版本名称", max_length=128, default="")
165164
work_flow = models.JSONField(verbose_name="工作流数据", default=dict)
166165
publish_user_id = models.UUIDField(verbose_name="发布者id", max_length=128, default=None, null=True)
167166
publish_user_name = models.CharField(verbose_name="发布者名称", max_length=128, default="")
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
# coding=utf-8
2+
"""
3+
@project: MaxKB
4+
@Author:虎虎
5+
@file: KnowledgeVersionSerializer.py
6+
@date:2025/11/28 18:00
7+
@desc:
8+
"""
9+
from typing import Dict
10+
11+
from django.db.models import QuerySet
12+
from rest_framework import serializers
13+
14+
from django.utils.translation import gettext_lazy as _
15+
16+
from common.db.search import page_search
17+
from common.exception.app_exception import AppApiException
18+
from knowledge.models import KnowledgeWorkflowVersion, Knowledge
19+
20+
21+
class KnowledgeWorkflowVersionEditSerializer(serializers.Serializer):
22+
name = serializers.CharField(required=False, max_length=128, allow_null=True, allow_blank=True,
23+
label=_("Version Name"))
24+
25+
26+
class KnowledgeVersionModelSerializer(serializers.ModelSerializer):
27+
class Meta:
28+
model = KnowledgeWorkflowVersion
29+
fields = ['id', 'name', 'workspace_id', 'knowledge_id', 'work_flow', 'publish_user_id', 'publish_user_name',
30+
'create_time',
31+
'update_time']
32+
33+
34+
class KnowledgeWorkflowVersionQuerySerializer(serializers.Serializer):
35+
knowledge_id = serializers.UUIDField(required=True, label=_("Knowledge ID"))
36+
name = serializers.CharField(required=False, allow_null=True, allow_blank=True,
37+
label=_("summary"))
38+
39+
40+
class KnowledgeWorkflowVersionSerializer(serializers.Serializer):
41+
workspace_id = serializers.CharField(required=False, label=_("Workspace ID"))
42+
43+
class Query(serializers.Serializer):
44+
workspace_id = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_("Workspace ID"))
45+
46+
def get_query_set(self, query):
47+
query_set = QuerySet(KnowledgeWorkflowVersion).filter(knowledge_id=query.get('knowledge_id'))
48+
if 'name' in query and query.get('name') is not None:
49+
query_set = query_set.filter(name__contains=query.get('name'))
50+
if 'workspace_id' in self.data and self.data.get('workspace_id') is not None:
51+
query_set = query_set.filter(workspace_id=self.data.get('workspace_id'))
52+
return query_set.order_by("-create_time")
53+
54+
def list(self, query, with_valid=True):
55+
if with_valid:
56+
self.is_valid(raise_exception=True)
57+
KnowledgeWorkflowVersionQuerySerializer(data=query).is_valid(raise_exception=True)
58+
query_set = self.get_query_set(query)
59+
return [KnowledgeVersionModelSerializer(v).data for v in query_set]
60+
61+
def page(self, query, current_page, page_size, with_valid=True):
62+
if with_valid:
63+
self.is_valid(raise_exception=True)
64+
return page_search(current_page, page_size,
65+
self.get_query_set(query),
66+
post_records_handler=lambda v: KnowledgeVersionModelSerializer(v).data)
67+
68+
class Operate(serializers.Serializer):
69+
workspace_id = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_("Workspace ID"))
70+
knowledge_id = serializers.UUIDField(required=True, label=_("Knowledge ID"))
71+
knowledge_version_id = serializers.UUIDField(required=True,
72+
label=_("Knowledge version ID"))
73+
74+
def is_valid(self, *, raise_exception=False):
75+
super().is_valid(raise_exception=True)
76+
workspace_id = self.data.get('workspace_id')
77+
query_set = QuerySet(Knowledge).filter(id=self.data.get('knowledge_id'))
78+
if workspace_id:
79+
query_set = query_set.filter(workspace_id=workspace_id)
80+
if not query_set.exists():
81+
raise AppApiException(500, _('Knowledge id does not exist'))
82+
83+
def one(self, with_valid=True):
84+
if with_valid:
85+
self.is_valid(raise_exception=True)
86+
knowledge_version = QuerySet(KnowledgeWorkflowVersion).filter(knowledge_id=self.data.get('knowledge_id'),
87+
id=self.data.get(
88+
'knowledge_version_id')).first()
89+
if knowledge_version is not None:
90+
return KnowledgeVersionModelSerializer(knowledge_version).data
91+
else:
92+
raise AppApiException(500, _('Workflow version does not exist'))
93+
94+
def edit(self, instance: Dict, with_valid=True):
95+
if with_valid:
96+
self.is_valid(raise_exception=True)
97+
KnowledgeWorkflowVersionEditSerializer(data=instance).is_valid(raise_exception=True)
98+
knowledge_version = QuerySet(KnowledgeWorkflowVersion).filter(knowledge_id=self.data.get('knowledge_id'),
99+
id=self.data.get(
100+
'knowledge_version_id')).first()
101+
if knowledge_version is not None:
102+
name = instance.get('name', None)
103+
if name is not None and len(name) > 0:
104+
knowledge_version.name = name
105+
knowledge_version.save()
106+
return KnowledgeVersionModelSerializer(knowledge_version).data
107+
else:
108+
raise AppApiException(500, _('Workflow version does not exist'))

0 commit comments

Comments
 (0)