Skip to content

Commit 1ef0146

Browse files
committed
feat: Application conversation
1 parent e61e4eb commit 1ef0146

File tree

8 files changed

+144
-45
lines changed

8 files changed

+144
-45
lines changed

apps/chat/api/chat_api.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111

1212
from application.serializers.application_chat_record import ChatRecordSerializerModel
1313
from chat.serializers.chat import ChatMessageSerializers
14-
from chat.serializers.chat_record import HistoryChatModel
14+
from chat.serializers.chat_record import HistoryChatModel, EditAbstractSerializer
1515
from common.mixins.api_mixin import APIMixin
16-
from common.result import ResultSerializer, ResultPageSerializer
16+
from common.result import ResultSerializer, ResultPageSerializer, DefaultResultSerializer
1717

1818

1919
class ChatAPI(APIMixin):
@@ -72,6 +72,26 @@ def get_response():
7272
return PageApplicationCreateResponse
7373

7474

75+
class HistoricalConversationOperateAPI(APIMixin):
76+
@staticmethod
77+
def get_parameters():
78+
return [OpenApiParameter(
79+
name="chat_id",
80+
description="对话id",
81+
type=OpenApiTypes.STR,
82+
location='path',
83+
required=True
84+
)]
85+
86+
@staticmethod
87+
def get_request():
88+
return EditAbstractSerializer
89+
90+
@staticmethod
91+
def get_response():
92+
return DefaultResultSerializer
93+
94+
7595
class HistoricalConversationRecordAPI(APIMixin):
7696
@staticmethod
7797
def get_parameters():

apps/chat/serializers/chat_record.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,39 @@ def page(self, current_page, page_size):
9696
return page_search(current_page, page_size, self.get_queryset(), lambda r: HistoryChatModel(r).data)
9797

9898

99+
class EditAbstractSerializer(serializers.Serializer):
100+
abstract = serializers.CharField(required=True, label=_('Abstract'))
101+
102+
103+
class HistoricalConversationOperateSerializer(serializers.Serializer):
104+
application_id = serializers.UUIDField(required=True, label=_('Application ID'))
105+
chat_user_id = serializers.UUIDField(required=True, label=_('Chat User ID'))
106+
chat_id = serializers.UUIDField(required=True, label=_('Chat ID'))
107+
108+
def is_valid(self, *, raise_exception=False):
109+
super().is_valid(raise_exception=True)
110+
e = QuerySet(Chat).filter(id=self.data.get('chat_id'), application_id=self.data.get('application_id'),
111+
chat_user_id=self.data.get('chat_user_id')).exists()
112+
if not e:
113+
raise AppApiException(500, _('Chat is not exist'))
114+
115+
def edit_abstract(self, instance, with_valid=True):
116+
if with_valid:
117+
self.is_valid(raise_exception=True)
118+
EditAbstractSerializer(data=instance).is_valid(raise_exception=True)
119+
120+
QuerySet(Chat).filter(id=self.data.get('chat_id'), application_id=self.data.get('application_id'),
121+
chat_user_id=self.data.get('chat_user_id')).update(abstract=instance.get('abstract'))
122+
return True
123+
124+
def logic_delete(self, with_valid=True):
125+
if with_valid:
126+
self.is_valid(raise_exception=True)
127+
QuerySet(Chat).filter(id=self.data.get('chat_id'), application_id=self.data.get('application_id'),
128+
chat_user_id=self.data.get('chat_user_id')).update(is_deleted=True)
129+
return True
130+
131+
99132
class HistoricalConversationRecordSerializer(serializers.Serializer):
100133
application_id = serializers.UUIDField(required=True, label=_('Application ID'))
101134
chat_id = serializers.UUIDField(required=True, label=_('Chat ID'))

apps/chat/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
path('historical_conversation', views.HistoricalConversationView.as_view(), name='historical_conversation'),
1919
path('historical_conversation/<str:chat_id>/record/<str:chat_record_id>',views.ChatRecordView.as_view(),name='conversation_details'),
2020
path('historical_conversation/<int:current_page>/<int:page_size>', views.HistoricalConversationView.PageView.as_view(), name='historical_conversation'),
21+
path('historical_conversation/<str:chat_id>',views.HistoricalConversationView.Operate.as_view(), name='historical_conversation_operate'),
2122
path('historical_conversation_record/<str:chat_id>', views.HistoricalConversationRecordView.as_view(), name='historical_conversation_record'),
2223
path('historical_conversation_record/<str:chat_id>/<int:current_page>/<int:page_size>', views.HistoricalConversationRecordView.PageView.as_view(), name='historical_conversation_record')
2324
]

apps/chat/views/chat_record.py

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@
1313

1414
from application.serializers.application_chat_record import ChatRecordOperateSerializer
1515
from chat.api.chat_api import HistoricalConversationAPI, PageHistoricalConversationAPI, \
16-
PageHistoricalConversationRecordAPI, HistoricalConversationRecordAPI
16+
PageHistoricalConversationRecordAPI, HistoricalConversationRecordAPI, HistoricalConversationOperateAPI
1717
from chat.api.vote_api import VoteAPI
1818
from chat.serializers.chat_record import VoteSerializer, HistoricalConversationSerializer, \
19-
HistoricalConversationRecordSerializer
19+
HistoricalConversationRecordSerializer, HistoricalConversationOperateSerializer
2020
from common import result
2121
from common.auth import TokenAuth
2222

@@ -60,6 +60,45 @@ def get(self, request: Request):
6060
'chat_user_id': request.auth.chat_user_id,
6161
}).list())
6262

63+
class Operate(APIView):
64+
authentication_classes = [TokenAuth]
65+
66+
@extend_schema(
67+
methods=['PUT'],
68+
description=_("Modify conversation about"),
69+
summary=_("Modify conversation about"),
70+
operation_id=_("Modify conversation about"), # type: ignore
71+
parameters=HistoricalConversationOperateAPI.get_parameters(),
72+
request=HistoricalConversationOperateAPI.get_request(),
73+
responses=HistoricalConversationOperateAPI.get_response(),
74+
tags=[_('Chat')] # type: ignore
75+
)
76+
def put(self, request: Request, chat_id: str):
77+
return result.success(HistoricalConversationOperateSerializer(
78+
data={
79+
'application_id': request.auth.application_id,
80+
'chat_user_id': request.auth.chat_user_id,
81+
'chat_id': chat_id,
82+
}).edit_abstract(request.data)
83+
)
84+
85+
@extend_schema(
86+
methods=['DELETE'],
87+
description=_("Delete history conversation"),
88+
summary=_("Delete history conversation"),
89+
operation_id=_("Delete history conversation"), # type: ignore
90+
parameters=HistoricalConversationOperateAPI.get_parameters(),
91+
responses=HistoricalConversationOperateAPI.get_response(),
92+
tags=[_('Chat')] # type: ignore
93+
)
94+
def delete(self, request: Request, chat_id: str):
95+
return result.success(HistoricalConversationOperateSerializer(
96+
data={
97+
'application_id': request.auth.application_id,
98+
'chat_user_id': request.auth.chat_user_id,
99+
'chat_id': chat_id,
100+
}).logic_delete())
101+
63102
class PageView(APIView):
64103
authentication_classes = [TokenAuth]
65104

apps/tools/views/tool.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ class Operate(APIView):
104104
tags=[_('Tool')] # type: ignore
105105
)
106106
@has_permissions(
107-
PermissionConstants.TOOL_EDIT.get_workspace_permission(),
107+
PermissionConstants.TOOL_EDIT.get_workspace_permission(),PermissionConstants.TOOL_EDIT.get_workspace_permission_workspace_manage_role(),
108108
RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), ViewPermission([RoleConstants.USER.get_workspace_role()],
109109
[PermissionConstants.TOOL.get_workspace_tool_permission()],
110110
CompareConstants.AND),

ui/src/api/chat/chat.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,31 @@ const speechToText: (data: any, loading?: Ref<boolean>) => Promise<Result<any>>
264264
) => {
265265
return post(`speech_to_text`, data, undefined, loading)
266266
}
267+
/**
268+
*
269+
* @param chat_id 对话ID
270+
* @param loading
271+
* @returns
272+
*/
273+
const deleteChat: (chat_id:string, loading?: Ref<boolean>) => Promise<Result<any>> = (
274+
chat_id,
275+
loading,
276+
) => {
277+
return del(`historical_conversation/${chat_id}`, loading)
278+
}
279+
/**
280+
*
281+
* @param chat_id 对话id
282+
* @param data 对话简介
283+
* @param loading
284+
* @returns
285+
*/
286+
const modifyChat: (chat_id:string, data:any, loading?: Ref<boolean> ) => Promise<Result<any>> = (
287+
chat_id,data,loading
288+
) => {
289+
return put(`historical_conversation/${chat_id}`, data, undefined, loading)
290+
}
291+
267292
export default {
268293
open,
269294
chat,
@@ -290,4 +315,6 @@ export default {
290315
getChatRecord,
291316
textToSpeech,
292317
speechToText,
318+
deleteChat,
319+
modifyChat
293320
}

ui/src/views/chat/pc/EditTitleDialog.vue

Lines changed: 16 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,16 @@
11
<template>
2-
<el-dialog
3-
class="responsive-dialog"
4-
:title="$t('chat.editTitle')"
5-
v-model="dialogVisible"
6-
:close-on-click-modal="false"
7-
:close-on-press-escape="false"
8-
:destroy-on-close="true"
9-
append-to-body
10-
>
11-
<el-form
12-
label-position="top"
13-
ref="fieldFormRef"
14-
:model="form"
15-
require-asterisk-position="right"
16-
>
17-
<el-form-item
18-
prop="abstract"
19-
:rules="[
20-
{
21-
required: true,
22-
message: $t('common.inputPlaceholder'),
23-
trigger: 'blur'
24-
}
25-
]"
26-
>
27-
<el-input
28-
v-model="form.abstract"
29-
maxlength="1024"
30-
show-word-limit
31-
type="textarea"
32-
@blur="form.abstract = form.abstract.trim()"
33-
/>
2+
<el-dialog class="responsive-dialog" :title="$t('chat.editTitle')" v-model="dialogVisible"
3+
:close-on-click-modal="false" :close-on-press-escape="false" :destroy-on-close="true" append-to-body>
4+
<el-form label-position="top" ref="fieldFormRef" :model="form" require-asterisk-position="right">
5+
<el-form-item prop="abstract" :rules="[
6+
{
7+
required: true,
8+
message: $t('common.inputPlaceholder'),
9+
trigger: 'blur'
10+
}
11+
]">
12+
<el-input v-model="form.abstract" maxlength="1024" show-word-limit type="textarea"
13+
@blur="form.abstract = form.abstract.trim()" />
3414
</el-form-item>
3515
</el-form>
3616
<template #footer>
@@ -44,12 +24,9 @@
4424
</el-dialog>
4525
</template>
4626
<script setup lang="ts">
47-
import { reactive, ref, watch } from 'vue'
27+
import { ref } from 'vue'
4828
import type { FormInstance } from 'element-plus'
49-
import useStore from '@/stores'
50-
import { t } from '@/locales'
51-
52-
const { chatLog } = useStore()
29+
import chatAPI from '@/api/chat/chat'
5330
const emit = defineEmits(['refresh'])
5431
5532
const fieldFormRef = ref()
@@ -71,10 +48,11 @@ const open = (row: any, id: string) => {
7148
}
7249
7350
const submit = async (formEl: FormInstance | undefined) => {
51+
7452
if (!formEl) return
7553
await formEl.validate((valid) => {
7654
if (valid) {
77-
chatLog.asyncPutChatClientLog(applicationId.value, chatId.value, form.value, loading).then(() => {
55+
chatAPI.modifyChat(chatId.value, form.value, loading).then(() => {
7856
emit('refresh', chatId.value, form.value.abstract)
7957
dialogVisible.value = false
8058
})

ui/src/views/chat/pc/index.vue

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ import { cloneDeep } from 'lodash'
331331
332332
useResize()
333333
334-
const { user, chatLog, common, chatUser } = useStore()
334+
const { common, chatUser } = useStore()
335335
const router = useRouter()
336336
337337
const EditTitleDialogRef = ref()
@@ -425,7 +425,7 @@ function refreshFieldTitle(chatId: string, abstract: string) {
425425
}
426426
}
427427
function deleteLog(row: any) {
428-
chatLog.asyncDelChatClientLog(applicationDetail.value.id, row.id, left_loading).then(() => {
428+
chatAPI.deleteChat(row.id, left_loading).then(() => {
429429
if (currentChatId.value === row.id) {
430430
currentChatId.value = 'new'
431431
currentChatName.value = t('chat.createChat')
@@ -435,6 +435,7 @@ function deleteLog(row: any) {
435435
}
436436
getChatLog(applicationDetail.value.id)
437437
})
438+
438439
}
439440
440441
function handleScroll(event: any) {

0 commit comments

Comments
 (0)