Skip to content

Commit 1641039

Browse files
authored
feat: application version (#3194)
1 parent 8b9e03d commit 1641039

File tree

10 files changed

+271
-41
lines changed

10 files changed

+271
-41
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 application.serializers.application_version import ApplicationVersionModelSerializer
13+
from common.mixins.api_mixin import APIMixin
14+
from common.result import ResultSerializer, PageDataResponse, ResultPageSerializer
15+
16+
17+
class ApplicationListVersionResult(ResultSerializer):
18+
def get_data(self):
19+
return ApplicationVersionModelSerializer(many=True)
20+
21+
22+
class ApplicationPageVersionResult(ResultPageSerializer):
23+
def get_data(self):
24+
return ApplicationVersionModelSerializer(many=True)
25+
26+
27+
class ApplicationWorkflowVersionResult(ResultSerializer):
28+
def get_data(self):
29+
return ApplicationVersionModelSerializer()
30+
31+
32+
class ApplicationVersionAPI(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="application_id",
45+
description="application ID",
46+
type=OpenApiTypes.STR,
47+
location='path',
48+
required=True,
49+
)
50+
]
51+
52+
53+
class ApplicationVersionOperateAPI(APIMixin):
54+
@staticmethod
55+
def get_parameters():
56+
return [
57+
OpenApiParameter(
58+
name="work_flow_version_id",
59+
description="工作流版本id",
60+
type=OpenApiTypes.STR,
61+
location='path',
62+
required=True,
63+
)
64+
, *ApplicationVersionAPI.get_parameters()
65+
]
66+
67+
@staticmethod
68+
def get_response():
69+
return ApplicationWorkflowVersionResult
70+
71+
72+
class ApplicationVersionListAPI(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+
, *ApplicationVersionAPI.get_parameters()]
83+
84+
@staticmethod
85+
def get_response():
86+
return ApplicationListVersionResult
87+
88+
89+
class ApplicationVersionPageAPI(APIMixin):
90+
@staticmethod
91+
def get_parameters():
92+
return ApplicationVersionListAPI.get_parameters()
93+
94+
@staticmethod
95+
def get_response():
96+
return ApplicationPageVersionResult
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
# Generated by Django 5.2 on 2025-06-04 11:57
2+
3+
import application.models.application_chat
4+
import common.encoder.encoder
5+
import django.contrib.postgres.fields
6+
import django.db.models.deletion
7+
import uuid
8+
import uuid_utils.compat
9+
from django.db import migrations, models
10+
11+
12+
class Migration(migrations.Migration):
13+
14+
dependencies = [
15+
('application', '0001_initial'),
16+
]
17+
18+
operations = [
19+
migrations.CreateModel(
20+
name='Chat',
21+
fields=[
22+
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
23+
('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')),
24+
('id', models.UUIDField(default=uuid.UUID('01973acd-fe4c-7fd1-94a8-f7cd668de562'), editable=False, primary_key=True, serialize=False, verbose_name='主键id')),
25+
('abstract', models.CharField(max_length=1024, verbose_name='摘要')),
26+
('asker', models.JSONField(default=application.models.application_chat.default_asker, encoder=common.encoder.encoder.SystemEncoder, verbose_name='访问者')),
27+
('client_id', models.UUIDField(default=None, null=True, verbose_name='客户端id')),
28+
('is_deleted', models.BooleanField(default=False, verbose_name='')),
29+
('application', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='application.application')),
30+
],
31+
options={
32+
'db_table': 'application_chat',
33+
},
34+
),
35+
migrations.CreateModel(
36+
name='ChatRecord',
37+
fields=[
38+
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
39+
('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')),
40+
('id', models.UUIDField(default=uuid_utils.compat.uuid1, editable=False, primary_key=True, serialize=False, verbose_name='主键id')),
41+
('vote_status', models.CharField(choices=[('-1', '未投票'), ('0', '赞同'), ('1', '反对')], default='-1', max_length=10, verbose_name='投票')),
42+
('problem_text', models.CharField(max_length=10240, verbose_name='问题')),
43+
('answer_text', models.CharField(max_length=40960, verbose_name='答案')),
44+
('answer_text_list', django.contrib.postgres.fields.ArrayField(base_field=models.JSONField(), default=list, size=None, verbose_name='改进标注列表')),
45+
('message_tokens', models.IntegerField(default=0, verbose_name='请求token数量')),
46+
('answer_tokens', models.IntegerField(default=0, verbose_name='响应token数量')),
47+
('const', models.IntegerField(default=0, verbose_name='总费用')),
48+
('details', models.JSONField(default=dict, encoder=common.encoder.encoder.SystemEncoder, verbose_name='对话详情')),
49+
('improve_paragraph_id_list', django.contrib.postgres.fields.ArrayField(base_field=models.UUIDField(blank=True), default=list, size=None, verbose_name='改进标注列表')),
50+
('run_time', models.FloatField(default=0, verbose_name='运行时长')),
51+
('index', models.IntegerField(verbose_name='对话下标')),
52+
('chat', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='application.chat')),
53+
],
54+
options={
55+
'db_table': 'application_chat_record',
56+
},
57+
),
58+
migrations.CreateModel(
59+
name='WorkFlowVersion',
60+
fields=[
61+
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
62+
('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')),
63+
('id', models.UUIDField(default=uuid_utils.compat.uuid1, editable=False, primary_key=True, serialize=False, verbose_name='主键id')),
64+
('workspace_id', models.CharField(db_index=True, default='default', max_length=64, verbose_name='工作空间id')),
65+
('name', models.CharField(default='', max_length=128, verbose_name='版本名称')),
66+
('publish_user_id', models.UUIDField(default=None, null=True, verbose_name='发布者id')),
67+
('publish_user_name', models.CharField(default='', max_length=128, verbose_name='发布者名称')),
68+
('work_flow', models.JSONField(default=dict, verbose_name='工作流数据')),
69+
('application', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='application.application')),
70+
],
71+
options={
72+
'db_table': 'application_work_flow_version',
73+
},
74+
),
75+
migrations.CreateModel(
76+
name='ApplicationPublicAccessClient',
77+
fields=[
78+
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
79+
('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')),
80+
('id', models.UUIDField(default=uuid.uuid1, editable=False, primary_key=True, serialize=False, verbose_name='主键id')),
81+
('client_id', models.UUIDField(default=uuid.uuid1, verbose_name='公共访问链接客户端id')),
82+
('client_type', models.CharField(max_length=64, verbose_name='客户端类型')),
83+
('access_num', models.IntegerField(default=0, verbose_name='访问总次数次数')),
84+
('intraday_access_num', models.IntegerField(default=0, verbose_name='当日访问次数')),
85+
('application', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='application.application', verbose_name='应用id')),
86+
],
87+
options={
88+
'db_table': 'application_public_access_client',
89+
'indexes': [models.Index(fields=['application_id', 'client_id'], name='application_applica_8aaf45_idx')],
90+
},
91+
),
92+
]

apps/application/models/application_chat.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ class VoteChoices(models.TextChoices):
4040
TRAMPLE = "1", '反对'
4141

4242

43-
4443
class ChatRecord(AppModelMixin):
4544
"""
4645
对话日志 详情

apps/application/serializers/application_version.py

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
from typing import Dict
1010

1111
from django.db.models import QuerySet
12-
from rest_framework import serializers
1312
from django.utils.translation import gettext_lazy as _
13+
from rest_framework import serializers
1414

1515
from application.models import WorkFlowVersion
1616
from common.db.search import page_search
@@ -26,7 +26,8 @@ class ApplicationVersionQuerySerializer(serializers.Serializer):
2626
class ApplicationVersionModelSerializer(serializers.ModelSerializer):
2727
class Meta:
2828
model = WorkFlowVersion
29-
fields = ['id', 'name', 'application_id', 'work_flow', 'publish_user_id', 'publish_user_name', 'create_time',
29+
fields = ['id', 'name', 'workspace_id', 'application_id', 'work_flow', 'publish_user_id', 'publish_user_name',
30+
'create_time',
3031
'update_time']
3132

3233

@@ -36,26 +37,30 @@ class ApplicationVersionEditSerializer(serializers.Serializer):
3637

3738

3839
class ApplicationVersionSerializer(serializers.Serializer):
40+
workspace_id = serializers.UUIDField(required=False, label=_("Workspace ID"))
41+
3942
class Query(serializers.Serializer):
4043

41-
def get_query_set(self):
42-
query_set = QuerySet(WorkFlowVersion).filter(application_id=self.data.get('application_id'))
43-
if 'name' in self.data and self.data.get('name') is not None:
44-
query_set = query_set.filter(name__contains=self.data.get('name'))
44+
def get_query_set(self, query):
45+
query_set = QuerySet(WorkFlowVersion).filter(application_id=query.get('application_id'))
46+
if 'name' in query and query.get('name') is not None:
47+
query_set = query_set.filter(name__contains=query.get('name'))
48+
if 'workspace_id' in self.data and self.data.get('workspace_id') is not None:
49+
query_set = query_set.filter(workspace_id=self.data.get('workspace_id').get('name'))
4550
return query_set.order_by("-create_time")
4651

47-
def list(self, instance, with_valid=True):
52+
def list(self, query, with_valid=True):
4853
if with_valid:
4954
self.is_valid(raise_exception=True)
50-
ApplicationVersionQuerySerializer(data=instance).is_valid(raise_exception=True)
51-
query_set = self.get_query_set()
55+
ApplicationVersionQuerySerializer(data=query).is_valid(raise_exception=True)
56+
query_set = self.get_query_set(query)
5257
return [ApplicationVersionModelSerializer(v).data for v in query_set]
5358

54-
def page(self, current_page, page_size, with_valid=True):
59+
def page(self, query, current_page, page_size, with_valid=True):
5560
if with_valid:
5661
self.is_valid(raise_exception=True)
5762
return page_search(current_page, page_size,
58-
self.get_query_set(),
63+
self.get_query_set(query),
5964
post_records_handler=lambda v: ApplicationVersionModelSerializer(v).data)
6065

6166
class Operate(serializers.Serializer):

apps/application/urls.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,13 @@
1414
path('workspace/<str:workspace_id>/application/<str:application_id>/application_key',
1515
views.ApplicationKey.as_view()),
1616
path('workspace/<str:workspace_id>/application/<str:application_id>/export', views.Application.Export.as_view()),
17+
18+
path('workspace/<str:workspace_id>/application/<str:application_id>/work_flow_version',
19+
views.ApplicationVersionView.as_view()),
20+
path(
21+
'workspace/<str:workspace_id>/application/<str:application_id>/work_flow_version/<int:current_page>/<int:page_size>',
22+
views.ApplicationVersionView.Page.as_view()),
23+
path(
24+
'workspace/<str:workspace_id>/application/<str:application_id>/work_flow_version/<str:work_flow_version_id>',
25+
views.ApplicationVersionView.Operate.as_view()),
1726
]

apps/application/views/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@
88
"""
99
from .application_api_key import *
1010
from .application import *
11+
from .application_version import *

apps/application/views/application.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ class Export(APIView):
9999
summary=_('Export application'),
100100
operation_id=_('Export application'), # type: ignore
101101
parameters=ApplicationExportAPI.get_parameters(),
102+
request=None,
102103
responses=ApplicationExportAPI.get_response(),
103104
tags=[_('Application')] # type: ignore
104105
)

apps/application/views/application_version.py

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
from rest_framework.request import Request
1212
from rest_framework.views import APIView
1313

14+
from application.api.application_version import ApplicationVersionListAPI, ApplicationVersionPageAPI, \
15+
ApplicationVersionAPI, ApplicationVersionOperateAPI
1416
from application.serializers.application_version import ApplicationVersionSerializer
1517
from common import result
1618
from common.auth import TokenAuth
@@ -22,42 +24,39 @@ class ApplicationVersionView(APIView):
2224
authentication_classes = [TokenAuth]
2325

2426
@extend_schema(
25-
methods=['POST'],
26-
description=_("Get the application list"),
27-
summary=_("Get the application list"),
28-
operation_id=_("Get the application list"), # type: ignore
29-
# parameters=ApplicationCreateAPI.get_parameters(),
30-
# request=ApplicationCreateAPI.get_request(),
31-
# responses=ApplicationCreateAPI.get_response(),
27+
methods=['GET'],
28+
description=_("Get the application version list"),
29+
summary=_("Get the application version list"),
30+
operation_id=_("Get the application version list"), # type: ignore
31+
parameters=ApplicationVersionListAPI.get_parameters(),
32+
responses=ApplicationVersionListAPI.get_response(),
3233
tags=[_('Application/Version')] # type: ignore
3334
)
34-
@has_permissions(PermissionConstants.APPLICATION_READ)
35+
@has_permissions(PermissionConstants.APPLICATION_READ.get_workspace_application_permission())
3536
def get(self, request: Request, workspace_id, application_id: str):
3637
return result.success(
3738
ApplicationVersionSerializer.Query(
38-
data={'name': request.query_params.get('name'), 'user_id': request.user.id,
39-
'application_id': application_id}).list(request.data))
39+
data={'workspace_id': workspace_id}).list(
40+
{'name': request.query_params.get("name"), 'application_id': application_id}))
4041

4142
class Page(APIView):
4243
authentication_classes = [TokenAuth]
4344

4445
@extend_schema(
45-
methods=['GET'
46-
''],
46+
methods=['GET'],
4747
description=_("Get the list of application versions by page"),
4848
summary=_("Get the list of application versions by page"),
4949
operation_id=_("Get the list of application versions by page"), # type: ignore
50-
# parameters=ApplicationCreateAPI.get_parameters(),
51-
# request=ApplicationCreateAPI.get_request(),
52-
# responses=ApplicationCreateAPI.get_response(),
50+
parameters=ApplicationVersionPageAPI.get_parameters(),
51+
responses=ApplicationVersionPageAPI.get_response(),
5352
tags=[_('Application/Version')] # type: ignore
5453
)
55-
@has_permissions(PermissionConstants.APPLICATION_READ)
56-
def get(self, request: Request, application_id: str, current_page: int, page_size: int):
54+
@has_permissions(PermissionConstants.APPLICATION_READ.get_workspace_application_permission())
55+
def get(self, request: Request, workspace_id: str, application_id: str, current_page: int, page_size: int):
5756
return result.success(
5857
ApplicationVersionSerializer.Query(
59-
data={'name': request.query_params.get('name'), 'user_id': request.user,
60-
'application_id': application_id}).page(
58+
data={'workspace_id': workspace_id}).page(
59+
{'name': request.query_params.get("name"), 'application_id': application_id},
6160
current_page, page_size))
6261

6362
class Operate(APIView):
@@ -68,13 +67,12 @@ class Operate(APIView):
6867
description=_("Get application version details"),
6968
summary=_("Get application version details"),
7069
operation_id=_("Get application version details"), # type: ignore
71-
# parameters=ApplicationCreateAPI.get_parameters(),
72-
# request=ApplicationCreateAPI.get_request(),
73-
# responses=ApplicationCreateAPI.get_response(),
70+
parameters=ApplicationVersionOperateAPI.get_parameters(),
71+
responses=ApplicationVersionOperateAPI.get_response(),
7472
tags=[_('Application/Version')] # type: ignore
7573
)
76-
@has_permissions(PermissionConstants.APPLICATION_READ)
77-
def get(self, request: Request, application_id: str, work_flow_version_id: str):
74+
@has_permissions(PermissionConstants.APPLICATION_EDIT.get_workspace_application_permission())
75+
def get(self, request: Request, workspace_id: str, application_id: str, work_flow_version_id: str):
7876
return result.success(
7977
ApplicationVersionSerializer.Operate(
8078
data={'user_id': request.user,
@@ -85,12 +83,12 @@ def get(self, request: Request, application_id: str, work_flow_version_id: str):
8583
description=_("Modify application version information"),
8684
summary=_("Modify application version information"),
8785
operation_id=_("Modify application version information"), # type: ignore
88-
# parameters=ApplicationCreateAPI.get_parameters(),
89-
# request=ApplicationCreateAPI.get_request(),
90-
# responses=ApplicationCreateAPI.get_response(),
86+
parameters=ApplicationVersionOperateAPI.get_parameters(),
87+
request=None,
88+
responses=ApplicationVersionOperateAPI.get_response(),
9189
tags=[_('Application/Version')] # type: ignore
9290
)
93-
def put(self, request: Request, application_id: str, work_flow_version_id: str):
91+
def put(self, request: Request, workspace_id: str, application_id: str, work_flow_version_id: str):
9492
return result.success(
9593
ApplicationVersionSerializer.Operate(
9694
data={'application_id': application_id, 'work_flow_version_id': work_flow_version_id,

apps/common/constants/permission_constants.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -759,7 +759,7 @@ def get_permission_list_by_resource_group(resource_group: ResourcePermissionGrou
759759
"""
760760
根据资源组获取权限
761761
"""
762-
return [PermissionConstants[k] for k in PermissionConstants.__members__ if
762+
return [PermissionConstants[k].value for k in PermissionConstants.__members__ if
763763
PermissionConstants[k].value.resource_permission_group_list.__contains__(resource_group)]
764764

765765

0 commit comments

Comments
 (0)