2025-04-17 10:01:33 +00:00
|
|
|
|
# coding=utf-8
|
|
|
|
|
|
"""
|
|
|
|
|
|
@project: MaxKB
|
|
|
|
|
|
@Author:虎虎
|
|
|
|
|
|
@file: user.py
|
|
|
|
|
|
@date:2025/4/14 19:25
|
|
|
|
|
|
@desc:
|
|
|
|
|
|
"""
|
2025-06-05 06:08:24 +00:00
|
|
|
|
from django.db.models import QuerySet
|
2025-04-17 10:01:33 +00:00
|
|
|
|
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
|
2025-06-18 09:55:31 +00:00
|
|
|
|
from common.constants.permission_constants import PermissionConstants, RoleConstants
|
2025-06-05 06:08:24 +00:00
|
|
|
|
from common.log.log import log
|
2025-04-28 09:36:56 +00:00
|
|
|
|
from common.result import result
|
2025-04-18 09:45:15 +00:00
|
|
|
|
from common.utils.common import query_params_to_single_dict
|
2025-04-21 02:24:13 +00:00
|
|
|
|
from models_provider.api.model import ModelCreateAPI, GetModelApi, ModelEditApi, ModelListResponse, DefaultModelResponse
|
2025-04-18 09:45:15 +00:00
|
|
|
|
from models_provider.api.provide import ProvideApi
|
2025-06-05 06:08:24 +00:00
|
|
|
|
from models_provider.models import Model
|
2025-06-23 09:21:55 +00:00
|
|
|
|
from models_provider.serializers.model_serializer import ModelSerializer, \
|
2025-06-23 08:43:08 +00:00
|
|
|
|
WorkspaceSharedModelSerializer
|
2025-06-05 06:08:24 +00:00
|
|
|
|
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,
|
2025-06-05 10:37:06 +00:00
|
|
|
|
'body': {**body, 'credential': credential_encryption_ed},
|
2025-06-05 06:08:24 +00:00
|
|
|
|
'query': query
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-06-05 10:37:06 +00:00
|
|
|
|
|
2025-06-05 06:08:24 +00:00
|
|
|
|
def get_model_operation_object(model_id):
|
|
|
|
|
|
model_model = QuerySet(model=Model).filter(id=model_id).first()
|
|
|
|
|
|
if model_model is not None:
|
|
|
|
|
|
return {
|
2025-06-05 10:37:06 +00:00
|
|
|
|
"name": model_model.name
|
2025-06-05 06:08:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
return {}
|
2025-04-17 10:01:33 +00:00
|
|
|
|
|
|
|
|
|
|
|
2025-06-05 10:37:06 +00:00
|
|
|
|
class ModelSetting(APIView):
|
2025-04-17 10:01:33 +00:00
|
|
|
|
authentication_classes = [TokenAuth]
|
|
|
|
|
|
|
|
|
|
|
|
@extend_schema(methods=['POST'],
|
2025-04-28 09:36:56 +00:00
|
|
|
|
summary=_("Create model"),
|
2025-04-17 10:01:33 +00:00
|
|
|
|
description=_("Create model"),
|
2025-05-09 03:29:05 +00:00
|
|
|
|
operation_id=_("Create model"), # type: ignore
|
|
|
|
|
|
tags=[_("Model")], # type: ignore
|
2025-06-09 08:32:16 +00:00
|
|
|
|
parameters=ModelCreateAPI.get_parameters(),
|
2025-04-17 10:01:33 +00:00
|
|
|
|
request=ModelCreateAPI.get_request(),
|
|
|
|
|
|
responses=ModelCreateAPI.get_response())
|
2025-06-18 09:55:31 +00:00
|
|
|
|
@has_permissions(PermissionConstants.MODEL_CREATE.get_workspace_permission(),
|
2025-06-23 08:43:08 +00:00
|
|
|
|
RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), RoleConstants.USER.get_workspace_role())
|
2025-06-05 06:08:24 +00:00
|
|
|
|
@log(menu='model', operate='Create model',
|
2025-06-05 10:37:06 +00:00
|
|
|
|
get_operation_object=lambda r, k: {'name': r.date.get('name')},
|
2025-06-18 09:55:31 +00:00
|
|
|
|
get_details=get_edit_model_details,
|
2025-06-05 06:08:24 +00:00
|
|
|
|
)
|
2025-04-17 10:01:33 +00:00
|
|
|
|
def post(self, request: Request, workspace_id: str):
|
|
|
|
|
|
return result.success(
|
|
|
|
|
|
ModelSerializer.Create(data={**request.data, 'user_id': request.user.id}).insert(workspace_id,
|
|
|
|
|
|
with_valid=True))
|
2025-04-18 09:45:15 +00:00
|
|
|
|
|
|
|
|
|
|
# @extend_schema(methods=['PUT'],
|
2025-04-28 09:36:56 +00:00
|
|
|
|
# summary=_('Update model'),
|
2025-05-09 03:29:05 +00:00
|
|
|
|
# operation_id=_('Update model'), # type: ignore
|
2025-04-18 09:45:15 +00:00
|
|
|
|
# request=ModelEditApi.get_request(),
|
|
|
|
|
|
# responses=ModelCreateApi.get_response(),
|
2025-05-09 03:29:05 +00:00
|
|
|
|
# tags=[_('Model')]) # type: ignore
|
2025-04-18 09:45:15 +00:00
|
|
|
|
# @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'],
|
2025-04-28 09:36:56 +00:00
|
|
|
|
summary=_('Query model list'),
|
2025-04-18 09:45:15 +00:00
|
|
|
|
description=_('Query model list'),
|
2025-05-09 03:29:05 +00:00
|
|
|
|
operation_id=_('Query model list'), # type: ignore
|
2025-06-09 08:32:16 +00:00
|
|
|
|
parameters=ModelListResponse.get_parameters(),
|
2025-04-18 09:45:15 +00:00
|
|
|
|
responses=ModelListResponse.get_response(),
|
2025-05-09 03:29:05 +00:00
|
|
|
|
tags=[_('Model')]) # type: ignore
|
2025-06-18 09:55:31 +00:00
|
|
|
|
@has_permissions(PermissionConstants.MODEL_READ.get_workspace_permission(),
|
2025-06-23 08:43:08 +00:00
|
|
|
|
RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), RoleConstants.USER.get_workspace_role())
|
2025-04-21 01:10:06 +00:00
|
|
|
|
def get(self, request: Request, workspace_id: str):
|
2025-04-18 09:45:15 +00:00
|
|
|
|
return result.success(
|
|
|
|
|
|
ModelSerializer.Query(
|
2025-04-21 01:10:06 +00:00
|
|
|
|
data={**query_params_to_single_dict(request.query_params)}).list(workspace_id=workspace_id,
|
|
|
|
|
|
with_valid=True))
|
2025-04-18 09:45:15 +00:00
|
|
|
|
|
|
|
|
|
|
class Operate(APIView):
|
|
|
|
|
|
authentication_classes = [TokenAuth]
|
|
|
|
|
|
|
|
|
|
|
|
@extend_schema(methods=['PUT'],
|
2025-04-28 09:36:56 +00:00
|
|
|
|
summary=_('Update model'),
|
2025-04-18 09:45:15 +00:00
|
|
|
|
description=_('Update model'),
|
2025-05-09 03:29:05 +00:00
|
|
|
|
operation_id=_('Update model'), # type: ignore
|
2025-04-18 09:45:15 +00:00
|
|
|
|
request=ModelEditApi.get_request(),
|
2025-06-09 08:32:16 +00:00
|
|
|
|
parameters=GetModelApi.get_parameters(),
|
2025-04-18 09:45:15 +00:00
|
|
|
|
responses=ModelEditApi.get_response(),
|
2025-05-09 03:29:05 +00:00
|
|
|
|
tags=[_('Model')]) # type: ignore
|
2025-06-18 09:55:31 +00:00
|
|
|
|
@has_permissions(PermissionConstants.MODEL_EDIT.get_workspace_permission(),
|
2025-06-23 08:43:08 +00:00
|
|
|
|
RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), RoleConstants.USER.get_workspace_role())
|
2025-06-05 06:08:24 +00:00
|
|
|
|
@log(menu='model', operate='Update model',
|
2025-06-05 10:37:06 +00:00
|
|
|
|
get_operation_object=lambda r, k: get_model_operation_object(k.get('model_id')),
|
2025-06-18 09:55:31 +00:00
|
|
|
|
get_details=get_edit_model_details,
|
2025-06-05 06:08:24 +00:00
|
|
|
|
)
|
2025-04-18 09:45:15 +00:00
|
|
|
|
def put(self, request: Request, workspace_id, model_id: str):
|
|
|
|
|
|
return result.success(
|
2025-06-20 02:40:51 +00:00
|
|
|
|
ModelSerializer.Operate(
|
|
|
|
|
|
data={'id': model_id, 'user_id': request.user.id, 'workspace_id': workspace_id}).edit(request.data,
|
|
|
|
|
|
str(request.user.id)))
|
2025-04-18 09:45:15 +00:00
|
|
|
|
|
|
|
|
|
|
@extend_schema(methods=['DELETE'],
|
2025-04-28 09:36:56 +00:00
|
|
|
|
summary=_('Delete model'),
|
2025-04-18 09:45:15 +00:00
|
|
|
|
description=_('Delete model'),
|
2025-05-09 03:29:05 +00:00
|
|
|
|
operation_id=_('Delete model'), # type: ignore
|
2025-06-09 08:32:16 +00:00
|
|
|
|
parameters=GetModelApi.get_parameters(),
|
2025-04-21 02:24:13 +00:00
|
|
|
|
responses=DefaultModelResponse.get_response(),
|
2025-05-09 03:29:05 +00:00
|
|
|
|
tags=[_('Model')]) # type: ignore
|
2025-06-18 09:55:31 +00:00
|
|
|
|
@has_permissions(PermissionConstants.MODEL_DELETE.get_workspace_permission(),
|
2025-06-23 08:43:08 +00:00
|
|
|
|
RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), RoleConstants.USER.get_workspace_role())
|
2025-06-05 06:08:24 +00:00
|
|
|
|
@log(menu='model', operate='Delete model',
|
2025-06-10 06:50:25 +00:00
|
|
|
|
get_operation_object=lambda r, k: get_model_operation_object(k.get('model_id')),
|
2025-06-16 08:31:28 +00:00
|
|
|
|
)
|
2025-04-18 09:45:15 +00:00
|
|
|
|
def delete(self, request: Request, workspace_id: str, model_id: str):
|
|
|
|
|
|
return result.success(
|
2025-06-20 02:40:51 +00:00
|
|
|
|
ModelSerializer.Operate(
|
|
|
|
|
|
data={'id': model_id, 'user_id': request.user.id, 'workspace_id': workspace_id}).delete())
|
2025-04-18 09:45:15 +00:00
|
|
|
|
|
|
|
|
|
|
@extend_schema(methods=['GET'],
|
2025-04-28 09:36:56 +00:00
|
|
|
|
summary=_('Query model details'),
|
2025-04-18 09:45:15 +00:00
|
|
|
|
description=_('Query model details'),
|
2025-05-09 03:29:05 +00:00
|
|
|
|
operation_id=_('Query model details'), # type: ignore
|
2025-06-09 08:32:16 +00:00
|
|
|
|
parameters=GetModelApi.get_parameters(),
|
2025-04-18 09:45:15 +00:00
|
|
|
|
responses=GetModelApi.get_response(),
|
2025-05-09 03:29:05 +00:00
|
|
|
|
tags=[_('Model')]) # type: ignore
|
2025-06-18 09:55:31 +00:00
|
|
|
|
@has_permissions(PermissionConstants.MODEL_READ.get_workspace_permission(),
|
2025-06-23 08:43:08 +00:00
|
|
|
|
RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), RoleConstants.USER.get_workspace_role())
|
2025-04-18 09:45:15 +00:00
|
|
|
|
def get(self, request: Request, workspace_id: str, model_id: str):
|
|
|
|
|
|
return result.success(
|
2025-06-20 02:40:51 +00:00
|
|
|
|
ModelSerializer.Operate(
|
|
|
|
|
|
data={'id': model_id, 'user_id': request.user.id, 'workspace_id': workspace_id}).one(
|
|
|
|
|
|
with_valid=True))
|
2025-04-18 09:45:15 +00:00
|
|
|
|
|
|
|
|
|
|
class ModelParamsForm(APIView):
|
|
|
|
|
|
authentication_classes = [TokenAuth]
|
|
|
|
|
|
|
|
|
|
|
|
@extend_schema(methods=['GET'],
|
2025-04-28 09:36:56 +00:00
|
|
|
|
summary=_('Get model parameter form'),
|
2025-04-18 09:45:15 +00:00
|
|
|
|
description=_('Get model parameter form'),
|
2025-05-09 03:29:05 +00:00
|
|
|
|
operation_id=_('Get model parameter form'), # type: ignore
|
2025-06-09 08:32:16 +00:00
|
|
|
|
parameters=GetModelApi.get_parameters(),
|
2025-04-18 09:45:15 +00:00
|
|
|
|
responses=ProvideApi.ModelParamsForm.get_response(),
|
2025-05-09 03:29:05 +00:00
|
|
|
|
tags=[_('Model')]) # type: ignore
|
2025-06-18 09:55:31 +00:00
|
|
|
|
@has_permissions(PermissionConstants.MODEL_READ.get_workspace_permission(),
|
2025-06-23 08:43:08 +00:00
|
|
|
|
RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), RoleConstants.USER.get_workspace_role())
|
2025-04-18 09:45:15 +00:00
|
|
|
|
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'],
|
2025-04-28 09:36:56 +00:00
|
|
|
|
summary=_('Save model parameter form'),
|
2025-04-18 09:45:15 +00:00
|
|
|
|
description=_('Save model parameter form'),
|
2025-05-09 03:29:05 +00:00
|
|
|
|
operation_id=_('Save model parameter form'), # type: ignore
|
2025-06-09 08:32:16 +00:00
|
|
|
|
parameters=GetModelApi.get_parameters(),
|
2025-04-24 05:42:58 +00:00
|
|
|
|
request=GetModelApi.get_request(),
|
2025-04-18 09:45:15 +00:00
|
|
|
|
responses=ProvideApi.ModelParamsForm.get_response(),
|
2025-05-09 03:29:05 +00:00
|
|
|
|
tags=[_('Model')]) # type: ignore
|
2025-06-18 09:55:31 +00:00
|
|
|
|
@has_permissions(PermissionConstants.MODEL_READ.get_workspace_permission(),
|
2025-06-23 08:43:08 +00:00
|
|
|
|
RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), RoleConstants.USER.get_workspace_role())
|
2025-06-05 06:08:24 +00:00
|
|
|
|
@log(menu='model', operate='Save model parameter form',
|
2025-06-10 06:50:25 +00:00
|
|
|
|
get_operation_object=lambda r, k: get_model_operation_object(k.get('model_id')),
|
2025-06-16 08:31:28 +00:00
|
|
|
|
)
|
2025-04-18 09:45:15 +00:00
|
|
|
|
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'],
|
2025-04-28 09:36:56 +00:00
|
|
|
|
summary=_(
|
|
|
|
|
|
'Query model meta information, this interface does not carry authentication information'),
|
2025-04-18 09:45:15 +00:00
|
|
|
|
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'),
|
2025-06-09 08:32:16 +00:00
|
|
|
|
parameters=GetModelApi.get_parameters(),
|
2025-04-18 09:45:15 +00:00
|
|
|
|
responses=GetModelApi.get_response(),
|
2025-05-09 03:29:05 +00:00
|
|
|
|
tags=[_('Model')]) # type: ignore
|
2025-06-18 09:55:31 +00:00
|
|
|
|
@has_permissions(PermissionConstants.MODEL_READ.get_workspace_permission(),
|
2025-06-23 08:43:08 +00:00
|
|
|
|
RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), RoleConstants.USER.get_workspace_role())
|
2025-04-18 09:45:15 +00:00
|
|
|
|
def get(self, request: Request, workspace_id: str, model_id: str):
|
|
|
|
|
|
return result.success(
|
2025-06-20 02:40:51 +00:00
|
|
|
|
ModelSerializer.Operate(data={'id': model_id, 'workspace_id': workspace_id}).one_meta(with_valid=True))
|
2025-04-18 09:45:15 +00:00
|
|
|
|
|
|
|
|
|
|
class PauseDownload(APIView):
|
|
|
|
|
|
authentication_classes = [TokenAuth]
|
|
|
|
|
|
|
|
|
|
|
|
@extend_schema(methods=['PUT'],
|
2025-04-28 09:36:56 +00:00
|
|
|
|
summary=_('Pause model download'),
|
2025-04-18 09:45:15 +00:00
|
|
|
|
description=_('Pause model download'),
|
2025-05-09 03:29:05 +00:00
|
|
|
|
operation_id=_('Pause model download'), # type: ignore
|
2025-06-09 08:32:16 +00:00
|
|
|
|
parameters=GetModelApi.get_parameters(),
|
2025-04-24 05:42:58 +00:00
|
|
|
|
request=GetModelApi.get_request(),
|
2025-04-21 02:24:13 +00:00
|
|
|
|
responses=DefaultModelResponse.get_response(),
|
2025-05-09 03:29:05 +00:00
|
|
|
|
tags=[_('Model')]) # type: ignore
|
2025-06-18 09:55:31 +00:00
|
|
|
|
@has_permissions(PermissionConstants.MODEL_CREATE.get_workspace_permission(),
|
2025-06-23 08:43:08 +00:00
|
|
|
|
RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), RoleConstants.USER.get_workspace_role())
|
2025-04-18 09:45:15 +00:00
|
|
|
|
def put(self, request: Request, workspace_id: str, model_id: str):
|
|
|
|
|
|
return result.success(
|
2025-06-20 02:40:51 +00:00
|
|
|
|
ModelSerializer.Operate(data={'id': model_id, 'workspace_id': workspace_id}).pause_download())
|
2025-06-16 13:04:46 +00:00
|
|
|
|
|
|
|
|
|
|
|
2025-06-23 08:43:08 +00:00
|
|
|
|
class WorkspaceSharedModelSetting(APIView):
|
2025-06-16 13:04:46 +00:00
|
|
|
|
authentication_classes = [TokenAuth]
|
|
|
|
|
|
|
|
|
|
|
|
@extend_schema(
|
|
|
|
|
|
methods=['Get'],
|
2025-06-23 08:43:08 +00:00
|
|
|
|
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(),
|
2025-06-16 13:04:46 +00:00
|
|
|
|
tags=[_('Shared Model')]
|
|
|
|
|
|
) # type: ignore
|
2025-06-23 08:43:08 +00:00
|
|
|
|
@has_permissions(
|
|
|
|
|
|
PermissionConstants.MODEL_READ.get_workspace_permission(),
|
|
|
|
|
|
RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
|
|
|
|
|
|
RoleConstants.USER.get_workspace_role(),
|
|
|
|
|
|
)
|
2025-06-16 13:04:46 +00:00
|
|
|
|
def get(self, request: Request, workspace_id: str):
|
|
|
|
|
|
return result.success(
|
2025-06-23 08:43:08 +00:00
|
|
|
|
WorkspaceSharedModelSerializer(data={'workspace_id': workspace_id}).get_share_model_list())
|
2025-06-23 09:06:19 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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(),
|
|
|
|
|
|
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)}).model_list(workspace_id=workspace_id,
|
|
|
|
|
|
with_valid=True))
|