diff --git a/apps/chat/api/chat_api.py b/apps/chat/api/chat_api.py index f63374c82..974846045 100644 --- a/apps/chat/api/chat_api.py +++ b/apps/chat/api/chat_api.py @@ -11,9 +11,9 @@ from drf_spectacular.utils import OpenApiParameter from application.serializers.application_chat_record import ChatRecordSerializerModel from chat.serializers.chat import ChatMessageSerializers -from chat.serializers.chat_record import HistoryChatModel +from chat.serializers.chat_record import HistoryChatModel, EditAbstractSerializer from common.mixins.api_mixin import APIMixin -from common.result import ResultSerializer, ResultPageSerializer +from common.result import ResultSerializer, ResultPageSerializer, DefaultResultSerializer class ChatAPI(APIMixin): @@ -72,6 +72,26 @@ class PageHistoricalConversationAPI(APIMixin): return PageApplicationCreateResponse +class HistoricalConversationOperateAPI(APIMixin): + @staticmethod + def get_parameters(): + return [OpenApiParameter( + name="chat_id", + description="对话id", + type=OpenApiTypes.STR, + location='path', + required=True + )] + + @staticmethod + def get_request(): + return EditAbstractSerializer + + @staticmethod + def get_response(): + return DefaultResultSerializer + + class HistoricalConversationRecordAPI(APIMixin): @staticmethod def get_parameters(): diff --git a/apps/chat/serializers/chat_record.py b/apps/chat/serializers/chat_record.py index 846938ea0..02570a9ad 100644 --- a/apps/chat/serializers/chat_record.py +++ b/apps/chat/serializers/chat_record.py @@ -96,6 +96,39 @@ class HistoricalConversationSerializer(serializers.Serializer): return page_search(current_page, page_size, self.get_queryset(), lambda r: HistoryChatModel(r).data) +class EditAbstractSerializer(serializers.Serializer): + abstract = serializers.CharField(required=True, label=_('Abstract')) + + +class HistoricalConversationOperateSerializer(serializers.Serializer): + application_id = serializers.UUIDField(required=True, label=_('Application ID')) + chat_user_id = serializers.UUIDField(required=True, label=_('Chat User ID')) + chat_id = serializers.UUIDField(required=True, label=_('Chat ID')) + + def is_valid(self, *, raise_exception=False): + super().is_valid(raise_exception=True) + e = QuerySet(Chat).filter(id=self.data.get('chat_id'), application_id=self.data.get('application_id'), + chat_user_id=self.data.get('chat_user_id')).exists() + if not e: + raise AppApiException(500, _('Chat is not exist')) + + def edit_abstract(self, instance, with_valid=True): + if with_valid: + self.is_valid(raise_exception=True) + EditAbstractSerializer(data=instance).is_valid(raise_exception=True) + + QuerySet(Chat).filter(id=self.data.get('chat_id'), application_id=self.data.get('application_id'), + chat_user_id=self.data.get('chat_user_id')).update(abstract=instance.get('abstract')) + return True + + def logic_delete(self, with_valid=True): + if with_valid: + self.is_valid(raise_exception=True) + QuerySet(Chat).filter(id=self.data.get('chat_id'), application_id=self.data.get('application_id'), + chat_user_id=self.data.get('chat_user_id')).update(is_deleted=True) + return True + + class HistoricalConversationRecordSerializer(serializers.Serializer): application_id = serializers.UUIDField(required=True, label=_('Application ID')) chat_id = serializers.UUIDField(required=True, label=_('Chat ID')) diff --git a/apps/chat/urls.py b/apps/chat/urls.py index 6271f3609..bb7f87e2b 100644 --- a/apps/chat/urls.py +++ b/apps/chat/urls.py @@ -18,6 +18,7 @@ urlpatterns = [ path('historical_conversation', views.HistoricalConversationView.as_view(), name='historical_conversation'), path('historical_conversation//record/',views.ChatRecordView.as_view(),name='conversation_details'), path('historical_conversation//', views.HistoricalConversationView.PageView.as_view(), name='historical_conversation'), + path('historical_conversation/',views.HistoricalConversationView.Operate.as_view(), name='historical_conversation_operate'), path('historical_conversation_record/', views.HistoricalConversationRecordView.as_view(), name='historical_conversation_record'), path('historical_conversation_record///', views.HistoricalConversationRecordView.PageView.as_view(), name='historical_conversation_record') ] diff --git a/apps/chat/views/chat_record.py b/apps/chat/views/chat_record.py index 06a71077f..754d56e9b 100644 --- a/apps/chat/views/chat_record.py +++ b/apps/chat/views/chat_record.py @@ -13,10 +13,10 @@ from rest_framework.views import APIView from application.serializers.application_chat_record import ChatRecordOperateSerializer from chat.api.chat_api import HistoricalConversationAPI, PageHistoricalConversationAPI, \ - PageHistoricalConversationRecordAPI, HistoricalConversationRecordAPI + PageHistoricalConversationRecordAPI, HistoricalConversationRecordAPI, HistoricalConversationOperateAPI from chat.api.vote_api import VoteAPI from chat.serializers.chat_record import VoteSerializer, HistoricalConversationSerializer, \ - HistoricalConversationRecordSerializer + HistoricalConversationRecordSerializer, HistoricalConversationOperateSerializer from common import result from common.auth import TokenAuth @@ -60,6 +60,45 @@ class HistoricalConversationView(APIView): 'chat_user_id': request.auth.chat_user_id, }).list()) + class Operate(APIView): + authentication_classes = [TokenAuth] + + @extend_schema( + methods=['PUT'], + description=_("Modify conversation about"), + summary=_("Modify conversation about"), + operation_id=_("Modify conversation about"), # type: ignore + parameters=HistoricalConversationOperateAPI.get_parameters(), + request=HistoricalConversationOperateAPI.get_request(), + responses=HistoricalConversationOperateAPI.get_response(), + tags=[_('Chat')] # type: ignore + ) + def put(self, request: Request, chat_id: str): + return result.success(HistoricalConversationOperateSerializer( + data={ + 'application_id': request.auth.application_id, + 'chat_user_id': request.auth.chat_user_id, + 'chat_id': chat_id, + }).edit_abstract(request.data) + ) + + @extend_schema( + methods=['DELETE'], + description=_("Delete history conversation"), + summary=_("Delete history conversation"), + operation_id=_("Delete history conversation"), # type: ignore + parameters=HistoricalConversationOperateAPI.get_parameters(), + responses=HistoricalConversationOperateAPI.get_response(), + tags=[_('Chat')] # type: ignore + ) + def delete(self, request: Request, chat_id: str): + return result.success(HistoricalConversationOperateSerializer( + data={ + 'application_id': request.auth.application_id, + 'chat_user_id': request.auth.chat_user_id, + 'chat_id': chat_id, + }).logic_delete()) + class PageView(APIView): authentication_classes = [TokenAuth] diff --git a/apps/tools/views/tool.py b/apps/tools/views/tool.py index 6da6b006f..7f3aa4215 100644 --- a/apps/tools/views/tool.py +++ b/apps/tools/views/tool.py @@ -104,7 +104,7 @@ class ToolView(APIView): tags=[_('Tool')] # type: ignore ) @has_permissions( - PermissionConstants.TOOL_EDIT.get_workspace_permission(), + PermissionConstants.TOOL_EDIT.get_workspace_permission(),PermissionConstants.TOOL_EDIT.get_workspace_permission_workspace_manage_role(), RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), ViewPermission([RoleConstants.USER.get_workspace_role()], [PermissionConstants.TOOL.get_workspace_tool_permission()], CompareConstants.AND), diff --git a/ui/src/api/chat/chat.ts b/ui/src/api/chat/chat.ts index 977669450..6dc0d04b1 100644 --- a/ui/src/api/chat/chat.ts +++ b/ui/src/api/chat/chat.ts @@ -264,6 +264,31 @@ const speechToText: (data: any, loading?: Ref) => Promise> ) => { return post(`speech_to_text`, data, undefined, loading) } +/** + * + * @param chat_id 对话ID + * @param loading + * @returns + */ +const deleteChat: (chat_id:string, loading?: Ref) => Promise> = ( + chat_id, + loading, +) => { + return del(`historical_conversation/${chat_id}`, loading) +} +/** + * + * @param chat_id 对话id + * @param data 对话简介 + * @param loading + * @returns + */ +const modifyChat: (chat_id:string, data:any, loading?: Ref ) => Promise> = ( + chat_id,data,loading +) => { + return put(`historical_conversation/${chat_id}`, data, undefined, loading) +} + export default { open, chat, @@ -290,4 +315,6 @@ export default { getChatRecord, textToSpeech, speechToText, + deleteChat, + modifyChat } diff --git a/ui/src/views/chat/pc/EditTitleDialog.vue b/ui/src/views/chat/pc/EditTitleDialog.vue index 0954e7cf6..e7d6f3b1c 100644 --- a/ui/src/views/chat/pc/EditTitleDialog.vue +++ b/ui/src/views/chat/pc/EditTitleDialog.vue @@ -1,36 +1,16 @@