| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367 |
- # coding=utf-8
- """
- @project: MaxKB
- @Author:虎虎
- @file: user.py
- @date:2025/4/14 19:25
- @desc:
- """
- from django.db.models import QuerySet
- from drf_spectacular.utils import extend_schema
- from rest_framework.views import APIView
- from django.utils.translation import gettext_lazy as _
- from rest_framework.request import Request
- from common.auth import TokenAuth
- from common.auth.authentication import has_permissions
- from common.constants.permission_constants import PermissionConstants, RoleConstants, ViewPermission, CompareConstants
- from common.log.log import log
- from common.result import result
- from common.utils.common import query_params_to_single_dict
- from models_provider.api.model import ModelCreateAPI, GetModelApi, ModelEditApi, ModelListResponse, DefaultModelResponse
- from models_provider.api.provide import ProvideApi
- from models_provider.models import Model, Status
- from models_provider.serializers.model_serializer import ModelSerializer, \
- WorkspaceSharedModelSerializer
- from system_manage.views import encryption_str
- def encryption_credential(credential):
- if isinstance(credential, dict):
- return {key: encryption_str(credential.get(key)) for key in credential}
- return credential
- def get_edit_model_details(request):
- path = request.path
- body = request.data
- query = request.query_params
- credential = body.get('credential', {})
- credential_encryption_ed = encryption_credential(credential)
- return {
- 'path': path,
- 'body': {**body, 'credential': credential_encryption_ed},
- 'query': query
- }
- def get_model_operation_object(model_id):
- model_model = QuerySet(model=Model).filter(id=model_id).first()
- if model_model is not None:
- return {
- "name": model_model.name
- }
- return {}
- class ModelSetting(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(methods=['POST'],
- summary=_("Create model"),
- description=_("Create model"),
- operation_id=_("Create model"), # type: ignore
- tags=[_("Model")], # type: ignore
- parameters=ModelCreateAPI.get_parameters(),
- request=ModelCreateAPI.get_request(),
- responses=ModelCreateAPI.get_response())
- @has_permissions(PermissionConstants.MODEL_CREATE.get_workspace_permission(),
- PermissionConstants.MODEL_EDIT.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), RoleConstants.USER.get_workspace_role())
- @log(menu='model', operate='Create model',
- get_operation_object=lambda r, k: {'name': r.date.get('name')},
- get_details=get_edit_model_details,
- )
- def post(self, request: Request, workspace_id: str):
- return result.success(
- ModelSerializer.Create(
- data={**request.data, 'user_id': request.user.id, 'workspace_id': workspace_id}).insert(workspace_id,
- with_valid=True))
- # @extend_schema(methods=['PUT'],
- # summary=_('Update model'),
- # operation_id=_('Update model'), # type: ignore
- # request=ModelEditApi.get_request(),
- # responses=ModelCreateApi.get_response(),
- # tags=[_('Model')]) # type: ignore
- # @has_permissions(PermissionConstants.MODEL_CREATE)
- # def put(self, request: Request):
- # return result.success(
- # ModelSerializer.Create(data={**request.data, 'user_id': str(request.user.id)}).insert(request.user.id,
- # with_valid=True))
- @extend_schema(methods=['GET'],
- summary=_('Query model list'),
- description=_('Query model list'),
- operation_id=_('Query model list'), # type: ignore
- parameters=ModelListResponse.get_parameters(),
- responses=ModelListResponse.get_response(),
- tags=[_('Model')]) # type: ignore
- @has_permissions(PermissionConstants.MODEL_READ.get_workspace_permission(),
- PermissionConstants.MODEL_READ.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), RoleConstants.USER.get_workspace_role())
- def get(self, request: Request, workspace_id: str):
- return result.success(
- ModelSerializer.Query(
- data={**query_params_to_single_dict(request.query_params), 'user_id': str(request.user.id)}).list(
- workspace_id=workspace_id,
- with_valid=True))
- class Operate(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(methods=['PUT'],
- summary=_('Update model'),
- description=_('Update model'),
- operation_id=_('Update model'), # type: ignore
- request=ModelEditApi.get_request(),
- parameters=GetModelApi.get_parameters(),
- responses=ModelEditApi.get_response(),
- tags=[_('Model')]) # type: ignore
- @has_permissions(PermissionConstants.MODEL_EDIT.get_workspace_model_permission(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
- PermissionConstants.MODEL_EDIT.get_workspace_permission_workspace_manage_role(),
- ViewPermission([RoleConstants.USER.get_workspace_role()],
- [PermissionConstants.MODEL.get_workspace_model_permission()],
- CompareConstants.AND), )
- @log(menu='model', operate='Update model',
- get_operation_object=lambda r, k: get_model_operation_object(k.get('model_id')),
- get_details=get_edit_model_details,
- )
- def put(self, request: Request, workspace_id, model_id: str):
- return result.success(
- ModelSerializer.Operate(
- data={'id': model_id, 'user_id': request.user.id, 'workspace_id': workspace_id}).edit(request.data,
- str(request.user.id)))
- @extend_schema(methods=['DELETE'],
- summary=_('Delete model'),
- description=_('Delete model'),
- operation_id=_('Delete model'), # type: ignore
- parameters=GetModelApi.get_parameters(),
- responses=DefaultModelResponse.get_response(),
- tags=[_('Model')]) # type: ignore
- @has_permissions(PermissionConstants.MODEL_DELETE.get_workspace_model_permission(),
- PermissionConstants.MODEL_DELETE.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
- ViewPermission([RoleConstants.USER.get_workspace_role()],
- [PermissionConstants.MODEL.get_workspace_model_permission()],
- CompareConstants.AND), )
- @log(menu='model', operate='Delete model',
- get_operation_object=lambda r, k: get_model_operation_object(k.get('model_id')),
- )
- def delete(self, request: Request, workspace_id: str, model_id: str):
- return result.success(
- ModelSerializer.Operate(
- data={'id': model_id, 'user_id': request.user.id, 'workspace_id': workspace_id}).delete())
- @extend_schema(methods=['GET'],
- summary=_('Query model details'),
- description=_('Query model details'),
- operation_id=_('Query model details'), # type: ignore
- parameters=GetModelApi.get_parameters(),
- responses=GetModelApi.get_response(),
- tags=[_('Model')]) # type: ignore
- @has_permissions(PermissionConstants.MODEL_READ.get_workspace_model_permission(),
- PermissionConstants.MODEL_READ.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
- ViewPermission([RoleConstants.USER.get_workspace_role()],
- [PermissionConstants.MODEL.get_workspace_model_permission()],
- CompareConstants.AND), )
- def get(self, request: Request, workspace_id: str, model_id: str):
- return result.success(
- ModelSerializer.Operate(
- data={'id': model_id, 'user_id': request.user.id, 'workspace_id': workspace_id}).one(
- with_valid=True))
- class ModelParamsForm(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(methods=['GET'],
- summary=_('Get model parameter form'),
- description=_('Get model parameter form'),
- operation_id=_('Get model parameter form'), # type: ignore
- parameters=GetModelApi.get_parameters(),
- responses=ProvideApi.ModelParamsForm.get_response(),
- tags=[_('Model')]) # type: ignore
- @has_permissions(PermissionConstants.MODEL_READ.get_workspace_model_permission(),
- PermissionConstants.KNOWLEDGE_READ.get_workspace_permission(),
- PermissionConstants.APPLICATION_READ.get_workspace_permission(),
- PermissionConstants.MODEL_READ.get_workspace_permission_workspace_manage_role(),
- PermissionConstants.KNOWLEDGE_READ.get_workspace_permission_workspace_manage_role(),
- PermissionConstants.APPLICATION_READ.get_workspace_permission_workspace_manage_role(),
- PermissionConstants.MODEL_READ.get_workspace_permission(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
- RoleConstants.USER.get_workspace_role(),)
- def get(self, request: Request, workspace_id: str, model_id: str):
- return result.success(
- ModelSerializer.ModelParams(data={'id': model_id}).get_model_params())
- @extend_schema(methods=['PUT'],
- summary=_('Save model parameter form'),
- description=_('Save model parameter form'),
- operation_id=_('Save model parameter form'), # type: ignore
- parameters=GetModelApi.get_parameters(),
- request=GetModelApi.get_request(),
- responses=ProvideApi.ModelParamsForm.get_response(),
- tags=[_('Model')]) # type: ignore
- @has_permissions(PermissionConstants.MODEL_EDIT.get_workspace_model_permission(),
- PermissionConstants.MODEL_EDIT.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
- PermissionConstants.MODEL_READ.get_workspace_permission(),
- ViewPermission([RoleConstants.USER.get_workspace_role()],
- [PermissionConstants.MODEL.get_workspace_model_permission()],
- CompareConstants.AND), )
- @log(menu='model', operate='Save model parameter form',
- get_operation_object=lambda r, k: get_model_operation_object(k.get('model_id')),
- )
- def put(self, request: Request, workspace_id: str, model_id: str):
- return result.success(
- ModelSerializer.ModelParams(data={'id': model_id}).save_model_params_form(request.data))
- class ModelMeta(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(methods=['GET'],
- summary=_(
- 'Query model meta information, this interface does not carry authentication information'),
- description=_(
- 'Query model meta information, this interface does not carry authentication information'),
- operation_id=_(
- 'Query model meta information, this interface does not carry authentication information'),
- parameters=GetModelApi.get_parameters(),
- responses=GetModelApi.get_response(),
- tags=[_('Model')]) # type: ignore
- @has_permissions(PermissionConstants.MODEL_READ.get_workspace_model_permission(),
- PermissionConstants.MODEL_READ.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
- PermissionConstants.MODEL_READ.get_workspace_permission(),
- ViewPermission([RoleConstants.USER.get_workspace_role()],
- [PermissionConstants.MODEL.get_workspace_model_permission()],
- CompareConstants.AND), )
- def get(self, request: Request, workspace_id: str, model_id: str):
- return result.success(
- ModelSerializer.Operate(data={'id': model_id, 'workspace_id': workspace_id}).one_meta(with_valid=True))
- class PauseDownload(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(methods=['PUT'],
- summary=_('Pause model download'),
- description=_('Pause model download'),
- operation_id=_('Pause model download'), # type: ignore
- parameters=GetModelApi.get_parameters(),
- request=GetModelApi.get_request(),
- responses=DefaultModelResponse.get_response(),
- tags=[_('Model')]) # type: ignore
- @has_permissions(PermissionConstants.MODEL_CREATE.get_workspace_model_permission(),
- PermissionConstants.MODEL_CREATE.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
- ViewPermission([RoleConstants.USER.get_workspace_role()],
- [PermissionConstants.MODEL.get_workspace_model_permission()],
- CompareConstants.AND), )
- def put(self, request: Request, workspace_id: str, model_id: str):
- return result.success(
- ModelSerializer.Operate(data={'id': model_id, 'workspace_id': workspace_id}).pause_download())
- class BatchDelete(APIView):
- """批量删除模型"""
- authentication_classes = [TokenAuth]
- @extend_schema(methods=['POST'],
- summary=_('Batch delete models'),
- description=_('Batch delete models'),
- operation_id=_('Batch delete models'),
- tags=[_('Model')])
- @has_permissions(PermissionConstants.MODEL_DELETE.get_workspace_permission(),
- PermissionConstants.MODEL_DELETE.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
- RoleConstants.USER.get_workspace_role())
- def post(self, request: Request, workspace_id: str):
- model_ids = request.data.get('model_ids', [])
- if not model_ids:
- return result.success({'deleted_count': 0})
- deleted_count = 0
- for model_id in model_ids:
- try:
- ModelSerializer.Operate(
- data={'id': model_id, 'user_id': request.user.id, 'workspace_id': workspace_id}
- ).delete()
- deleted_count += 1
- except Exception:
- pass
- return result.success({'deleted_count': deleted_count})
- class BatchOperate(APIView):
- """批量设置模型状态"""
- authentication_classes = [TokenAuth]
- @extend_schema(methods=['POST'],
- summary=_('Batch update model status'),
- description=_('Batch update model status'),
- operation_id=_('Batch update model status'),
- tags=[_('Model')])
- @has_permissions(PermissionConstants.MODEL_EDIT.get_workspace_permission(),
- PermissionConstants.MODEL_EDIT.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
- RoleConstants.USER.get_workspace_role())
- def post(self, request: Request, workspace_id: str):
- model_ids = request.data.get('model_ids', [])
- status = request.data.get('status', '')
- if not model_ids or status not in [s[0] for s in Status.choices]:
- return result.success({'updated_count': 0})
- updated_count = QuerySet(Model).filter(
- id__in=model_ids, workspace_id=workspace_id
- ).update(status=status)
- return result.success({'updated_count': updated_count})
- class WorkspaceSharedModelSetting(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(
- methods=['Get'],
- summary=_('Get Share model by workspace id'),
- description=_('Get Share model by workspace id'),
- operation_id=_('Get Share model by workspace id'), # type: ignore
- parameters=ModelListResponse.get_parameters(),
- responses=DefaultModelResponse.get_response(),
- tags=[_('Shared Model')]
- ) # type: ignore
- @has_permissions(
- PermissionConstants.MODEL_READ.get_workspace_permission(),
- PermissionConstants.MODEL_READ.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
- RoleConstants.USER.get_workspace_role(),
- )
- def get(self, request: Request, workspace_id: str):
- return result.success(
- WorkspaceSharedModelSerializer(data={**query_params_to_single_dict(request.query_params),
- 'workspace_id': workspace_id}).get_share_model_list())
- class ModelList(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(methods=['GET'],
- summary=_('Query all model list'),
- description=_('Query all model list'),
- operation_id=_('Query all model list'), # type: ignore
- parameters=ModelListResponse.get_parameters(),
- responses=ModelListResponse.get_response(),
- tags=[_('Model')]) # type: ignore
- @has_permissions(PermissionConstants.MODEL_READ.get_workspace_permission(),
- PermissionConstants.KNOWLEDGE_READ.get_workspace_permission(),
- PermissionConstants.APPLICATION_READ.get_workspace_permission(),
- PermissionConstants.MODEL_READ.get_workspace_permission_workspace_manage_role(),
- PermissionConstants.KNOWLEDGE_READ.get_workspace_permission_workspace_manage_role(),
- PermissionConstants.APPLICATION_READ.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), RoleConstants.USER.get_workspace_role())
- def get(self, request: Request, workspace_id: str):
- return result.success(
- ModelSerializer.Query(
- data={**query_params_to_single_dict(request.query_params), 'user_id': str(request.user.id)}).model_list(
- workspace_id=workspace_id,
- with_valid=True))
|