From 779757eea17b24f4786dc2750ec28d0f0da4eb77 Mon Sep 17 00:00:00 2001 From: wxg0103 <727495428@qq.com> Date: Fri, 6 Nov 2026 16:16:49 +0800 Subject: [PATCH] chore: update community identifiers and enhance serializers for user and tool APIs --- apps/chat/views/v2/chat.py | 13 +- apps/chat/views/v2/chat_record.py | 6 +- apps/chat/views/v3/chat.py | 15 +- apps/common/result/api.py | 10 ++ apps/homepage/views/homepage.py | 51 +++++- apps/models_provider/api/model.py | 2 +- .../local_model_provider.py | 6 +- apps/models_provider/views/provide.py | 35 +++- apps/system_manage/api/chat_user.py | 71 +++++++- .../api/user_resource_permission.py | 29 ++++ .../system_manage/views/resource_chat_user.py | 19 +- .../views/resource_chat_user_group.py | 20 ++- apps/system_manage/views/system_chat_user.py | 21 ++- .../views/user_group_resource_permission.py | 6 +- apps/tools/api/tool.py | 19 ++ apps/tools/api/tool_workflow.py | 104 ++++++++++- apps/tools/views/tool.py | 22 ++- apps/tools/views/tool_workflow_version.py | 163 +++++++++++------- apps/users/api/user.py | 26 ++- apps/users/api/user_group.py | 16 +- apps/users/serializers/user.py | 1 + apps/users/views/system_user_group.py | 3 +- apps/users/views/user.py | 5 +- 23 files changed, 542 insertions(+), 121 deletions(-) diff --git a/apps/chat/views/v2/chat.py b/apps/chat/views/v2/chat.py index 5037ec488d5..c58b7e8b1ee 100644 --- a/apps/chat/views/v2/chat.py +++ b/apps/chat/views/v2/chat.py @@ -46,7 +46,7 @@ from common.constants.cache_version import Cache_Version from common.exception.app_exception import AppAuthenticationFailed, AppApiException from common.log.log import _get_ip_address, log -from common.result import DefaultResultSerializer, result +from common.result import DefaultResultSerializer, ResultStringSerializer, result from common.utils.rsa_util import decrypt from knowledge.models import FileSourceType from maxkb.const import CONFIG @@ -188,7 +188,16 @@ class AuthProfile(APIView): summary=_("Get application authentication information"), operation_id=_("Get application authentication information"), # type: ignore parameters=ChatAuthenticationProfileAPIV2.get_parameters(), - responses=None, + responses={ + 200: OpenApiResponse( + response=DefaultResultSerializer, + description=_("Success"), + ), + 400: OpenApiResponse( + response=ResultStringSerializer, + description=_("access_token is required"), + ), + }, tags=[_("Chat")], # type: ignore ) def get(self, request: Request): diff --git a/apps/chat/views/v2/chat_record.py b/apps/chat/views/v2/chat_record.py index b8a22c20a24..7ed8bd02661 100644 --- a/apps/chat/views/v2/chat_record.py +++ b/apps/chat/views/v2/chat_record.py @@ -29,7 +29,7 @@ ) from common import result from common.auth import ChatTokenAuth -from common.result import DefaultResultSerializer +from common.result import ResultStringSerializer class VoteView(APIView): @@ -69,7 +69,7 @@ class HistoricalConversationView(APIView): responses={ 200: HistoricalConversationAPI.get_response(), 401: OpenApiResponse( - response=DefaultResultSerializer, + response=ResultStringSerializer, description=_("Authentication required"), ), }, @@ -163,7 +163,7 @@ class PageView(APIView): responses={ 200: PageHistoricalConversationAPI.get_response(), 401: OpenApiResponse( - response=DefaultResultSerializer, + response=ResultStringSerializer, description=_("Authentication required"), ), }, diff --git a/apps/chat/views/v3/chat.py b/apps/chat/views/v3/chat.py index 82068a0c3b5..9a7577dd14d 100644 --- a/apps/chat/views/v3/chat.py +++ b/apps/chat/views/v3/chat.py @@ -46,7 +46,7 @@ from common.constants.cache_version import Cache_Version from common.exception.app_exception import AppApiException from common.log.log import _get_ip_address, log, record_log -from common.result import DefaultResultSerializer, result +from common.result import DefaultResultSerializer, ResultStringSerializer, result from common.utils.rsa_util import decrypt from knowledge.models import FileSourceType from maxkb.const import CONFIG @@ -194,7 +194,16 @@ class ChatAuthProfile(APIView): summary=_("Get application authentication information"), operation_id=_("V3 Get application authentication information"), # type: ignore parameters=ChatAuthenticationProfileAPI.get_parameters(), - responses=None, + responses={ + 200: OpenApiResponse( + response=DefaultResultSerializer, + description=_("Success"), + ), + 400: OpenApiResponse( + response=ResultStringSerializer, + description=_("access_token is required"), + ), + }, tags=[_("V3 Chat")], # type: ignore ) def get(self, request: Request): @@ -472,7 +481,7 @@ class ChatUserProfileView(APIView): responses={ 200: UserProfileAPI.get_response(), 401: OpenApiResponse( - response=DefaultResultSerializer, + response=ResultStringSerializer, description=_("Authentication required"), ), }, diff --git a/apps/common/result/api.py b/apps/common/result/api.py index 45241c857f8..52f2b344232 100644 --- a/apps/common/result/api.py +++ b/apps/common/result/api.py @@ -25,6 +25,16 @@ class DefaultResultSerializer(serializers.Serializer): data = serializers.BooleanField(required=False, default=True) +class ResultStringSerializer(serializers.Serializer): + code = serializers.IntegerField(required=True, help_text=_("response code"), label=_("response code")) + message = serializers.CharField( + required=False, default="success", help_text=_("error prompt"), label=_("error prompt") + ) + data = serializers.CharField( + required=False, allow_null=True, help_text=_("response data"), label=_("response data") + ) + + class ResultSerializer(serializers.Serializer): """ 响应结果 diff --git a/apps/homepage/views/homepage.py b/apps/homepage/views/homepage.py index 0a869e0374e..8d8aa7cbdc7 100644 --- a/apps/homepage/views/homepage.py +++ b/apps/homepage/views/homepage.py @@ -7,11 +7,12 @@ @desc: """ -from drf_spectacular.utils import extend_schema +from drf_spectacular.utils import OpenApiResponse, extend_schema from rest_framework.request import Request from rest_framework.views import APIView from common import result +from common.result import ResultStringSerializer from common.auth import TokenAuth from common.auth.authentication import has_permissions from common.auth.constants.permission_constants import PermissionConstants @@ -44,7 +45,13 @@ class ChatRecordAggregation(APIView): summary=_("Chat record aggregation"), operation_id="homepage_chat_count_aggregation", parameters=TokensAggregationAPI.get_parameters(), - responses=TokensAggregationAPI.get_response(), + responses={ + 200: TokensAggregationAPI.get_response(), + 400: OpenApiResponse( + response=ResultStringSerializer, + description=_("Invalid or missing time range parameters"), + ), + }, tags=[_("Home page")], # type: ignore ) @has_permissions( @@ -73,7 +80,13 @@ class TokensAggregation(APIView): summary=_("Tokens data aggregation"), operation_id="homepage_tokens_aggregation", parameters=TokensAggregationAPI.get_parameters(), - responses=TokensAggregationAPI.get_response(), + responses={ + 200: TokensAggregationAPI.get_response(), + 400: OpenApiResponse( + response=ResultStringSerializer, + description=_("Invalid or missing time range parameters"), + ), + }, tags=[_("Home page")], # type: ignore ) @has_permissions( @@ -102,7 +115,13 @@ class ApplicationTokensRankingExport(APIView): summary=_("Top applications by token consumption export"), operation_id="homepage_application_tokens_ranking_export", parameters=RankingBaseExportAPI.get_parameters(), - responses=RankingBaseExportAPI.get_response(), + responses={ + 200: RankingBaseExportAPI.get_response(), + 400: OpenApiResponse( + response=ResultStringSerializer, + description=_("Invalid or missing time range parameters"), + ), + }, tags=[_("Home page")], # type: ignore ) @has_permissions( @@ -160,7 +179,13 @@ class ApplicationQuestionRankingExport(APIView): summary=_("Top applications by question count export"), operation_id="homepage_application_question_ranking_export", parameters=RankingBaseExportAPI.get_parameters(), - responses=RankingBaseExportAPI.get_response(), + responses={ + 200: RankingBaseExportAPI.get_response(), + 400: OpenApiResponse( + response=ResultStringSerializer, + description=_("Invalid or missing time range parameters"), + ), + }, tags=[_("Home page")], # type: ignore ) @has_permissions( @@ -218,7 +243,13 @@ class UserTokensRankingExport(APIView): summary=_("Top users by token consumption export"), operation_id="homepage_user_tokens_ranking_export", parameters=RankingBaseExportAPI.get_parameters(), - responses=RankingBaseExportAPI.get_response(), + responses={ + 200: RankingBaseExportAPI.get_response(), + 400: OpenApiResponse( + response=ResultStringSerializer, + description=_("Invalid or missing time range parameters"), + ), + }, tags=[_("Home page")], # type: ignore ) @has_permissions( @@ -276,7 +307,13 @@ class ApplicationMonitoring(APIView): summary=_("Dialogue-related statistical trends"), operation_id="Dialogue-related statistical trends", # type: ignore parameters=ApplicationMonitoringAPI.get_parameters(), - responses=ApplicationMonitoringAPI.get_response(), + responses={ + 200: ApplicationMonitoringAPI.get_response(), + 400: OpenApiResponse( + response=ResultStringSerializer, + description=_("Invalid or missing time range parameters"), + ), + }, tags=[_("Home page")], # type: ignore ) @has_permissions( diff --git a/apps/models_provider/api/model.py b/apps/models_provider/api/model.py index 5ac87255733..b69984d9f6c 100644 --- a/apps/models_provider/api/model.py +++ b/apps/models_provider/api/model.py @@ -22,7 +22,7 @@ class ModelDetailSerializer(serializers.Serializer): status = serializers.CharField(required=True, label=_("status")) meta = serializers.DictField(required=False, allow_null=True, label=_("model meta")) credential = serializers.DictField(required=False, label=_("certification information")) - workspace_id = serializers.CharField(required=True, label=_("workspace id")) + workspace_id = serializers.CharField(required=False, label=_("workspace id")) nick_name = serializers.CharField(required=False, allow_blank=True, label=_("nick name")) username = serializers.CharField(required=False, allow_blank=True, label=_("username")) diff --git a/apps/models_provider/impl/local_model_provider/local_model_provider.py b/apps/models_provider/impl/local_model_provider/local_model_provider.py index c5461645f57..f67f53dbbd6 100644 --- a/apps/models_provider/impl/local_model_provider/local_model_provider.py +++ b/apps/models_provider/impl/local_model_provider/local_model_provider.py @@ -26,7 +26,11 @@ from models_provider.impl.local_model_provider.model.reranker import LocalReranker embedding_text2vec_base_chinese = ModelInfo( - "shibing624/text2vec-base-chinese", "", ModelTypeConst.EMBEDDING, LocalEmbeddingCredential(), LocalEmbedding + "/opt/maxkb-app/model/embedding/shibing624_text2vec-base-chinese", + "", + ModelTypeConst.EMBEDDING, + LocalEmbeddingCredential(), + LocalEmbedding, ) bge_reranker_v2_m3 = ModelInfo( "BAAI/bge-reranker-v2-m3", "", ModelTypeConst.RERANKER, LocalRerankerCredential(), LocalReranker diff --git a/apps/models_provider/views/provide.py b/apps/models_provider/views/provide.py index 69de1b4016e..0ca996308c3 100644 --- a/apps/models_provider/views/provide.py +++ b/apps/models_provider/views/provide.py @@ -2,9 +2,10 @@ from common import result +from common.result import ResultStringSerializer from common.auth import TokenAuth from django.utils.translation import gettext_lazy as _ -from drf_spectacular.utils import extend_schema +from drf_spectacular.utils import OpenApiResponse, extend_schema from models_provider.api.provide import ProvideApi from models_provider.constants.model_provider_constants import ModelProvideConstants from models_provider.serializers.model_serializer import get_default_model_params_setting @@ -70,7 +71,13 @@ class ModelTypeList(APIView): description=_("Get a list of model types"), operation_id=_("Get a list of model types"), # type: ignore parameters=ProvideApi.ModelTypeList.get_query_params_api(), - responses=ProvideApi.ModelTypeList.get_response(), + responses={ + 200: ProvideApi.ModelTypeList.get_response(), + 400: OpenApiResponse( + response=ResultStringSerializer, + description=_("provider is required"), + ), + }, tags=[_("Model")], # type: ignore ) def get(self, request: Request): @@ -86,7 +93,13 @@ class ModelList(APIView): description=_("Example of obtaining model list"), operation_id=_("Example of obtaining model list"), # type: ignore parameters=ProvideApi.ModelList.get_query_params_api(), - responses=ProvideApi.ModelList.get_response(), + responses={ + 200: ProvideApi.ModelList.get_response(), + 400: OpenApiResponse( + response=ResultStringSerializer, + description=_("provider is required"), + ), + }, tags=[_("Model")], # type: ignore ) @staticmethod @@ -181,7 +194,13 @@ class ModelParamsForm(APIView): description=_("Get model default parameters"), operation_id=_("Get model default parameters"), # type: ignore parameters=ProvideApi.ModelParamsForm.get_query_params_api(), - responses=ProvideApi.ModelParamsForm.get_response(), + responses={ + 200: ProvideApi.ModelParamsForm.get_response(), + 400: OpenApiResponse( + response=ResultStringSerializer, + description=_("provider is required"), + ), + }, tags=[_("Model")], # type: ignore ) def get(self, request: Request): @@ -202,7 +221,13 @@ class ModelForm(APIView): description=_("Get the model creation form"), operation_id=_("Get the model creation form"), # type: ignore parameters=ProvideApi.ModelParamsForm.get_query_params_api(), - responses=ProvideApi.ModelParamsForm.get_response(), + responses={ + 200: ProvideApi.ModelParamsForm.get_response(), + 400: OpenApiResponse( + response=ResultStringSerializer, + description=_("provider is required"), + ), + }, tags=[_("Model")], # type: ignore ) def get(self, request: Request): diff --git a/apps/system_manage/api/chat_user.py b/apps/system_manage/api/chat_user.py index fab9000ace3..ab810992c22 100644 --- a/apps/system_manage/api/chat_user.py +++ b/apps/system_manage/api/chat_user.py @@ -11,7 +11,7 @@ from drf_spectacular.utils import OpenApiParameter from common.mixins.api_mixin import APIMixin -from common.result import ResultSerializer +from common.result import ResultPageSerializer, ResultSerializer from users.serializers.user import CreateUserSerializer from django.utils.translation import gettext_lazy as _ from rest_framework import serializers @@ -101,9 +101,12 @@ class ChatUserListResponse(serializers.Serializer): id = serializers.CharField(required=True, label=_("ID")) username = serializers.CharField(required=True, label=_("Username")) nick_name = serializers.CharField(required=True, label=_("Nickname")) - email = serializers.EmailField(required=False, allow_blank=True, label=_("Email")) - phone = serializers.CharField(required=False, allow_blank=True, label=_("Phone")) + email = serializers.CharField(required=False, allow_blank=True, allow_null=True, label=_("Email")) + phone = serializers.CharField(required=False, allow_blank=True, allow_null=True, label=_("Phone")) is_active = serializers.BooleanField(required=False, default=True, label=_("Is Active")) + create_time = serializers.DateTimeField(required=False, label=_("Create Time")) + update_time = serializers.DateTimeField(required=False, label=_("Update Time")) + source = serializers.CharField(required=False, allow_blank=True, label=_("Source")) class ChatUsersListResponse(ResultSerializer): @@ -111,6 +114,68 @@ def get_data(self): return ChatUserListResponse(many=True) +class ChatUserDetailSerializer(serializers.Serializer): + id = serializers.CharField(required=True, label=_("ID")) + username = serializers.CharField(required=True, label=_("Username")) + nick_name = serializers.CharField(required=True, label=_("Nickname")) + email = serializers.CharField(required=False, allow_blank=True, allow_null=True, label=_("Email")) + phone = serializers.CharField(required=False, allow_blank=True, allow_null=True, label=_("Phone")) + is_active = serializers.BooleanField(required=False, default=True, label=_("Is Active")) + create_time = serializers.DateTimeField(required=False, label=_("Create Time")) + update_time = serializers.DateTimeField(required=False, label=_("Update Time")) + source = serializers.CharField(required=False, allow_blank=True, label=_("Source")) + user_group_ids = serializers.ListField( + required=False, child=serializers.CharField(required=False), label=_("User Group IDs") + ) + + +class ChatUserDetailResponse(ResultSerializer): + def get_data(self): + return ChatUserDetailSerializer() + + +class ChatUserPageUserListSerializer(serializers.Serializer): + id = serializers.CharField(required=True, label=_("ID")) + username = serializers.CharField(required=True, label=_("Username")) + nick_name = serializers.CharField(required=True, label=_("Nickname")) + email = serializers.CharField(required=False, allow_blank=True, allow_null=True, label=_("Email")) + phone = serializers.CharField(required=False, allow_blank=True, allow_null=True, label=_("Phone")) + is_active = serializers.BooleanField(required=False, default=True, label=_("Is Active")) + create_time = serializers.DateTimeField(required=False, label=_("Create Time")) + update_time = serializers.DateTimeField(required=False, label=_("Update Time")) + source = serializers.CharField(required=False, allow_blank=True, label=_("Source")) + user_group_ids = serializers.ListField( + required=False, child=serializers.CharField(required=False), label=_("User Group IDs") + ) + user_group_names = serializers.ListField( + required=False, child=serializers.CharField(required=False), label=_("User Group Names") + ) + token_quota = serializers.DictField(required=False, allow_null=True, label=_("Token Quota")) + + +class ChatUserPageUserListResponse(ResultPageSerializer): + def get_data(self): + return ChatUserPageUserListSerializer(many=True) + + +class ChatUserGroupPageUserListSerializer(serializers.Serializer): + id = serializers.CharField(required=True, label=_("ID")) + username = serializers.CharField(required=True, label=_("Username")) + nick_name = serializers.CharField(required=True, label=_("Nickname")) + email = serializers.CharField(required=False, allow_blank=True, allow_null=True, label=_("Email")) + phone = serializers.CharField(required=False, allow_blank=True, allow_null=True, label=_("Phone")) + is_active = serializers.BooleanField(required=False, default=True, label=_("Is Active")) + create_time = serializers.DateTimeField(required=False, label=_("Create Time")) + update_time = serializers.DateTimeField(required=False, label=_("Update Time")) + source = serializers.CharField(required=False, allow_blank=True, label=_("Source")) + user_group_relation_id = serializers.CharField(required=False, label=_("User Group Relation ID")) + + +class ChatUserGroupPageUserListResponse(ResultPageSerializer): + def get_data(self): + return ChatUserGroupPageUserListSerializer(many=True) + + class ChatUserPageApi(APIMixin): @staticmethod def get_parameters(): diff --git a/apps/system_manage/api/user_resource_permission.py b/apps/system_manage/api/user_resource_permission.py index 7f8e4b8c542..6d8ad9e283c 100644 --- a/apps/system_manage/api/user_resource_permission.py +++ b/apps/system_manage/api/user_resource_permission.py @@ -282,3 +282,32 @@ def get_request(): @staticmethod def get_response(): return APIResourceUserPermissionResponse() + + +class ResourceUserGroupPermissionItemResponse(serializers.Serializer): + id = serializers.CharField(required=True, label=_("用户组id")) + name = serializers.CharField(required=True, allow_null=True, allow_blank=True, label=_("用户组名称")) + count = serializers.IntegerField(required=True, label=_("用户数")) + permission = serializers.CharField(required=True, allow_null=True, allow_blank=True, label=_("permission")) + + +class APIResourceUserGroupPermissionResponse(ResultSerializer): + def get_data(self): + return ResourceUserGroupPermissionItemResponse(many=True) + + +class APIResourceUserGroupPermissionPageResponse(ResultPageSerializer): + def get_data(self): + return ResourceUserGroupPermissionItemResponse(many=True) + + +class ResourceUserGroupPermissionAPI(ResourceUserPermissionAPI): + @staticmethod + def get_response(): + return APIResourceUserGroupPermissionResponse + + +class ResourceUserGroupPermissionPageAPI(ResourceUserPermissionPageAPI): + @staticmethod + def get_response(): + return APIResourceUserGroupPermissionPageResponse diff --git a/apps/system_manage/views/resource_chat_user.py b/apps/system_manage/views/resource_chat_user.py index ab19cce8bc1..0bb620054f3 100644 --- a/apps/system_manage/views/resource_chat_user.py +++ b/apps/system_manage/views/resource_chat_user.py @@ -8,11 +8,12 @@ """ from django.utils.translation import gettext_lazy as _ -from drf_spectacular.utils import extend_schema +from drf_spectacular.utils import OpenApiResponse, extend_schema from rest_framework.request import Request from rest_framework.views import APIView from common import result +from common.result import ResultStringSerializer from common.auth import TokenAuth from common.auth.authentication import has_permissions from common.auth.constants.compare_constants import CompareConstants @@ -75,7 +76,13 @@ class ResourceChatUser(APIView): summary=_("Get Resource chat user List"), operation_id=_("Get Resource chat user List"), # type: ignore parameters=WorkspaceResourceChatUserListAPI.get_parameters(), - responses=WorkspaceResourceChatUserListAPI.get_response(), + responses={ + 200: WorkspaceResourceChatUserListAPI.get_response(), + 403: OpenApiResponse( + response=ResultStringSerializer, + description=_("No permission to access"), + ), + }, tags=[_("Chat user")], # type: ignore ) @has_permissions( @@ -144,7 +151,13 @@ class Page(APIView): summary=_("Get Resource chat user page List"), operation_id=_("Get Resource chat user page List"), # type: ignore parameters=ResourceChatUserPageAPI.get_parameters(), - responses=ResourceChatUserPageAPI.get_response(), + responses={ + 200: ResourceChatUserPageAPI.get_response(), + 403: OpenApiResponse( + response=ResultStringSerializer, + description=_("No permission to access"), + ), + }, tags=[_("Chat user")], # type: ignore ) @has_permissions( diff --git a/apps/system_manage/views/resource_chat_user_group.py b/apps/system_manage/views/resource_chat_user_group.py index 01911c3f3e7..682a0595324 100644 --- a/apps/system_manage/views/resource_chat_user_group.py +++ b/apps/system_manage/views/resource_chat_user_group.py @@ -1,12 +1,12 @@ from django.utils.translation import gettext_lazy as _ -from drf_spectacular.utils import extend_schema +from drf_spectacular.utils import OpenApiResponse, extend_schema from rest_framework.request import Request from rest_framework.views import APIView from common.auth import TokenAuth from common.auth.authentication import has_permissions from common.auth.constants.role_constants import RoleConstants -from common.result import result +from common.result import result, ResultStringSerializer from system_manage.api.resource_chat_user_group import ResourceChatUserGroupListAPI, ResourceChatUserGroupEditAPI from system_manage.serializers.resource_chat_user_group import ( ResourceChatUserGroupQuerySerializer, @@ -24,7 +24,13 @@ class ResourceChatUserGroup(APIView): summary=_("Get Resource chat user group List"), operation_id=_("Get Resource chat user group List"), # type: ignore parameters=ResourceChatUserGroupListAPI.get_parameters(), - responses=None, + responses={ + 200: ResourceChatUserGroupListAPI.get_response(), + 403: OpenApiResponse( + response=ResultStringSerializer, + description=_("No permission to access"), + ), + }, tags=[_("Chat user")], # type: ignore ) @has_permissions( @@ -95,7 +101,13 @@ class Page(APIView): summary=_("Get Resource chat user page group List"), operation_id=_("Get Resource chat user group page List"), # type: ignore parameters=ResourceChatUserGroupListAPI.get_parameters(), - responses=None, + responses={ + 200: ResourceChatUserGroupListAPI.get_response(), + 403: OpenApiResponse( + response=ResultStringSerializer, + description=_("No permission to access"), + ), + }, tags=[_("Chat user")], # type: ignore ) @has_permissions( diff --git a/apps/system_manage/views/system_chat_user.py b/apps/system_manage/views/system_chat_user.py index 02eb1a54d1f..4393e0b7e6b 100644 --- a/apps/system_manage/views/system_chat_user.py +++ b/apps/system_manage/views/system_chat_user.py @@ -11,7 +11,16 @@ from common.log.log import log from common.result import result from models_provider.api.model import DefaultModelResponse -from system_manage.api.chat_user import BatchAddGroupApi, ChatUserAPI, ChatUserPageApi, EditUserApi +from system_manage.api.chat_user import ( + BatchAddGroupApi, + ChatUserAPI, + ChatUserDetailResponse, + ChatUserGroupPageUserListResponse, + ChatUserPageApi, + ChatUserPageUserListResponse, + ChatUsersListResponse, + EditUserApi, +) from system_manage.api.user_group import ( AddMemberApi, CreateUserGroupApi, @@ -27,7 +36,7 @@ UserGroupListPageSerializer, UserGroupRemoveMemberSerializer, ) -from users.api.user import ChangeUserPasswordApi, DeleteUserApi, UserPageApi, UserProfileAPI +from users.api.user import ChangeUserPasswordApi, DeleteUserApi, UserProfileAPI def get_user_operation_object(user_id): @@ -120,7 +129,7 @@ def delete(self, request: Request, user_id): operation_id=_("Get chat user information"), # type: ignore tags=[_("System/Chat user")], # type: ignore request=DeleteUserApi.get_parameters(), - responses=UserProfileAPI.get_response(), + responses=ChatUserDetailResponse, ) @has_permissions(PermissionConstants.CHAT_USER_READ, RoleConstants.ADMIN, RoleConstants.WORKSPACE_MANAGE) def get(self, request: Request, user_id): @@ -155,7 +164,7 @@ class GetUserListByGroup(APIView): operation_id=_("Get user list by group"), # type: ignore tags=[_("System/Chat user")], # type: ignore request=AddMemberApi.get_parameters(), - responses=UserProfileAPI.get_response(), + responses=ChatUsersListResponse, ) @has_permissions(PermissionConstants.CHAT_USER_READ, RoleConstants.ADMIN, RoleConstants.WORKSPACE_MANAGE) def get(self, request: Request, user_group_id): @@ -239,7 +248,7 @@ class Page(APIView): operation_id=_("Get user paginated list"), # type: ignore tags=[_("System/Chat user")], # type: ignore parameters=ChatUserPageApi.get_parameters(), - responses=UserPageApi.get_response(), + responses=ChatUserPageUserListResponse, ) @has_permissions(PermissionConstants.CHAT_USER_READ, RoleConstants.ADMIN, RoleConstants.WORKSPACE_MANAGE) def get(self, request: Request, current_page, page_size): @@ -386,7 +395,7 @@ class UserList(APIView): operation_id=_("Get user list by group"), # type: ignore tags=[_("System/User Group")], # type: ignore parameters=UserGroupListApi.get_parameters(), - responses=UserGroupListApi.get_response(), + responses=ChatUserGroupPageUserListResponse, ) @has_permissions(PermissionConstants.USER_GROUP_READ, RoleConstants.ADMIN, RoleConstants.WORKSPACE_MANAGE) def get(self, request: Request, user_group_id: str, current_page: int, page_size: int): diff --git a/apps/system_manage/views/user_group_resource_permission.py b/apps/system_manage/views/user_group_resource_permission.py index 58d88509626..50d2632ab11 100644 --- a/apps/system_manage/views/user_group_resource_permission.py +++ b/apps/system_manage/views/user_group_resource_permission.py @@ -27,6 +27,8 @@ ResourceUserPermissionAPI, ResourceUserPermissionPageAPI, ResourceUserPermissionEditAPI, + ResourceUserGroupPermissionAPI, + ResourceUserGroupPermissionPageAPI, UserResourcePermissionPageAPI, ) from system_manage.serializers.user_group_resource_permission import ( @@ -150,7 +152,7 @@ class WorkspaceResourceUserGroupPermissionView(APIView): summary=_("Get user group authorization status of resource"), operation_id=_("Get user group authorization status of resource"), # type: ignore parameters=ResourceUserPermissionAPI.get_parameters(), - responses=ResourceUserPermissionAPI.get_response(), + responses=ResourceUserGroupPermissionAPI.get_response(), tags=[_("Resources authorization")], # type: ignore ) @has_permissions( @@ -237,7 +239,7 @@ class Page(APIView): summary=_("Get user group authorization status of resource by page"), operation_id=_("Get user group authorization status of resource by page"), # type: ignore parameters=ResourceUserPermissionPageAPI.get_parameters(), - responses=ResourceUserPermissionPageAPI.get_response(), + responses=ResourceUserGroupPermissionPageAPI.get_response(), tags=[_("Resources authorization")], # type: ignore ) @has_permissions( diff --git a/apps/tools/api/tool.py b/apps/tools/api/tool.py index 4ba2e44a05a..79574c836eb 100644 --- a/apps/tools/api/tool.py +++ b/apps/tools/api/tool.py @@ -20,6 +20,21 @@ class ToolModelResponseSerializer(ToolModelSerializer): init_params = serializers.DictField(required=False, allow_null=True, label="初始化参数") +class ToolListDataSerializer(serializers.Serializer): + tools = ToolModelResponseSerializer(many=True, label="工具列表") + shared_tools = ToolModelResponseSerializer(many=True, label="共享工具列表") + + +class ToolListResponse(ResultSerializer): + def get_data(self): + return ToolListDataSerializer() + + +class ToolModelListResponse(ResultSerializer): + def get_data(self): + return ToolModelResponseSerializer(many=True) + + class ToolCreateResponse(ResultSerializer): def get_data(self): return ToolModelResponseSerializer() @@ -77,6 +92,10 @@ class ToolEditAPI(ToolReadAPI): def get_request(): return ToolEditRequest + @staticmethod + def get_response(): + return ToolCreateResponse + class ToolDeleteAPI(ToolReadAPI): @staticmethod diff --git a/apps/tools/api/tool_workflow.py b/apps/tools/api/tool_workflow.py index a9cf179377d..2264cd19e7d 100644 --- a/apps/tools/api/tool_workflow.py +++ b/apps/tools/api/tool_workflow.py @@ -3,16 +3,112 @@ from drf_spectacular.utils import OpenApiParameter from common.mixins.api_mixin import APIMixin -from common.result import DefaultResultSerializer +from common.result import DefaultResultSerializer, ResultSerializer, ResultPageSerializer from tools.serializers.tool_workflow import ToolWorkflowImportRequest +from tools.serializers.tool_version import ToolVersionModelSerializer class ToolWorkflowApi(APIMixin): pass +class ToolWorkflowVersionResult(ResultSerializer): + def get_data(self): + return ToolVersionModelSerializer() + + +class ToolWorkflowVersionListResult(ResultSerializer): + def get_data(self): + return ToolVersionModelSerializer(many=True) + + +class ToolWorkflowVersionPageResult(ResultPageSerializer): + def get_data(self): + return ToolVersionModelSerializer(many=True) + + class ToolWorkflowVersionApi(APIMixin): - pass + @staticmethod + def get_parameters(): + return [ + OpenApiParameter( + name="workspace_id", + description="工作空间id", + type=OpenApiTypes.STR, + location="path", + required=True, + ), + OpenApiParameter( + name="tool_id", + description="工具id", + type=OpenApiTypes.STR, + location="path", + required=True, + ), + ] + + +class ToolWorkflowVersionListApi(ToolWorkflowVersionApi): + @staticmethod + def get_parameters(): + return [ + OpenApiParameter( + name="name", + description="Version Name", + type=OpenApiTypes.STR, + required=False, + ), + *ToolWorkflowVersionApi.get_parameters(), + ] + + @staticmethod + def get_response(): + return ToolWorkflowVersionListResult + + +class ToolWorkflowVersionPageApi(ToolWorkflowVersionListApi): + @staticmethod + def get_parameters(): + return [ + OpenApiParameter( + name="current_page", + description="当前页码", + type=OpenApiTypes.INT, + location="path", + required=True, + ), + OpenApiParameter( + name="page_size", + description="每页大小", + type=OpenApiTypes.INT, + location="path", + required=True, + ), + *ToolWorkflowVersionListApi.get_parameters(), + ] + + @staticmethod + def get_response(): + return ToolWorkflowVersionPageResult + + +class ToolWorkflowVersionOperateApi(ToolWorkflowVersionApi): + @staticmethod + def get_parameters(): + return [ + OpenApiParameter( + name="tool_version_id", + description="工具版本id", + type=OpenApiTypes.STR, + location="path", + required=True, + ), + *ToolWorkflowVersionApi.get_parameters(), + ] + + @staticmethod + def get_response(): + return ToolWorkflowVersionResult class ToolWorkflowExportApi(APIMixin): @@ -23,14 +119,14 @@ def get_parameters(): name="workspace_id", description="工作空间id", type=OpenApiTypes.STR, - location='path', + location="path", required=True, ), OpenApiParameter( name="tool_id", description="工具id", type=OpenApiTypes.STR, - location='path', + location="path", required=True, ), ] diff --git a/apps/tools/views/tool.py b/apps/tools/views/tool.py index ba9cf8cb4f2..a08aa4a56f3 100644 --- a/apps/tools/views/tool.py +++ b/apps/tools/views/tool.py @@ -1,4 +1,5 @@ from common import result +from common.result import ResultStringSerializer from common.auth import TokenAuth from common.auth.authentication import check_batch_permissions, has_permissions from common.auth.constants.compare_constants import CompareConstants @@ -8,7 +9,7 @@ from common.log.log import log from django.db.models import QuerySet from django.utils.translation import gettext_lazy as _ -from drf_spectacular.utils import extend_schema +from drf_spectacular.utils import OpenApiResponse, extend_schema from rest_framework.parsers import MultiPartParser from rest_framework.request import Request from rest_framework.views import APIView @@ -28,6 +29,7 @@ ToolReadAPI, ToolMoveAPI, ToolTreeReadAPI, + ToolListResponse, ) from tools.models import Tool, ToolScope from tools.permissions import get_tool_read_permission @@ -88,7 +90,13 @@ def post(self, request: Request, workspace_id: str): summary=_("Get tool by folder"), operation_id=_("Get tool by folder"), # type: ignore parameters=ToolTreeReadAPI.get_parameters(), - responses=ToolTreeReadAPI.get_response(), + responses={ + 200: ToolTreeReadAPI.get_response(), + 400: OpenApiResponse( + response=ResultStringSerializer, + description=_("Invalid or missing parameter"), + ), + }, tags=[_("Tool")], # type: ignore ) @has_permissions( @@ -356,7 +364,13 @@ class Page(APIView): summary=_("Get tool list by pagination"), operation_id=_("Get tool list by pagination"), # type: ignore parameters=ToolPageAPI.get_parameters(), - responses=ToolPageAPI.get_response(), + responses={ + 200: ToolPageAPI.get_response(), + 400: OpenApiResponse( + response=ResultStringSerializer, + description=_("Invalid or missing parameter"), + ), + }, tags=[_("Tool")], # type: ignore ) @has_permissions( @@ -391,7 +405,7 @@ class Query(APIView): summary=_("Get tool list"), operation_id=_("Get tool list"), # type: ignore parameters=ToolReadAPI.get_parameters(), - responses=ToolReadAPI.get_response(), + responses=ToolListResponse, tags=[_("Tool")], # type: ignore ) @has_permissions( diff --git a/apps/tools/views/tool_workflow_version.py b/apps/tools/views/tool_workflow_version.py index 7c6547bb9f5..970dd4da3a2 100644 --- a/apps/tools/views/tool_workflow_version.py +++ b/apps/tools/views/tool_workflow_version.py @@ -1,11 +1,12 @@ # coding=utf-8 """ - @project: MaxKB - @Author:虎虎 - @file: application_version.py.py - @date:2025/6/3 15:46 - @desc: +@project: MaxKB +@Author:虎虎 +@file: application_version.py.py +@date:2025/6/3 15:46 +@desc: """ + from django.db.models import QuerySet from django.utils.translation import gettext_lazy as _ from drf_spectacular.utils import extend_schema @@ -20,8 +21,11 @@ from common.auth.constants.role_constants import RoleConstants from common.auth.struct.aggregate_permission import ViewPermission from common.log.log import log -from knowledge.api.knowledge_version import KnowledgeVersionListAPI, KnowledgeVersionPageAPI, \ - KnowledgeVersionOperateAPI +from tools.api.tool_workflow import ( + ToolWorkflowVersionListApi, + ToolWorkflowVersionPageApi, + ToolWorkflowVersionOperateApi, +) from knowledge.models import Knowledge from tools.serializers.tool_version import ToolWorkflowVersionSerializer from tools.views import get_tool_operation_object @@ -30,9 +34,7 @@ def get_knowledge_operation_object(knowledge_id): knowledge_model = QuerySet(model=Knowledge).filter(id=knowledge_id).first() if knowledge_model is not None: - return { - 'name': knowledge_model.name - } + return {"name": knowledge_model.name} return {} @@ -40,98 +42,127 @@ class ToolWorkflowVersionView(APIView): authentication_classes = [TokenAuth] @extend_schema( - methods=['GET'], + methods=["GET"], description=_("Get the tool version list"), summary=_("Get the tool version list"), operation_id=_("Get the tool version list"), # type: ignore - parameters=KnowledgeVersionListAPI.get_parameters(), - responses=KnowledgeVersionListAPI.get_response(), - tags=[_('Tool/Version')] # type: ignore + parameters=ToolWorkflowVersionListApi.get_parameters(), + responses=ToolWorkflowVersionListApi.get_response(), + tags=[_("Tool/Version")], # type: ignore + ) + @has_permissions( + PermissionConstants.TOOL_READ.get_workspace_tool_permission(), + PermissionConstants.TOOL_READ.get_workspace_permission_workspace_manage_role(), + ViewPermission( + [RoleConstants.USER.get_workspace_role()], + [PermissionConstants.TOOL.get_workspace_tool_permission()], + compare=CompareConstants.AND, + ), + RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), ) - @has_permissions(PermissionConstants.TOOL_READ.get_workspace_tool_permission(), - PermissionConstants.TOOL_READ.get_workspace_permission_workspace_manage_role(), - ViewPermission([RoleConstants.USER.get_workspace_role()], - [PermissionConstants.TOOL.get_workspace_tool_permission()], - compare=CompareConstants.AND), - RoleConstants.WORKSPACE_MANAGE.get_workspace_role()) def get(self, request: Request, workspace_id, tool_id: str): return result.success( - ToolWorkflowVersionSerializer.Query( - data={'workspace_id': workspace_id}).list( - {'name': request.query_params.get("name"), 'tool_id': tool_id})) + ToolWorkflowVersionSerializer.Query(data={"workspace_id": workspace_id}).list( + {"name": request.query_params.get("name"), "tool_id": tool_id} + ) + ) class Page(APIView): authentication_classes = [TokenAuth] @extend_schema( - methods=['GET'], + methods=["GET"], description=_("Get the list of tool versions by page"), summary=_("Get the list of tool versions by page"), operation_id=_("Get the list of tool versions by page"), # type: ignore - parameters=KnowledgeVersionPageAPI.get_parameters(), - responses=KnowledgeVersionPageAPI.get_response(), - tags=[_('Tool/Version')] # type: ignore + parameters=ToolWorkflowVersionPageApi.get_parameters(), + responses=ToolWorkflowVersionPageApi.get_response(), + tags=[_("Tool/Version")], # type: ignore + ) + @has_permissions( + PermissionConstants.TOOL_READ.get_workspace_tool_permission(), + PermissionConstants.TOOL_READ.get_workspace_permission_workspace_manage_role(), + ViewPermission( + [RoleConstants.USER.get_workspace_role()], + [PermissionConstants.TOOL.get_workspace_tool_permission()], + compare=CompareConstants.AND, + ), + RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), ) - @has_permissions(PermissionConstants.TOOL_READ.get_workspace_tool_permission(), - PermissionConstants.TOOL_READ.get_workspace_permission_workspace_manage_role(), - ViewPermission([RoleConstants.USER.get_workspace_role()], - [PermissionConstants.TOOL.get_workspace_tool_permission()], - compare=CompareConstants.AND), - RoleConstants.WORKSPACE_MANAGE.get_workspace_role()) def get(self, request: Request, workspace_id: str, tool_id: str, current_page: int, page_size: int): return result.success( - ToolWorkflowVersionSerializer.Query( - data={'workspace_id': workspace_id}).page( - {'name': request.query_params.get("name"), 'tool_id': tool_id}, - current_page, page_size)) + ToolWorkflowVersionSerializer.Query(data={"workspace_id": workspace_id}).page( + {"name": request.query_params.get("name"), "tool_id": tool_id}, current_page, page_size + ) + ) class Operate(APIView): authentication_classes = [TokenAuth] @extend_schema( - methods=['GET'], + methods=["GET"], description=_("Get tool version details"), summary=_("Get tool version details"), operation_id=_("Get tool version details"), # type: ignore - parameters=KnowledgeVersionOperateAPI.get_parameters(), - responses=KnowledgeVersionOperateAPI.get_response(), - tags=[_('Tool/Version')] # type: ignore + parameters=ToolWorkflowVersionOperateApi.get_parameters(), + responses=ToolWorkflowVersionOperateApi.get_response(), + tags=[_("Tool/Version")], # type: ignore + ) + @has_permissions( + PermissionConstants.TOOL_READ.get_workspace_tool_permission(), + PermissionConstants.TOOL_READ.get_workspace_permission_workspace_manage_role(), + ViewPermission( + [RoleConstants.USER.get_workspace_role()], + [PermissionConstants.TOOL.get_workspace_tool_permission()], + compare=CompareConstants.AND, + ), + RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), ) - @has_permissions(PermissionConstants.TOOL_READ.get_workspace_tool_permission(), - PermissionConstants.TOOL_READ.get_workspace_permission_workspace_manage_role(), - ViewPermission([RoleConstants.USER.get_workspace_role()], - [PermissionConstants.TOOL.get_workspace_tool_permission()], - compare=CompareConstants.AND), - RoleConstants.WORKSPACE_MANAGE.get_workspace_role()) def get(self, request: Request, workspace_id: str, tool_id: str, tool_version_id: str): return result.success( ToolWorkflowVersionSerializer.Operate( - data={'user_id': request.user, 'workspace_id': workspace_id, - 'tool_id': tool_id, 'tool_version_id': tool_version_id}).one()) + data={ + "user_id": request.user, + "workspace_id": workspace_id, + "tool_id": tool_id, + "tool_version_id": tool_version_id, + } + ).one() + ) @extend_schema( - methods=['PUT'], + methods=["PUT"], description=_("Modify tool version information"), summary=_("Modify tool version information"), operation_id=_("Modify tool version information"), # type: ignore - parameters=KnowledgeVersionOperateAPI.get_parameters(), + parameters=ToolWorkflowVersionOperateApi.get_parameters(), request=None, - responses=KnowledgeVersionOperateAPI.get_response(), - tags=[_('Tool/Version')] # type: ignore + responses=ToolWorkflowVersionOperateApi.get_response(), + tags=[_("Tool/Version")], # type: ignore + ) + @has_permissions( + PermissionConstants.TOOL_EDIT.get_workspace_tool_permission(), + PermissionConstants.TOOL_EDIT.get_workspace_permission_workspace_manage_role(), + ViewPermission( + [RoleConstants.USER.get_workspace_role()], + [PermissionConstants.TOOL.get_workspace_tool_permission()], + compare=CompareConstants.AND, + ), + RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), + ) + @log( + menu="Tool", + operate="Modify tool version information", + get_operation_object=lambda r, k: get_tool_operation_object(k.get("tool_id")), ) - @has_permissions(PermissionConstants.TOOL_EDIT.get_workspace_tool_permission(), - PermissionConstants.TOOL_EDIT.get_workspace_permission_workspace_manage_role(), - ViewPermission([RoleConstants.USER.get_workspace_role()], - [PermissionConstants.TOOL.get_workspace_tool_permission()], - compare=CompareConstants.AND), - RoleConstants.WORKSPACE_MANAGE.get_workspace_role()) - @log(menu='Tool', operate="Modify tool version information", - get_operation_object=lambda r, k: get_tool_operation_object(k.get('tool_id')), - ) def put(self, request: Request, workspace_id: str, tool_id: str, tool_version_id: str): return result.success( ToolWorkflowVersionSerializer.Operate( - data={'tool_id': tool_id, 'workspace_id': workspace_id, - 'tool_version_id': tool_version_id, - 'user_id': request.user.id}).edit( - request.data)) + data={ + "tool_id": tool_id, + "workspace_id": workspace_id, + "tool_version_id": tool_version_id, + "user_id": request.user.id, + } + ).edit(request.data) + ) diff --git a/apps/users/api/user.py b/apps/users/api/user.py index 9dab995f588..87235ef5e25 100644 --- a/apps/users/api/user.py +++ b/apps/users/api/user.py @@ -90,7 +90,8 @@ def get_response(): class WorkspaceUser(serializers.Serializer): id = serializers.CharField(required=True, label=_("id")) - username = serializers.CharField(required=True, label=_("Username")) + nick_name = serializers.CharField(required=True, allow_null=True, allow_blank=True, label=_("Nick name")) + roles = serializers.ListField(child=serializers.CharField(required=False), required=False, label=_("roles")) class WorkspaceUserListResponse(ResultSerializer): @@ -161,9 +162,30 @@ def get_request(): return UserManageSerializer.RePasswordInstance +class UserMinimalSerializer(serializers.Serializer): + id = serializers.CharField(required=True, label=_("ID")) + username = serializers.CharField(required=True, label=_("Username")) + nick_name = serializers.CharField(required=False, allow_blank=True, allow_null=True, label=_("Nickname")) + + class UserListResponse(ResultSerializer): def get_data(self): - return UserInstanceSerializer(many=True) + return UserMinimalSerializer(many=True) + + +class UserManageDetailSerializer(serializers.Serializer): + id = serializers.CharField(required=True, label=_("ID")) + username = serializers.CharField(required=True, label=_("Username")) + email = serializers.CharField(required=False, allow_blank=True, allow_null=True, label=_("Email")) + phone = serializers.CharField(required=False, allow_blank=True, allow_null=True, label=_("Phone")) + nick_name = serializers.CharField(required=False, allow_blank=True, allow_null=True, label=_("Nickname")) + is_active = serializers.BooleanField(required=False, label=_("Is Active")) + role_setting = serializers.DictField(required=False, label=_("Role Setting")) + + +class UserManageDetailResponse(ResultSerializer): + def get_data(self): + return UserManageDetailSerializer() class UserPageResponse(ResultPageSerializer): diff --git a/apps/users/api/user_group.py b/apps/users/api/user_group.py index 629867d35d4..fc5e9c01b30 100644 --- a/apps/users/api/user_group.py +++ b/apps/users/api/user_group.py @@ -4,7 +4,7 @@ from rest_framework import serializers from common.mixins.api_mixin import APIMixin -from common.result import ResultSerializer, DefaultResultSerializer +from common.result import DefaultResultSerializer, ResultPageSerializer, ResultSerializer from users.serializers.user_group import SystemUserGroupModelSerializer, SystemUserGroupCreateSerializer @@ -71,6 +71,20 @@ def get_parameters(): ] +class SystemUserGroupUserListSerializer(serializers.Serializer): + id = serializers.CharField(required=True, label=_("ID")) + username = serializers.CharField(required=True, label=_("Username")) + nick_name = serializers.CharField(required=True, label=_("Nickname")) + system_user_group_relation_id = serializers.CharField(required=False, label=_("Relation ID")) + source = serializers.CharField(required=False, allow_blank=True, label=_("Source")) + roles = serializers.ListField(required=False, child=serializers.CharField(required=False), label=_("Roles")) + + +class SystemUserGroupUserListPageResponse(ResultPageSerializer): + def get_data(self): + return SystemUserGroupUserListSerializer(many=True) + + class UserGroupListPageResponse(ResultSerializer): def get_data(self): return SystemUserGroupModelSerializer(many=True) diff --git a/apps/users/serializers/user.py b/apps/users/serializers/user.py index 51f3c765b70..16d7eea7702 100644 --- a/apps/users/serializers/user.py +++ b/apps/users/serializers/user.py @@ -121,6 +121,7 @@ def check_verify_code_attempts(email: str, type_code: str, submitted_code: str) class UserProfileResponse(serializers.ModelSerializer): is_edit_password = serializers.BooleanField(required=True, label=_("Is Edit Password")) permissions = serializers.DictField(child=serializers.CharField(), required=True, label=_("permissions")) + role = serializers.ListField(child=serializers.CharField(), required=True, label=_("Role")) class Meta: model = User diff --git a/apps/users/views/system_user_group.py b/apps/users/views/system_user_group.py index a787cb1ac87..ab596282a54 100644 --- a/apps/users/views/system_user_group.py +++ b/apps/users/views/system_user_group.py @@ -17,6 +17,7 @@ CreateUserGroupApi, DeleteUserGroupApi, RemoveMemberApi, + SystemUserGroupUserListPageResponse, UserGroupListApi, UserGroupListPageApi, ) @@ -180,7 +181,7 @@ class UserList(APIView): operation_id=_("Get user list by group"), # type: ignore tags=[_("IAM/System User Group")], # type: ignore parameters=UserGroupListPageApi.get_parameters(), - responses=UserGroupListPageApi.get_response(), + responses=SystemUserGroupUserListPageResponse, ) @has_permissions( PermissionConstants.SYSTEM_USER_GROUP_READ, RoleConstants.ADMIN, RoleConstants.WORKSPACE_MANAGE diff --git a/apps/users/views/user.py b/apps/users/views/user.py index dafaa02a68a..7526d4feb9f 100644 --- a/apps/users/views/user.py +++ b/apps/users/views/user.py @@ -36,18 +36,17 @@ ChangeUserPasswordApi, UserPageApi, UserListApi, + UserManageDetailResponse, UserPasswordResponse, WorkspaceUserAPI, ResetPasswordAPI, SendEmailAPI, - CheckCodeAPI, SwitchUserLanguageAPI, ) from users.models import User from users.serializers.user import ( UserProfileSerializer, UserManageSerializer, - CheckCodeSerializer, SendEmailSerializer, RePasswordSerializer, SwitchLanguageSerializer, @@ -287,7 +286,7 @@ def delete(self, request: Request, user_id): operation_id=_("Get user information"), # type: ignore tags=[_("User Management")], # type: ignore request=DeleteUserApi.get_parameters(), - responses=UserProfileAPI.get_response(), + responses=UserManageDetailResponse, ) @has_permissions(PermissionConstants.USER_READ, RoleConstants.ADMIN) def get(self, request: Request, user_id):