feat: System operate log

This commit is contained in:
zhangzhanwei 2025-06-05 14:08:24 +08:00 committed by zhanweizhang7
parent 09dfedac9b
commit e63572b89b
19 changed files with 474 additions and 2 deletions

View File

@ -6,6 +6,7 @@
@date2025/5/26 16:51 @date2025/5/26 16:51
@desc: @desc:
""" """
from django.db.models import QuerySet
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from drf_spectacular.utils import extend_schema from drf_spectacular.utils import extend_schema
from rest_framework.parsers import MultiPartParser from rest_framework.parsers import MultiPartParser
@ -14,11 +15,22 @@ from rest_framework.views import APIView
from application.api.application_api import ApplicationCreateAPI, ApplicationQueryAPI, ApplicationImportAPI, \ from application.api.application_api import ApplicationCreateAPI, ApplicationQueryAPI, ApplicationImportAPI, \
ApplicationExportAPI, ApplicationOperateAPI, ApplicationEditAPI ApplicationExportAPI, ApplicationOperateAPI, ApplicationEditAPI
from application.models import Application
from application.serializers.application import ApplicationSerializer, Query, ApplicationOperateSerializer from application.serializers.application import ApplicationSerializer, Query, ApplicationOperateSerializer
from common import result from common import result
from common.auth import TokenAuth from common.auth import TokenAuth
from common.auth.authentication import has_permissions from common.auth.authentication import has_permissions
from common.constants.permission_constants import PermissionConstants from common.constants.permission_constants import PermissionConstants
from common.log.log import log
def get_application_operation_object(application_id):
application_model = QuerySet(model=Application).filter(id=application_id).first()
if application_model is not None:
return{
'name': application_model.name
}
return {}
class Application(APIView): class Application(APIView):
@ -35,6 +47,8 @@ class Application(APIView):
tags=[_('Application')] # type: ignore tags=[_('Application')] # type: ignore
) )
@has_permissions(PermissionConstants.APPLICATION_READ.get_workspace_permission()) @has_permissions(PermissionConstants.APPLICATION_READ.get_workspace_permission())
@log(menu='Application', operate='Create an application',
get_operation_object=lambda r,k: {'name': r.data.get('name')})
def post(self, request: Request, workspace_id: str): def post(self, request: Request, workspace_id: str):
return result.success( return result.success(
ApplicationSerializer(data={'workspace_id': workspace_id, 'user_id': request.user.id}).insert(request.data)) ApplicationSerializer(data={'workspace_id': workspace_id, 'user_id': request.user.id}).insert(request.data))
@ -85,11 +99,14 @@ class Application(APIView):
tags=[_('Application')] # type: ignore tags=[_('Application')] # type: ignore
) )
@has_permissions(PermissionConstants.APPLICATION_READ) @has_permissions(PermissionConstants.APPLICATION_READ)
@log(menu='Application', operate="Import Application")
def post(self, request: Request, workspace_id: str): def post(self, request: Request, workspace_id: str):
return result.success(ApplicationSerializer( return result.success(ApplicationSerializer(
data={'user_id': request.user.id, 'workspace_id': workspace_id, data={'user_id': request.user.id, 'workspace_id': workspace_id,
}).import_({'file': request.FILES.get('file')})) }).import_({'file': request.FILES.get('file')}))
class Export(APIView): class Export(APIView):
authentication_classes = [TokenAuth] authentication_classes = [TokenAuth]
@ -104,6 +121,8 @@ class Application(APIView):
tags=[_('Application')] # type: ignore tags=[_('Application')] # type: ignore
) )
@has_permissions(PermissionConstants.APPLICATION_EXPORT.get_workspace_application_permission()) @has_permissions(PermissionConstants.APPLICATION_EXPORT.get_workspace_application_permission())
@log(menu='Application', operate="Export Application",
get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id')))
def post(self, request: Request, workspace_id: str, application_id: str): def post(self, request: Request, workspace_id: str, application_id: str):
return ApplicationOperateSerializer( return ApplicationOperateSerializer(
data={'application_id': application_id, data={'application_id': application_id,
@ -122,6 +141,9 @@ class Application(APIView):
tags=[_('Application')] # type: ignore tags=[_('Application')] # type: ignore
) )
@has_permissions(PermissionConstants.APPLICATION_DELETE.get_workspace_application_permission()) @has_permissions(PermissionConstants.APPLICATION_DELETE.get_workspace_application_permission())
@log(menu='Application', operate='Deleting application',
get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id'))
)
def delete(self, request: Request, workspace_id: str, application_id: str): def delete(self, request: Request, workspace_id: str, application_id: str):
return result.success(ApplicationOperateSerializer( return result.success(ApplicationOperateSerializer(
data={'application_id': application_id, 'user_id': request.user.id}).delete( data={'application_id': application_id, 'user_id': request.user.id}).delete(
@ -138,6 +160,8 @@ class Application(APIView):
tags=[_('Application')] # type: ignore tags=[_('Application')] # type: ignore
) )
@has_permissions(PermissionConstants.APPLICATION_EDIT.get_workspace_application_permission()) @has_permissions(PermissionConstants.APPLICATION_EDIT.get_workspace_application_permission())
@log(menu='Application', operate="Modify the application",
get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id')))
def put(self, request: Request, workspace_id: str, application_id: str): def put(self, request: Request, workspace_id: str, application_id: str):
return result.success( return result.success(
ApplicationOperateSerializer( ApplicationOperateSerializer(
@ -172,6 +196,9 @@ class Application(APIView):
responses=result.DefaultResultSerializer, responses=result.DefaultResultSerializer,
tags=[_('Application')] # type: ignore tags=[_('Application')] # type: ignore
) )
@log(menu='Application', operate='Publishing an application',
get_operation_object=lambda r,k: get_application_operation_object(k.get('application_id'))
)
def put(self, request: Request, application_id: str): def put(self, request: Request, application_id: str):
return result.success( return result.success(
ApplicationOperateSerializer( ApplicationOperateSerializer(

View File

@ -1,14 +1,26 @@
from django.db.models import QuerySet
from drf_spectacular.utils import extend_schema from drf_spectacular.utils import extend_schema
from rest_framework.request import Request from rest_framework.request import Request
from rest_framework.views import APIView from rest_framework.views import APIView
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from application.api.application_api_key import ApplicationKeyCreateAPI from application.api.application_api_key import ApplicationKeyCreateAPI
from application.models import ApplicationApiKey
from application.serializers.application_api_key import ApplicationKeySerializer from application.serializers.application_api_key import ApplicationKeySerializer
from common.auth import TokenAuth from common.auth import TokenAuth
from common.log.log import log
from common.result import result, success from common.result import result, success
def get_application_operation_object(application_api_key_id):
application_api_key_model = QuerySet(model=ApplicationApiKey).filter(id=application_api_key_id).first()
if application_api_key_model is not None:
return {
"name": application_api_key_model.name
}
return {}
class ApplicationKey(APIView): class ApplicationKey(APIView):
authentication_classes = [TokenAuth] authentication_classes = [TokenAuth]
@ -20,6 +32,8 @@ class ApplicationKey(APIView):
parameters=ApplicationKeyCreateAPI.get_parameters(), parameters=ApplicationKeyCreateAPI.get_parameters(),
tags=[_('Application Api Key')] # type: ignore tags=[_('Application Api Key')] # type: ignore
) )
@log(menu='Application', operate="Add ApiKey",
get_operation_object=lambda r, k: get_application_operation_object(k.get('application_api_key_id')))
def post(self,request: Request, application_id: str, workspace_id: str): def post(self,request: Request, application_id: str, workspace_id: str):
return result.success(ApplicationKeySerializer( return result.success(ApplicationKeySerializer(
data={'application_id': application_id, 'user_id': request.user.id, data={'application_id': application_id, 'user_id': request.user.id,

View File

@ -14,10 +14,12 @@ from rest_framework.views import APIView
from application.api.application_version import ApplicationVersionListAPI, ApplicationVersionPageAPI, \ from application.api.application_version import ApplicationVersionListAPI, ApplicationVersionPageAPI, \
ApplicationVersionAPI, ApplicationVersionOperateAPI ApplicationVersionAPI, ApplicationVersionOperateAPI
from application.serializers.application_version import ApplicationVersionSerializer from application.serializers.application_version import ApplicationVersionSerializer
from application.views import get_application_operation_object
from common import result from common import result
from common.auth import TokenAuth from common.auth import TokenAuth
from common.auth.authentication import has_permissions from common.auth.authentication import has_permissions
from common.constants.permission_constants import PermissionConstants from common.constants.permission_constants import PermissionConstants
from common.log.log import log
class ApplicationVersionView(APIView): class ApplicationVersionView(APIView):
@ -88,6 +90,8 @@ class ApplicationVersionView(APIView):
responses=ApplicationVersionOperateAPI.get_response(), responses=ApplicationVersionOperateAPI.get_response(),
tags=[_('Application/Version')] # type: ignore tags=[_('Application/Version')] # type: ignore
) )
@log(menu='Application', operate="Modify application version information",
get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id')))
def put(self, request: Request, workspace_id: str, application_id: str, work_flow_version_id: str): def put(self, request: Request, workspace_id: str, application_id: str, work_flow_version_id: str):
return result.success( return result.success(
ApplicationVersionSerializer.Operate( ApplicationVersionSerializer.Operate(

View File

@ -1,3 +1,4 @@
from django.db.models import QuerySet
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from drf_spectacular.utils import extend_schema from drf_spectacular.utils import extend_schema
from rest_framework.request import Request from rest_framework.request import Request
@ -6,11 +7,29 @@ from rest_framework.views import APIView
from common.auth import TokenAuth from common.auth import TokenAuth
from common.auth.authentication import has_permissions from common.auth.authentication import has_permissions
from common.constants.permission_constants import Permission, Group, Operate from common.constants.permission_constants import Permission, Group, Operate
from common.log.log import log
from common.result import result from common.result import result
from folders.api.folder import FolderCreateAPI, FolderEditAPI, FolderReadAPI, FolderTreeReadAPI, FolderDeleteAPI from folders.api.folder import FolderCreateAPI, FolderEditAPI, FolderReadAPI, FolderTreeReadAPI, FolderDeleteAPI
from folders.models.folder import FolderCreateRequest, FolderEditRequest
from folders.serializers.folder import FolderSerializer, FolderTreeSerializer from folders.serializers.folder import FolderSerializer, FolderTreeSerializer
def get_folder_create_operation_object(folder_name):
folder_model = QuerySet(model=FolderCreateRequest).filter(name=folder_name).first()
if folder_model is not None:
return {
'name': folder_model.name
}
return {}
def get_folder_edit_operation_object(folder_name):
folder_model = QuerySet(model=FolderEditRequest).filter(name=folder_name).first()
if folder_model is not None:
return {
'name': folder_model.name
}
return {}
class FolderView(APIView): class FolderView(APIView):
authentication_classes = [TokenAuth] authentication_classes = [TokenAuth]
@ -26,6 +45,9 @@ class FolderView(APIView):
) )
@has_permissions(lambda r, kwargs: Permission(group=Group(kwargs.get('source')), operate=Operate.CREATE, @has_permissions(lambda r, kwargs: Permission(group=Group(kwargs.get('source')), operate=Operate.CREATE,
resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}")) resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}"))
@log(menu='folder', operate='Create folder',
get_operation_object=lambda r,k: get_folder_create_operation_object(k.get('folder_name'))
)
def post(self, request: Request, workspace_id: str, source: str): def post(self, request: Request, workspace_id: str, source: str):
return result.success(FolderSerializer.Create( return result.success(FolderSerializer.Create(
data={'user_id': request.user.id, data={'user_id': request.user.id,
@ -64,6 +86,9 @@ class FolderView(APIView):
) )
@has_permissions(lambda r, kwargs: Permission(group=Group(kwargs.get('source')), operate=Operate.EDIT, @has_permissions(lambda r, kwargs: Permission(group=Group(kwargs.get('source')), operate=Operate.EDIT,
resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}")) resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}"))
@log(menu='folder', operate='Edit folder',
get_operation_object=lambda r, k: get_folder_edit_operation_object(k.get('folder_name'))
)
def put(self, request: Request, workspace_id: str, source: str, folder_id: str): def put(self, request: Request, workspace_id: str, source: str, folder_id: str):
return result.success(FolderSerializer.Operate( return result.success(FolderSerializer.Operate(
data={'id': folder_id, 'workspace_id': workspace_id, 'source': source} data={'id': folder_id, 'workspace_id': workspace_id, 'source': source}
@ -96,6 +121,7 @@ class FolderView(APIView):
) )
@has_permissions(lambda r, kwargs: Permission(group=Group(kwargs.get('source')), operate=Operate.DELETE, @has_permissions(lambda r, kwargs: Permission(group=Group(kwargs.get('source')), operate=Operate.DELETE,
resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}")) resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}"))
@log(menu='folder', operate='Delete folder')
def delete(self, request: Request, workspace_id: str, source: str, folder_id: str): def delete(self, request: Request, workspace_id: str, source: str, folder_id: str):
return result.success(FolderSerializer.Operate( return result.success(FolderSerializer.Operate(
data={'id': folder_id, 'workspace_id': workspace_id, 'source': source} data={'id': folder_id, 'workspace_id': workspace_id, 'source': source}

View File

@ -221,3 +221,17 @@ def or_get(exists_problem_list, content, knowledge_id, document_id, paragraph_id
problem = Problem(id=uuid.uuid7(), content=content, knowledge_id=knowledge_id) problem = Problem(id=uuid.uuid7(), content=content, knowledge_id=knowledge_id)
problem_content_dict[content] = problem, True problem_content_dict[content] = problem, True
return problem, document_id, paragraph_id return problem, document_id, paragraph_id
def get_knowledge_operation_object(knowledge_id: str):
knowledge_model = QuerySet(model=Knowledge).filter(id=knowledge_id).first()
if knowledge_model is not None:
return {
"name": knowledge_model.name,
"desc": knowledge_model.desc,
"type": knowledge_model.type,
"create_time": knowledge_model.create_time,
"update_time": knowledge_model.update_time
}
return {}

View File

@ -0,0 +1,35 @@
from django.db.models import QuerySet
from knowledge.models import Document
def get_document_operation_object(document_id: str):
document_model = QuerySet(model=Document).filter(id=document_id).first()
if document_model is not None:
return {
"name": document_model.name,
"type": document_model.type,
}
return {}
def get_document_operation_object_batch(document_id_list: str):
document_model_list = QuerySet(model=Document).filter(id__in=document_id_list)
if document_model_list is not None:
return {
"name": f'[{",".join([document_model.name for document_model in document_model_list])}]',
'document_list': [{'name': document_model.name, 'type': document_model.type} for document_model in
document_model_list]
}
return {}
def get_knowledge_document_operation_object(knowledge_dict: dict, document_dict: dict):
return {
'name': f'{knowledge_dict.get("name", "")}/{document_dict.get("name", "")}',
'dataset_name': knowledge_dict.get("name", ""),
'dataset_desc': knowledge_dict.get("desc", ""),
'dataset_type': knowledge_dict.get("type", ""),
'document_name': document_dict.get("name", ""),
'document_type': document_dict.get("type", ""),
}

View File

@ -7,13 +7,17 @@ from rest_framework.views import APIView
from common.auth import TokenAuth from common.auth import TokenAuth
from common.auth.authentication import has_permissions from common.auth.authentication import has_permissions
from common.constants.permission_constants import PermissionConstants from common.constants.permission_constants import PermissionConstants
from common.log.log import log
from common.result import result from common.result import result
from knowledge.api.document import DocumentSplitAPI, DocumentBatchAPI, DocumentBatchCreateAPI, DocumentCreateAPI, \ from knowledge.api.document import DocumentSplitAPI, DocumentBatchAPI, DocumentBatchCreateAPI, DocumentCreateAPI, \
DocumentReadAPI, DocumentEditAPI, DocumentDeleteAPI, TableDocumentCreateAPI, QaDocumentCreateAPI, \ DocumentReadAPI, DocumentEditAPI, DocumentDeleteAPI, TableDocumentCreateAPI, QaDocumentCreateAPI, \
WebDocumentCreateAPI, CancelTaskAPI, BatchCancelTaskAPI, SyncWebAPI, RefreshAPI, BatchEditHitHandlingAPI, \ WebDocumentCreateAPI, CancelTaskAPI, BatchCancelTaskAPI, SyncWebAPI, RefreshAPI, BatchEditHitHandlingAPI, \
DocumentTreeReadAPI, DocumentSplitPatternAPI, BatchRefreshAPI, BatchGenerateRelatedAPI, TemplateExportAPI, \ DocumentTreeReadAPI, DocumentSplitPatternAPI, BatchRefreshAPI, BatchGenerateRelatedAPI, TemplateExportAPI, \
DocumentExportAPI, DocumentMigrateAPI, DocumentDownloadSourceAPI DocumentExportAPI, DocumentMigrateAPI, DocumentDownloadSourceAPI
from knowledge.serializers.common import get_knowledge_operation_object
from knowledge.serializers.document import DocumentSerializers from knowledge.serializers.document import DocumentSerializers
from knowledge.views.common import get_knowledge_document_operation_object, get_document_operation_object_batch, \
get_document_operation_object
class DocumentView(APIView): class DocumentView(APIView):
@ -30,6 +34,10 @@ class DocumentView(APIView):
tags=[_('Knowledge Base/Documentation')] # type: ignore tags=[_('Knowledge Base/Documentation')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_CREATE.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_CREATE.get_workspace_knowledge_permission())
@log(menu='document', operate="Create document",
get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
get_knowledge_operation_object(keywords.get('knowledge_id')),
{'name': r.data.get('name')}))
def post(self, request: Request, workspace_id: str, knowledge_id: str): def post(self, request: Request, workspace_id: str, knowledge_id: str):
return result.success( return result.success(
DocumentSerializers.Create( DocumentSerializers.Create(
@ -87,6 +95,12 @@ class DocumentView(APIView):
tags=[_('Knowledge Base/Documentation')] # type: ignore tags=[_('Knowledge Base/Documentation')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission())
@log(menu='document', operate="Modify document",
get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
get_knowledge_operation_object(keywords.get('knowledge_id')),
get_document_operation_object(keywords.get('document_id'))
)
)
def put(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str): def put(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str):
return result.success(DocumentSerializers.Operate(data={ return result.success(DocumentSerializers.Operate(data={
'document_id': document_id, 'knowledge_id': knowledge_id, 'workspace_id': workspace_id 'document_id': document_id, 'knowledge_id': knowledge_id, 'workspace_id': workspace_id
@ -101,6 +115,12 @@ class DocumentView(APIView):
tags=[_('Knowledge Base/Documentation')] # type: ignore tags=[_('Knowledge Base/Documentation')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_DELETE.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_DELETE.get_workspace_knowledge_permission())
@log(menu='document', operate="Delete document",
get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
get_knowledge_operation_object(keywords.get('knowledge_id')),
get_document_operation_object(keywords.get('document_id'))
)
)
def delete(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str): def delete(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str):
operate = DocumentSerializers.Operate(data={ operate = DocumentSerializers.Operate(data={
'document_id': document_id, 'knowledge_id': knowledge_id, 'workspace_id': workspace_id 'document_id': document_id, 'knowledge_id': knowledge_id, 'workspace_id': workspace_id
@ -171,6 +191,10 @@ class DocumentView(APIView):
tags=[_('Knowledge Base/Documentation')] # type: ignore tags=[_('Knowledge Base/Documentation')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission())
@log(menu='document', operate="Modify document hit processing methods in batches",
get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
get_knowledge_operation_object(keywords.get('knowledge_id')),
get_document_operation_object_batch(r.data.get('id_list'))))
def put(self, request: Request, workspace_id: str, knowledge_id: str): def put(self, request: Request, workspace_id: str, knowledge_id: str):
return result.success(DocumentSerializers.Batch( return result.success(DocumentSerializers.Batch(
data={'knowledge_id': knowledge_id, 'workspace_id': workspace_id} data={'knowledge_id': knowledge_id, 'workspace_id': workspace_id}
@ -190,6 +214,11 @@ class DocumentView(APIView):
tags=[_('Knowledge Base/Documentation')] # type: ignore tags=[_('Knowledge Base/Documentation')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_SYNC.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_SYNC.get_workspace_knowledge_permission())
@log(menu='document', operate="Synchronize web site types",
get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
get_knowledge_operation_object(keywords.get('knowledge_id')),
get_document_operation_object(keywords.get('document_id'))
))
def get(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str): def get(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str):
return result.success(DocumentSerializers.Sync( return result.success(DocumentSerializers.Sync(
data={'document_id': document_id, 'knowledge_id': knowledge_id, 'workspace_id': workspace_id} data={'document_id': document_id, 'knowledge_id': knowledge_id, 'workspace_id': workspace_id}
@ -209,6 +238,12 @@ class DocumentView(APIView):
tags=[_('Knowledge Base/Documentation')] # type: ignore tags=[_('Knowledge Base/Documentation')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_VECTOR.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_VECTOR.get_workspace_knowledge_permission())
@log(menu='document', operate="Refresh document vector library",
get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
get_knowledge_operation_object(keywords.get('knowledge_id')),
get_document_operation_object(keywords.get('document_id'))
)
)
def put(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str): def put(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str):
return result.success(DocumentSerializers.Operate( return result.success(DocumentSerializers.Operate(
data={'document_id': document_id, 'knowledge_id': knowledge_id, 'workspace_id': workspace_id} data={'document_id': document_id, 'knowledge_id': knowledge_id, 'workspace_id': workspace_id}
@ -227,6 +262,11 @@ class DocumentView(APIView):
tags=[_('Knowledge Base/Documentation')] # type: ignore tags=[_('Knowledge Base/Documentation')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission())
@log(menu='document', operate="Cancel task",
get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
get_knowledge_operation_object(keywords.get('knowledge_id')),
get_document_operation_object(keywords.get('document_id'))
))
def put(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str): def put(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str):
return result.success(DocumentSerializers.Operate( return result.success(DocumentSerializers.Operate(
data={'document_id': document_id, 'knowledge_id': knowledge_id, 'workspace_id': workspace_id} data={'document_id': document_id, 'knowledge_id': knowledge_id, 'workspace_id': workspace_id}
@ -245,6 +285,12 @@ class DocumentView(APIView):
tags=[_('Knowledge Base/Documentation')] # type: ignore tags=[_('Knowledge Base/Documentation')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission())
@log(menu='document', operate="Cancel tasks in batches",
get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
get_knowledge_operation_object(keywords.get('knowledge_id')),
get_document_operation_object_batch(r.data.get('id_list'))
)
)
def put(self, request: Request, workspace_id: str, knowledge_id: str): def put(self, request: Request, workspace_id: str, knowledge_id: str):
return result.success(DocumentSerializers.Batch(data={ return result.success(DocumentSerializers.Batch(data={
'knowledge_id': knowledge_id, 'workspace_id': workspace_id} 'knowledge_id': knowledge_id, 'workspace_id': workspace_id}
@ -267,6 +313,12 @@ class DocumentView(APIView):
PermissionConstants.KNOWLEDGE_DOCUMENT_CREATE.get_workspace_knowledge_permission(), PermissionConstants.KNOWLEDGE_DOCUMENT_CREATE.get_workspace_knowledge_permission(),
PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission(), PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission(),
) )
@log(menu='document', operate="Create documents in batches",
get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
get_knowledge_operation_object(keywords.get('knowledge_id')),
{'name': f'[{",".join([document.get("name") for document in r.data])}]',
'document_list': r.data})
)
def put(self, request: Request, workspace_id: str, knowledge_id: str): def put(self, request: Request, workspace_id: str, knowledge_id: str):
return result.success(DocumentSerializers.Batch( return result.success(DocumentSerializers.Batch(
data={'knowledge_id': knowledge_id, 'workspace_id': workspace_id} data={'knowledge_id': knowledge_id, 'workspace_id': workspace_id}
@ -289,6 +341,11 @@ class DocumentView(APIView):
PermissionConstants.KNOWLEDGE_DOCUMENT_SYNC.get_workspace_knowledge_permission(), PermissionConstants.KNOWLEDGE_DOCUMENT_SYNC.get_workspace_knowledge_permission(),
PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission(), PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission(),
) )
@log(menu='document', operate="Batch sync documents",
get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
get_knowledge_operation_object(keywords.get('knowledge_id')),
get_document_operation_object_batch(r.data.get('id_list')))
)
def put(self, request: Request, workspace_id: str, knowledge_id: str): def put(self, request: Request, workspace_id: str, knowledge_id: str):
return result.success(DocumentSerializers.Batch( return result.success(DocumentSerializers.Batch(
data={'knowledge_id': knowledge_id, 'workspace_id': workspace_id} data={'knowledge_id': knowledge_id, 'workspace_id': workspace_id}
@ -311,6 +368,10 @@ class DocumentView(APIView):
PermissionConstants.KNOWLEDGE_DOCUMENT_DELETE.get_workspace_knowledge_permission(), PermissionConstants.KNOWLEDGE_DOCUMENT_DELETE.get_workspace_knowledge_permission(),
PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission(), PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission(),
) )
@log(menu='document', operate="Delete documents in batches",
get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
get_knowledge_operation_object(keywords.get('knowledge_id')),
get_document_operation_object_batch(r.data.get('id_list'))))
def put(self, request: Request, workspace_id: str, knowledge_id: str): def put(self, request: Request, workspace_id: str, knowledge_id: str):
return result.success(DocumentSerializers.Batch( return result.success(DocumentSerializers.Batch(
data={'workspace_id': workspace_id, 'knowledge_id': knowledge_id} data={'workspace_id': workspace_id, 'knowledge_id': knowledge_id}
@ -332,6 +393,12 @@ class DocumentView(APIView):
PermissionConstants.KNOWLEDGE_DOCUMENT_VECTOR.get_workspace_knowledge_permission(), PermissionConstants.KNOWLEDGE_DOCUMENT_VECTOR.get_workspace_knowledge_permission(),
PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission(), PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission(),
) )
@log(menu='document', operate="Batch refresh document vector library",
get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
get_knowledge_operation_object(keywords.get('knowledge_id')),
get_document_operation_object_batch(r.data.get('id_list'))
)
)
def put(self, request: Request, workspace_id: str, knowledge_id: str): def put(self, request: Request, workspace_id: str, knowledge_id: str):
return result.success( return result.success(
DocumentSerializers.Batch( DocumentSerializers.Batch(
@ -355,6 +422,12 @@ class DocumentView(APIView):
PermissionConstants.KNOWLEDGE_DOCUMENT_GENERATE.get_workspace_knowledge_permission(), PermissionConstants.KNOWLEDGE_DOCUMENT_GENERATE.get_workspace_knowledge_permission(),
PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission(), PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission(),
) )
@log(menu='document', operate="Batch generate related documents",
get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
get_knowledge_operation_object(keywords.get('knowledge_id')),
get_document_operation_object_batch(r.data.get('document_id_list'))
)
)
def put(self, request: Request, workspace_id: str, knowledge_id: str): def put(self, request: Request, workspace_id: str, knowledge_id: str):
return result.success(DocumentSerializers.BatchGenerateRelated( return result.success(DocumentSerializers.BatchGenerateRelated(
data={'workspace_id': workspace_id, 'knowledge_id': knowledge_id} data={'workspace_id': workspace_id, 'knowledge_id': knowledge_id}
@ -396,6 +469,12 @@ class DocumentView(APIView):
tags=[_('Knowledge Base/Documentation')] # type: ignore tags=[_('Knowledge Base/Documentation')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_EXPORT.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_EXPORT.get_workspace_knowledge_permission())
@log(menu='document', operate="Export document",
get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
get_knowledge_operation_object(keywords.get('knowledge_id')),
get_document_operation_object(keywords.get('document_id'))
)
)
def get(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str): def get(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str):
return DocumentSerializers.Operate(data={ return DocumentSerializers.Operate(data={
'workspace_id': workspace_id, 'document_id': document_id, 'knowledge_id': knowledge_id 'workspace_id': workspace_id, 'document_id': document_id, 'knowledge_id': knowledge_id
@ -412,6 +491,12 @@ class DocumentView(APIView):
tags=[_('Knowledge Base/Documentation')] # type: ignore tags=[_('Knowledge Base/Documentation')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_EXPORT.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_EXPORT.get_workspace_knowledge_permission())
@log(menu='document', operate="Export Zip document",
get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
get_knowledge_operation_object(keywords.get('knowledge_id')),
get_document_operation_object(keywords.get('document_id'))
)
)
def get(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str): def get(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str):
return DocumentSerializers.Operate(data={ return DocumentSerializers.Operate(data={
'workspace_id': workspace_id, 'document_id': document_id, 'knowledge_id': knowledge_id 'workspace_id': workspace_id, 'document_id': document_id, 'knowledge_id': knowledge_id
@ -445,6 +530,12 @@ class DocumentView(APIView):
tags=[_('Knowledge Base/Documentation')] # type: ignore tags=[_('Knowledge Base/Documentation')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_MIGRATE.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_MIGRATE.get_workspace_knowledge_permission())
@log(menu='document', operate="Migrate documents in batches",
get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
get_knowledge_operation_object(keywords.get('knowledge_id')),
get_document_operation_object_batch(r.data)
)
)
def put(self, request: Request, workspace_id, knowledge_id: str, target_knowledge_id: str): def put(self, request: Request, workspace_id, knowledge_id: str, target_knowledge_id: str):
return result.success(DocumentSerializers.Migrate( return result.success(DocumentSerializers.Migrate(
data={ data={
@ -469,6 +560,11 @@ class WebDocumentView(APIView):
tags=[_('Knowledge Base/Documentation')] # type: ignore tags=[_('Knowledge Base/Documentation')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_CREATE.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_CREATE.get_workspace_knowledge_permission())
@log(menu='document', operate="Create Web site documents",
get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
get_knowledge_operation_object(keywords.get('knowledge_id')),
{'name': f'[{",".join([url for url in r.data.get("source_url_list", [])])}]',
'document_list': [{'name': url} for url in r.data.get("source_url_list", [])]}))
def post(self, request: Request, workspace_id: str, knowledge_id: str): def post(self, request: Request, workspace_id: str, knowledge_id: str):
return result.success(DocumentSerializers.Create(data={ return result.success(DocumentSerializers.Create(data={
'knowledge_id': knowledge_id, 'workspace_id': workspace_id 'knowledge_id': knowledge_id, 'workspace_id': workspace_id
@ -489,6 +585,11 @@ class QaDocumentView(APIView):
tags=[_('Knowledge Base/Documentation')] # type: ignore tags=[_('Knowledge Base/Documentation')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_CREATE.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_CREATE.get_workspace_knowledge_permission())
@log(menu='document', operate="Import QA and create documentation",
get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
get_knowledge_operation_object(keywords.get('knowledge_id')),
{'name': f'[{",".join([file.name for file in r.FILES.getlist("file")])}]',
'document_list': [{'name': file.name} for file in r.FILES.getlist("file")]}))
def post(self, request: Request, workspace_id: str, knowledge_id: str): def post(self, request: Request, workspace_id: str, knowledge_id: str):
return result.success(DocumentSerializers.Create(data={ return result.success(DocumentSerializers.Create(data={
'knowledge_id': knowledge_id, 'workspace_id': workspace_id 'knowledge_id': knowledge_id, 'workspace_id': workspace_id
@ -509,6 +610,11 @@ class TableDocumentView(APIView):
tags=[_('Knowledge Base/Documentation')] # type: ignore tags=[_('Knowledge Base/Documentation')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_CREATE.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_CREATE.get_workspace_knowledge_permission())
@log(menu='document', operate="Import tables and create documents",
get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
get_knowledge_operation_object(keywords.get('knowledge_id')),
{'name': f'[{",".join([file.name for file in r.FILES.getlist("file")])}]',
'document_list': [{'name': file.name} for file in r.FILES.getlist("file")]}))
def post(self, request: Request, workspace_id: str, knowledge_id: str): def post(self, request: Request, workspace_id: str, knowledge_id: str):
return result.success(DocumentSerializers.Create( return result.success(DocumentSerializers.Create(
data={'knowledge_id': knowledge_id, 'workspace_id': workspace_id} data={'knowledge_id': knowledge_id, 'workspace_id': workspace_id}

View File

@ -6,6 +6,7 @@ from rest_framework.views import APIView
from rest_framework.views import Request from rest_framework.views import Request
from common.auth import TokenAuth from common.auth import TokenAuth
from common.log.log import log
from common.result import result from common.result import result
from knowledge.api.file import FileUploadAPI, FileGetAPI from knowledge.api.file import FileUploadAPI, FileGetAPI
from knowledge.serializers.file import FileSerializer from knowledge.serializers.file import FileSerializer
@ -25,6 +26,7 @@ class FileView(APIView):
responses=FileUploadAPI.get_response(), responses=FileUploadAPI.get_response(),
tags=[_('File')] # type: ignore tags=[_('File')] # type: ignore
) )
@log(menu='file', operate='Upload file')
def post(self, request: Request): def post(self, request: Request):
return result.success(FileSerializer(data={'file': request.FILES.get('file')}).upload()) return result.success(FileSerializer(data={'file': request.FILES.get('file')}).upload())
@ -50,5 +52,6 @@ class FileView(APIView):
responses=FileGetAPI.get_response(), responses=FileGetAPI.get_response(),
tags=[_('File')] # type: ignore tags=[_('File')] # type: ignore
) )
@log(menu='file', operate='Delete file')
def delete(self, request: Request, file_id: str): def delete(self, request: Request, file_id: str):
return result.success(FileSerializer.Operate(data={'id': file_id}).delete()) return result.success(FileSerializer.Operate(data={'id': file_id}).delete())

View File

@ -6,10 +6,12 @@ from rest_framework.views import APIView
from common.auth import TokenAuth from common.auth import TokenAuth
from common.auth.authentication import has_permissions from common.auth.authentication import has_permissions
from common.constants.permission_constants import PermissionConstants from common.constants.permission_constants import PermissionConstants
from common.log.log import log
from common.result import result from common.result import result
from knowledge.api.knowledge import KnowledgeBaseCreateAPI, KnowledgeWebCreateAPI, KnowledgeTreeReadAPI, \ from knowledge.api.knowledge import KnowledgeBaseCreateAPI, KnowledgeWebCreateAPI, KnowledgeTreeReadAPI, \
KnowledgeEditAPI, KnowledgeReadAPI, KnowledgePageAPI, SyncWebAPI, GenerateRelatedAPI, HitTestAPI, EmbeddingAPI, \ KnowledgeEditAPI, KnowledgeReadAPI, KnowledgePageAPI, SyncWebAPI, GenerateRelatedAPI, HitTestAPI, EmbeddingAPI, \
GetModelAPI, KnowledgeExportAPI GetModelAPI, KnowledgeExportAPI
from knowledge.serializers.common import get_knowledge_operation_object
from knowledge.serializers.knowledge import KnowledgeSerializer from knowledge.serializers.knowledge import KnowledgeSerializer
from models_provider.serializers.model_serializer import ModelSerializer from models_provider.serializers.model_serializer import ModelSerializer
@ -52,6 +54,8 @@ class KnowledgeView(APIView):
tags=[_('Knowledge Base')] # type: ignore tags=[_('Knowledge Base')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_EDIT.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_EDIT.get_workspace_knowledge_permission())
@log(menu='Knowledge Base', operate="Modify knowledge base information",
get_operation_object=lambda r, keywords: get_knowledge_operation_object(keywords.get('knowledge_id')))
def put(self, request: Request, workspace_id: str, knowledge_id: str): def put(self, request: Request, workspace_id: str, knowledge_id: str):
return result.success(KnowledgeSerializer.Operate( return result.success(KnowledgeSerializer.Operate(
data={'user_id': request.user.id, 'workspace_id': workspace_id, 'knowledge_id': knowledge_id} data={'user_id': request.user.id, 'workspace_id': workspace_id, 'knowledge_id': knowledge_id}
@ -68,6 +72,8 @@ class KnowledgeView(APIView):
tags=[_('Knowledge Base')] # type: ignore tags=[_('Knowledge Base')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_DELETE.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_DELETE.get_workspace_knowledge_permission())
@log(menu='Knowledge Base', operate="Delete knowledge base",
get_operation_object=lambda r, keywords: get_knowledge_operation_object(keywords.get('knowledge_id')))
def delete(self, request: Request, workspace_id: str, knowledge_id: str): def delete(self, request: Request, workspace_id: str, knowledge_id: str):
return result.success(KnowledgeSerializer.Operate( return result.success(KnowledgeSerializer.Operate(
data={'user_id': request.user.id, 'workspace_id': workspace_id, 'knowledge_id': knowledge_id} data={'user_id': request.user.id, 'workspace_id': workspace_id, 'knowledge_id': knowledge_id}
@ -126,6 +132,8 @@ class KnowledgeView(APIView):
tags=[_('Knowledge Base')] # type: ignore tags=[_('Knowledge Base')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_SYNC.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_SYNC.get_workspace_knowledge_permission())
@log(menu='Knowledge Base', operate="Synchronize the knowledge base of the website",
get_operation_object=lambda r, keywords: get_knowledge_operation_object(keywords.get('knowledge_id')))
def put(self, request: Request, workspace_id: str, knowledge_id: str): def put(self, request: Request, workspace_id: str, knowledge_id: str):
return result.success(KnowledgeSerializer.SyncWeb( return result.success(KnowledgeSerializer.SyncWeb(
data={ data={
@ -177,6 +185,8 @@ class KnowledgeView(APIView):
tags=[_('Knowledge Base')] # type: ignore tags=[_('Knowledge Base')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_VECTOR.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_VECTOR.get_workspace_knowledge_permission())
@log(menu='Knowledge Base', operate='Re-vectorize',
get_operation_object=lambda r,k: get_knowledge_operation_object(k.get('knowledge_id')))
def put(self, request: Request, workspace_id: str, knowledge_id: str): def put(self, request: Request, workspace_id: str, knowledge_id: str):
return result.success(KnowledgeSerializer.Operate( return result.success(KnowledgeSerializer.Operate(
data={'knowledge_id': knowledge_id, 'workspace_id': workspace_id, 'user_id': request.user.id} data={'knowledge_id': knowledge_id, 'workspace_id': workspace_id, 'user_id': request.user.id}
@ -193,6 +203,8 @@ class KnowledgeView(APIView):
tags=[_('Knowledge Base')] # type: ignore tags=[_('Knowledge Base')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_EXPORT.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_EXPORT.get_workspace_knowledge_permission())
@log(menu='Knowledge Base', operate="Export knowledge base",
get_operation_object=lambda r, keywords: get_knowledge_operation_object(keywords.get('knowledge_id')))
def get(self, request: Request, workspace_id: str, knowledge_id: str): def get(self, request: Request, workspace_id: str, knowledge_id: str):
return KnowledgeSerializer.Operate(data={ return KnowledgeSerializer.Operate(data={
'workspace_id': workspace_id, 'knowledge_id': knowledge_id, 'user_id': request.user.id 'workspace_id': workspace_id, 'knowledge_id': knowledge_id, 'user_id': request.user.id
@ -209,6 +221,8 @@ class KnowledgeView(APIView):
tags=[_('Knowledge Base')] # type: ignore tags=[_('Knowledge Base')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_EXPORT.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_EXPORT.get_workspace_knowledge_permission())
@log(menu='Knowledge Base', operate="Export knowledge base containing images",
get_operation_object=lambda r, keywords: get_knowledge_operation_object(keywords.get('knowledge_id')))
def get(self, request: Request, workspace_id: str, knowledge_id: str): def get(self, request: Request, workspace_id: str, knowledge_id: str):
return KnowledgeSerializer.Operate(data={ return KnowledgeSerializer.Operate(data={
'workspace_id': workspace_id, 'knowledge_id': knowledge_id, 'user_id': request.user.id 'workspace_id': workspace_id, 'knowledge_id': knowledge_id, 'user_id': request.user.id
@ -228,6 +242,9 @@ class KnowledgeView(APIView):
tags=[_('Knowledge Base')] # type: ignore tags=[_('Knowledge Base')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_GENERATE.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_GENERATE.get_workspace_knowledge_permission())
@log(menu='document', operate='Generate related documents',
get_operation_object=lambda r,k: get_knowledge_operation_object(k.get('knowledge_id'))
)
def put(self, request: Request, workspace_id: str, knowledge_id: str): def put(self, request: Request, workspace_id: str, knowledge_id: str):
return result.success(KnowledgeSerializer.Operate( return result.success(KnowledgeSerializer.Operate(
data={'knowledge_id': knowledge_id, 'workspace_id': workspace_id, 'user_id': request.user.id} data={'knowledge_id': knowledge_id, 'workspace_id': workspace_id, 'user_id': request.user.id}
@ -290,6 +307,8 @@ class KnowledgeBaseView(APIView):
tags=[_('Knowledge Base')] # type: ignore tags=[_('Knowledge Base')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_CREATE.get_workspace_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_CREATE.get_workspace_permission())
@log(menu='knowledge Base', operate='Create base knowledge',
get_operation_object=lambda r,k: {'name': r.data.get('name'), 'desc': r.data.get('desc')})
def post(self, request: Request, workspace_id: str): def post(self, request: Request, workspace_id: str):
return result.success(KnowledgeSerializer.Create( return result.success(KnowledgeSerializer.Create(
data={'user_id': request.user.id, 'workspace_id': workspace_id} data={'user_id': request.user.id, 'workspace_id': workspace_id}
@ -310,6 +329,13 @@ class KnowledgeWebView(APIView):
tags=[_('Knowledge Base')] # type: ignore tags=[_('Knowledge Base')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_CREATE.get_workspace_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_CREATE.get_workspace_permission())
@log(menu='Knowledge Base', operate="Create a web site knowledge base",
get_operation_object=lambda r,k: {'name': r.data.get('name'),'desc': r.data.get('desc'),
'first_list': r.FILES.getlist('file'),
'meta': {'source_url': r.data.get('source_url'),
'selector': r.data.get('selector'),
'embedding_mode_id': r.data.get('embedding_mode_id')}}
)
def post(self, request: Request, workspace_id: str): def post(self, request: Request, workspace_id: str):
return result.success(KnowledgeSerializer.Create( return result.success(KnowledgeSerializer.Create(
data={'user_id': request.user.id, 'workspace_id': workspace_id} data={'user_id': request.user.id, 'workspace_id': workspace_id}

View File

@ -6,12 +6,15 @@ from rest_framework.views import Request
from common.auth import TokenAuth from common.auth import TokenAuth
from common.auth.authentication import has_permissions from common.auth.authentication import has_permissions
from common.constants.permission_constants import PermissionConstants from common.constants.permission_constants import PermissionConstants
from common.log.log import log
from common.result import result from common.result import result
from common.utils.common import query_params_to_single_dict from common.utils.common import query_params_to_single_dict
from knowledge.api.paragraph import ParagraphReadAPI, ParagraphCreateAPI, ParagraphBatchDeleteAPI, ParagraphEditAPI, \ from knowledge.api.paragraph import ParagraphReadAPI, ParagraphCreateAPI, ParagraphBatchDeleteAPI, ParagraphEditAPI, \
ParagraphGetAPI, ProblemCreateAPI, UnAssociationAPI, AssociationAPI, ParagraphPageAPI, \ ParagraphGetAPI, ProblemCreateAPI, UnAssociationAPI, AssociationAPI, ParagraphPageAPI, \
ParagraphBatchGenerateRelatedAPI, ParagraphMigrateAPI ParagraphBatchGenerateRelatedAPI, ParagraphMigrateAPI
from knowledge.serializers.common import get_knowledge_operation_object
from knowledge.serializers.paragraph import ParagraphSerializers from knowledge.serializers.paragraph import ParagraphSerializers
from knowledge.views import get_knowledge_document_operation_object, get_document_operation_object
class ParagraphView(APIView): class ParagraphView(APIView):
@ -47,6 +50,12 @@ class ParagraphView(APIView):
tags=[_('Knowledge Base/Documentation/Paragraph')] # type: ignore tags=[_('Knowledge Base/Documentation/Paragraph')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_CREATE.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_CREATE.get_workspace_knowledge_permission())
@log(menu='Paragraph', operate='Create Paragraph',
get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
get_knowledge_operation_object(keywords.get('knowledge_id')),
get_document_operation_object(keywords.get('document_id'))
)
)
def post(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str): def post(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str):
return result.success(ParagraphSerializers.Create( return result.success(ParagraphSerializers.Create(
data={'workspace_id': workspace_id, 'knowledge_id': knowledge_id, 'document_id': document_id} data={'workspace_id': workspace_id, 'knowledge_id': knowledge_id, 'document_id': document_id}
@ -83,6 +92,12 @@ class ParagraphView(APIView):
tags=[_('Knowledge Base/Documentation/Paragraph')] # type: ignore tags=[_('Knowledge Base/Documentation/Paragraph')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_MIGRATE.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_MIGRATE.get_workspace_knowledge_permission())
@log(menu='Paragraph', operate='Migrate paragraphs in batches',
get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
get_knowledge_operation_object(keywords.get('knowledge_id')),
get_document_operation_object(keywords.get('document_id'))
)
)
def put(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str, def put(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str,
target_knowledge_id: str, target_document_id): target_knowledge_id: str, target_document_id):
return result.success( return result.success(
@ -109,6 +124,12 @@ class ParagraphView(APIView):
tags=[_('Knowledge Base/Documentation/Paragraph')] # type: ignore tags=[_('Knowledge Base/Documentation/Paragraph')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_GENERATE.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_GENERATE.get_workspace_knowledge_permission())
@log(menu='Paragraph', operate='Batch generate related',
get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
get_knowledge_operation_object(keywords.get('knowledge_id')),
get_document_operation_object(keywords.get('document_id'))
)
)
def put(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str): def put(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str):
return result.success(ParagraphSerializers.Batch( return result.success(ParagraphSerializers.Batch(
data={'workspace_id': workspace_id, 'knowledge_id': knowledge_id, 'document_id': document_id} data={'workspace_id': workspace_id, 'knowledge_id': knowledge_id, 'document_id': document_id}
@ -128,6 +149,12 @@ class ParagraphView(APIView):
tags=[_('Knowledge Base/Documentation/Paragraph')] # type: ignore tags=[_('Knowledge Base/Documentation/Paragraph')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission())
@log(menu='Paragraph', operate='Modify paragraph data',
get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
get_knowledge_operation_object(keywords.get('knowledge_id')),
get_document_operation_object(keywords.get('document_id'))
)
)
def put(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str, paragraph_id: str): def put(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str, paragraph_id: str):
o = ParagraphSerializers.Operate( o = ParagraphSerializers.Operate(
data={ data={
@ -171,6 +198,12 @@ class ParagraphView(APIView):
responses=ParagraphGetAPI.get_response(), responses=ParagraphGetAPI.get_response(),
tags=[_('Knowledge Base/Documentation/Paragraph')]) # type: ignore tags=[_('Knowledge Base/Documentation/Paragraph')]) # type: ignore
@has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission())
@log(menu='Paragraph', operate='Delete paragraph',
get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
get_knowledge_operation_object(keywords.get('knowledge_id')),
get_document_operation_object(keywords.get('document_id'))
)
)
def delete(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str, paragraph_id: str): def delete(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str, paragraph_id: str):
o = ParagraphSerializers.Operate( o = ParagraphSerializers.Operate(
data={ data={
@ -197,6 +230,12 @@ class ParagraphView(APIView):
tags=[_('Knowledge Base/Documentation/Paragraph')] # type: ignore tags=[_('Knowledge Base/Documentation/Paragraph')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission())
@log(menu='Paragraph', operate='Add associated questions',
get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
get_knowledge_operation_object(keywords.get('knowledge_id')),
get_document_operation_object(keywords.get('document_id'))
)
)
def post(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str, paragraph_id: str): def post(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str, paragraph_id: str):
return result.success(ParagraphSerializers.Problem( return result.success(ParagraphSerializers.Problem(
data={ data={
@ -241,6 +280,12 @@ class ParagraphView(APIView):
tags=[_('Knowledge Base/Documentation/Paragraph')] # type: ignore tags=[_('Knowledge Base/Documentation/Paragraph')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission())
@log(menu='Paragraph', operate='Disassociation issue',
get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
get_knowledge_operation_object(keywords.get('knowledge_id')),
get_document_operation_object(keywords.get('document_id'))
)
)
def put(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str): def put(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str):
return result.success(ParagraphSerializers.Association( return result.success(ParagraphSerializers.Association(
data={ data={
@ -266,6 +311,12 @@ class ParagraphView(APIView):
tags=[_('Knowledge Base/Documentation/Paragraph')] # type: ignore tags=[_('Knowledge Base/Documentation/Paragraph')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission())
@log(menu='Paragraph', operate='Related questions',
get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
get_knowledge_operation_object(keywords.get('knowledge_id')),
get_document_operation_object(keywords.get('document_id'))
)
)
def put(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str): def put(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str):
return result.success(ParagraphSerializers.Association( return result.success(ParagraphSerializers.Association(
data={ data={

View File

@ -6,10 +6,12 @@ from rest_framework.views import Request
from common.auth import TokenAuth from common.auth import TokenAuth
from common.auth.authentication import has_permissions from common.auth.authentication import has_permissions
from common.constants.permission_constants import PermissionConstants from common.constants.permission_constants import PermissionConstants
from common.log.log import log
from common.result import result from common.result import result
from common.utils.common import query_params_to_single_dict from common.utils.common import query_params_to_single_dict
from knowledge.api.problem import ProblemReadAPI, ProblemBatchCreateAPI, BatchAssociationAPI, BatchDeleteAPI, \ from knowledge.api.problem import ProblemReadAPI, ProblemBatchCreateAPI, BatchAssociationAPI, BatchDeleteAPI, \
ProblemPageAPI, ProblemDeleteAPI, ProblemEditAPI, ProblemParagraphAPI ProblemPageAPI, ProblemDeleteAPI, ProblemEditAPI, ProblemParagraphAPI
from knowledge.serializers.common import get_knowledge_operation_object
from knowledge.serializers.problem import ProblemSerializers from knowledge.serializers.problem import ProblemSerializers
@ -48,6 +50,9 @@ class ProblemView(APIView):
tags=[_('Knowledge Base/Documentation/Paragraph/Question')] # type: ignore tags=[_('Knowledge Base/Documentation/Paragraph/Question')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_PROBLEM_EDIT.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_PROBLEM_EDIT.get_workspace_knowledge_permission())
@log(menu='problem', operate='Create question',
get_operation_object=lambda r, keywords: get_knowledge_operation_object(keywords.get('dataset_id'))
)
def post(self, request: Request, workspace_id: str, knowledge_id: str): def post(self, request: Request, workspace_id: str, knowledge_id: str):
return result.success(ProblemSerializers.Create( return result.success(ProblemSerializers.Create(
data={'workspace_id': workspace_id, 'knowledge_id': knowledge_id} data={'workspace_id': workspace_id, 'knowledge_id': knowledge_id}
@ -88,6 +93,8 @@ class ProblemView(APIView):
tags=[_('Knowledge Base/Documentation/Paragraph/Question')] # type: ignore tags=[_('Knowledge Base/Documentation/Paragraph/Question')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_PROBLEM_EDIT.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_PROBLEM_EDIT.get_workspace_knowledge_permission())
@log(menu='problem', operate='Batch associated paragraphs',
get_operation_object=lambda r, keywords: get_knowledge_operation_object(keywords.get('dataset_id')))
def put(self, request: Request, workspace_id: str, knowledge_id: str): def put(self, request: Request, workspace_id: str, knowledge_id: str):
return result.success(ProblemSerializers.BatchOperate( return result.success(ProblemSerializers.BatchOperate(
data={'knowledge_id': knowledge_id, 'workspace_id': workspace_id} data={'knowledge_id': knowledge_id, 'workspace_id': workspace_id}
@ -107,6 +114,8 @@ class ProblemView(APIView):
tags=[_('Knowledge Base/Documentation/Paragraph/Question')] # type: ignore tags=[_('Knowledge Base/Documentation/Paragraph/Question')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_PROBLEM_EDIT.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_PROBLEM_EDIT.get_workspace_knowledge_permission())
@log(menu='problem', operate='Batch deletion issues',
get_operation_object=lambda r, keywords: get_knowledge_operation_object(keywords.get('dataset_id')))
def put(self, request: Request, workspace_id: str, knowledge_id: str): def put(self, request: Request, workspace_id: str, knowledge_id: str):
return result.success(ProblemSerializers.BatchOperate( return result.success(ProblemSerializers.BatchOperate(
data={'knowledge_id': knowledge_id, 'workspace_id': workspace_id} data={'knowledge_id': knowledge_id, 'workspace_id': workspace_id}
@ -125,6 +134,8 @@ class ProblemView(APIView):
tags=[_('Knowledge Base/Documentation/Paragraph/Question')] # type: ignore tags=[_('Knowledge Base/Documentation/Paragraph/Question')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_PROBLEM_DELETE.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_PROBLEM_DELETE.get_workspace_knowledge_permission())
@log(menu='problem', operate='Delete question',
get_operation_object=lambda r, keywords: get_knowledge_operation_object(keywords.get('dataset_id')))
def delete(self, request: Request, workspace_id: str, knowledge_id: str, problem_id: str): def delete(self, request: Request, workspace_id: str, knowledge_id: str, problem_id: str):
return result.success(ProblemSerializers.Operate( return result.success(ProblemSerializers.Operate(
data={ data={
@ -146,6 +157,8 @@ class ProblemView(APIView):
tags=[_('Knowledge Base/Documentation/Paragraph/Question')] # type: ignore tags=[_('Knowledge Base/Documentation/Paragraph/Question')] # type: ignore
) )
@has_permissions(PermissionConstants.KNOWLEDGE_PROBLEM_EDIT.get_workspace_knowledge_permission()) @has_permissions(PermissionConstants.KNOWLEDGE_PROBLEM_EDIT.get_workspace_knowledge_permission())
@log(menu='problem', operate='Modify question',
get_operation_object=lambda r, keywords: get_knowledge_operation_object(keywords.get('dataset_id')))
def put(self, request: Request, workspace_id: str, knowledge_id: str, problem_id: str): def put(self, request: Request, workspace_id: str, knowledge_id: str, problem_id: str):
return result.success(ProblemSerializers.Operate( return result.success(ProblemSerializers.Operate(
data={ data={

View File

@ -6,6 +6,7 @@
@date2025/4/14 19:25 @date2025/4/14 19:25
@desc: @desc:
""" """
from django.db.models import QuerySet
from drf_spectacular.utils import extend_schema from drf_spectacular.utils import extend_schema
from rest_framework.views import APIView from rest_framework.views import APIView
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
@ -14,11 +15,42 @@ from rest_framework.request import Request
from common.auth import TokenAuth from common.auth import TokenAuth
from common.auth.authentication import has_permissions from common.auth.authentication import has_permissions
from common.constants.permission_constants import PermissionConstants from common.constants.permission_constants import PermissionConstants
from common.log.log import log
from common.result import result from common.result import result
from common.utils.common import query_params_to_single_dict 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.model import ModelCreateAPI, GetModelApi, ModelEditApi, ModelListResponse, DefaultModelResponse
from models_provider.api.provide import ProvideApi from models_provider.api.provide import ProvideApi
from models_provider.models import Model
from models_provider.serializers.model_serializer import ModelSerializer from models_provider.serializers.model_serializer import ModelSerializer
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 Model(APIView): class Model(APIView):
@ -33,6 +65,10 @@ class Model(APIView):
request=ModelCreateAPI.get_request(), request=ModelCreateAPI.get_request(),
responses=ModelCreateAPI.get_response()) responses=ModelCreateAPI.get_response())
@has_permissions(PermissionConstants.MODEL_CREATE.get_workspace_permission()) @has_permissions(PermissionConstants.MODEL_CREATE.get_workspace_permission())
@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): def post(self, request: Request, workspace_id: str):
return result.success( return result.success(
ModelSerializer.Create(data={**request.data, 'user_id': request.user.id}).insert(workspace_id, ModelSerializer.Create(data={**request.data, 'user_id': request.user.id}).insert(workspace_id,
@ -76,6 +112,10 @@ class Model(APIView):
responses=ModelEditApi.get_response(), responses=ModelEditApi.get_response(),
tags=[_('Model')]) # type: ignore tags=[_('Model')]) # type: ignore
@has_permissions(PermissionConstants.MODEL_EDIT.get_workspace_permission()) @has_permissions(PermissionConstants.MODEL_EDIT.get_workspace_permission())
@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): def put(self, request: Request, workspace_id, model_id: str):
return result.success( return result.success(
ModelSerializer.Operate(data={'id': model_id, 'user_id': request.user.id}).edit(request.data, ModelSerializer.Operate(data={'id': model_id, 'user_id': request.user.id}).edit(request.data,
@ -89,6 +129,8 @@ class Model(APIView):
responses=DefaultModelResponse.get_response(), responses=DefaultModelResponse.get_response(),
tags=[_('Model')]) # type: ignore tags=[_('Model')]) # type: ignore
@has_permissions(PermissionConstants.MODEL_DELETE.get_workspace_permission()) @has_permissions(PermissionConstants.MODEL_DELETE.get_workspace_permission())
@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): def delete(self, request: Request, workspace_id: str, model_id: str):
return result.success( return result.success(
ModelSerializer.Operate(data={'id': model_id, 'user_id': request.user.id}).delete()) ModelSerializer.Operate(data={'id': model_id, 'user_id': request.user.id}).delete())
@ -129,6 +171,8 @@ class Model(APIView):
responses=ProvideApi.ModelParamsForm.get_response(), responses=ProvideApi.ModelParamsForm.get_response(),
tags=[_('Model')]) # type: ignore tags=[_('Model')]) # type: ignore
@has_permissions(PermissionConstants.MODEL_READ.get_workspace_permission()) @has_permissions(PermissionConstants.MODEL_READ.get_workspace_permission())
@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): def put(self, request: Request, workspace_id: str, model_id: str):
return result.success( return result.success(
ModelSerializer.ModelParams(data={'id': model_id}).save_model_params_form(request.data)) ModelSerializer.ModelParams(data={'id': model_id}).save_model_params_form(request.data))

View File

@ -9,6 +9,7 @@ from common import result
from common.auth import TokenAuth from common.auth import TokenAuth
from common.auth.authentication import has_permissions from common.auth.authentication import has_permissions
from common.constants.permission_constants import PermissionConstants from common.constants.permission_constants import PermissionConstants
from common.log.log import log
from models_provider.api.provide import ProvideApi from models_provider.api.provide import ProvideApi
from models_provider.constants.model_provider_constants import ModelProvideConstants from models_provider.constants.model_provider_constants import ModelProvideConstants
from models_provider.serializers.model_serializer import get_default_model_params_setting from models_provider.serializers.model_serializer import get_default_model_params_setting
@ -24,6 +25,7 @@ class Provide(APIView):
responses=ProvideApi.get_response(), responses=ProvideApi.get_response(),
tags=[_('Model')]) # type: ignore tags=[_('Model')]) # type: ignore
@has_permissions(PermissionConstants.MODEL_READ) @has_permissions(PermissionConstants.MODEL_READ)
@log(menu='model',operate='Get a list of model suppliers')
def get(self, request: Request): def get(self, request: Request):
model_type = request.query_params.get('model_type') model_type = request.query_params.get('model_type')
if model_type: if model_type:

View File

@ -7,6 +7,7 @@
@desc: @desc:
""" """
from drf_spectacular.utils import extend_schema from drf_spectacular.utils import extend_schema
from networkx.algorithms.traversal import dfs_successors
from rest_framework.request import Request from rest_framework.request import Request
from rest_framework.views import APIView from rest_framework.views import APIView
@ -16,11 +17,31 @@ from common.constants.permission_constants import PermissionConstants
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from common.log.log import log
from common.result import result from common.result import result
from common.utils.common import encryption
from models_provider.api.model import DefaultModelResponse from models_provider.api.model import DefaultModelResponse
from system_manage.api.email_setting import EmailSettingAPI from system_manage.api.email_setting import EmailSettingAPI
from system_manage.serializers.email_setting import EmailSettingSerializer from system_manage.serializers.email_setting import EmailSettingSerializer
def encryption_str(_value):
if isinstance(_value, str):
return encryption(_value)
return _value
def get_email_details(request):
path = request.path
body = request.data
query = request.query_params
email_host_password = body.get('email_host_password', '')
return {
'path': path,
'body': {**body, 'email_host_password': encryption_str(email_host_password)},
'query': query
}
class SystemSetting(APIView): class SystemSetting(APIView):
class Email(APIView): class Email(APIView):
@ -33,6 +54,8 @@ class SystemSetting(APIView):
request=EmailSettingAPI.get_request(), request=EmailSettingAPI.get_request(),
responses=EmailSettingAPI.get_response(), responses=EmailSettingAPI.get_response(),
tags=[_('Email Settings')]) # type: ignore tags=[_('Email Settings')]) # type: ignore
@log(menu='Email settings', operate='Create or update email settings',
get_details=get_email_details)
@has_permissions(PermissionConstants.EMAIL_SETTING_EDIT) @has_permissions(PermissionConstants.EMAIL_SETTING_EDIT)
def put(self, request: Request): def put(self, request: Request):
return result.success( return result.success(
@ -48,6 +71,9 @@ class SystemSetting(APIView):
tags=[_('Email Settings')] # type: ignore tags=[_('Email Settings')] # type: ignore
) )
@has_permissions(PermissionConstants.EMAIL_SETTING_EDIT) @has_permissions(PermissionConstants.EMAIL_SETTING_EDIT)
@log(menu='Email settings',operate='Test email settings',
get_details=get_email_details
)
def post(self, request: Request): def post(self, request: Request):
return result.success( return result.success(
EmailSettingSerializer.Create( EmailSettingSerializer.Create(

View File

@ -6,7 +6,7 @@
@date2025/4/28 16:38 @date2025/4/28 16:38
@desc: @desc:
""" """
from django.db.models import QuerySet
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from drf_spectacular.utils import extend_schema from drf_spectacular.utils import extend_schema
from rest_framework.request import Request from rest_framework.request import Request
@ -16,11 +16,21 @@ from common import result
from common.auth import TokenAuth from common.auth import TokenAuth
from common.auth.authentication import has_permissions from common.auth.authentication import has_permissions
from common.constants.permission_constants import PermissionConstants from common.constants.permission_constants import PermissionConstants
from common.log.log import log
from common.result import DefaultResultSerializer from common.result import DefaultResultSerializer
from system_manage.api.user_resource_permission import UserResourcePermissionAPI, EditUserResourcePermissionAPI from system_manage.api.user_resource_permission import UserResourcePermissionAPI, EditUserResourcePermissionAPI
from system_manage.serializers.user_resource_permission import UserResourcePermissionSerializer from system_manage.serializers.user_resource_permission import UserResourcePermissionSerializer
from users.models import User
def get_user_operation_object(user_id):
user_model = QuerySet(model=User).filter(id=user_id).first()
if user_model is not None:
return {
"name": user_model.username
}
return {}
class WorkSpaceUserResourcePermissionView(APIView): class WorkSpaceUserResourcePermissionView(APIView):
authentication_classes = [TokenAuth] authentication_classes = [TokenAuth]
@ -47,6 +57,9 @@ class WorkSpaceUserResourcePermissionView(APIView):
responses=DefaultResultSerializer(), responses=DefaultResultSerializer(),
tags=[_('Resources authorization')] # type: ignore tags=[_('Resources authorization')] # type: ignore
) )
@log(menu='System', operate='Modify the resource authorization list',
get_operation_object=lambda r, k: get_user_operation_object(k.get('user_id'))
)
def put(self, request: Request, workspace_id: str, user_id: str): def put(self, request: Request, workspace_id: str, user_id: str):
return result.success(UserResourcePermissionSerializer( return result.success(UserResourcePermissionSerializer(
data={'workspace_id': workspace_id, 'user_id': user_id} data={'workspace_id': workspace_id, 'user_id': user_id}

View File

@ -1,3 +1,4 @@
from django.db.models import QuerySet
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from drf_spectacular.utils import extend_schema from drf_spectacular.utils import extend_schema
from rest_framework.parsers import MultiPartParser from rest_framework.parsers import MultiPartParser
@ -7,13 +8,22 @@ from rest_framework.views import APIView
from common.auth import TokenAuth from common.auth import TokenAuth
from common.auth.authentication import has_permissions from common.auth.authentication import has_permissions
from common.constants.permission_constants import PermissionConstants from common.constants.permission_constants import PermissionConstants
from common.log.log import log
from common.result import result from common.result import result
from tools.api.tool import ToolCreateAPI, ToolEditAPI, ToolReadAPI, ToolDeleteAPI, ToolTreeReadAPI, ToolDebugApi, \ from tools.api.tool import ToolCreateAPI, ToolEditAPI, ToolReadAPI, ToolDeleteAPI, ToolTreeReadAPI, ToolDebugApi, \
ToolExportAPI, ToolImportAPI, ToolPageAPI, PylintAPI, EditIconAPI ToolExportAPI, ToolImportAPI, ToolPageAPI, PylintAPI, EditIconAPI
from tools.models import ToolScope from tools.models import ToolScope, Tool
from tools.serializers.tool import ToolSerializer, ToolTreeSerializer from tools.serializers.tool import ToolSerializer, ToolTreeSerializer
def get_tool_operation_object(tool_id):
tool_model = QuerySet(model=Tool).filter(id=tool_id).first()
if tool_model is not None:
return {
"name": tool_model.name
}
return {}
class ToolView(APIView): class ToolView(APIView):
authentication_classes = [TokenAuth] authentication_classes = [TokenAuth]
@ -28,6 +38,8 @@ class ToolView(APIView):
tags=[_('Tool')] # type: ignore tags=[_('Tool')] # type: ignore
) )
@has_permissions(PermissionConstants.TOOL_CREATE.get_workspace_permission()) @has_permissions(PermissionConstants.TOOL_CREATE.get_workspace_permission())
@log(menu="Tool", operate="Create tool",
get_operation_object=lambda r,k: r.data.get('name'))
def post(self, request: Request, workspace_id: str): def post(self, request: Request, workspace_id: str):
return result.success(ToolSerializer.Create( return result.success(ToolSerializer.Create(
data={'user_id': request.user.id, 'workspace_id': workspace_id} data={'user_id': request.user.id, 'workspace_id': workspace_id}
@ -80,6 +92,8 @@ class ToolView(APIView):
tags=[_('Tool')] # type: ignore tags=[_('Tool')] # type: ignore
) )
@has_permissions(PermissionConstants.TOOL_EDIT.get_workspace_permission()) @has_permissions(PermissionConstants.TOOL_EDIT.get_workspace_permission())
@log(menu='Tool', operate='Update tool',
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): def put(self, request: Request, workspace_id: str, tool_id: str):
return result.success(ToolSerializer.Operate( return result.success(ToolSerializer.Operate(
data={'id': tool_id, 'workspace_id': workspace_id} data={'id': tool_id, 'workspace_id': workspace_id}
@ -95,6 +109,7 @@ class ToolView(APIView):
tags=[_('Tool')] # type: ignore tags=[_('Tool')] # type: ignore
) )
@has_permissions(PermissionConstants.TOOL_READ.get_workspace_permission()) @has_permissions(PermissionConstants.TOOL_READ.get_workspace_permission())
@log(menu='Tool', operate='Get tool')
def get(self, request: Request, workspace_id: str, tool_id: str): def get(self, request: Request, workspace_id: str, tool_id: str):
return result.success(ToolSerializer.Operate( return result.success(ToolSerializer.Operate(
data={'id': tool_id, 'workspace_id': workspace_id} data={'id': tool_id, 'workspace_id': workspace_id}
@ -110,6 +125,8 @@ class ToolView(APIView):
tags=[_('Tool')] # type: ignore tags=[_('Tool')] # type: ignore
) )
@has_permissions(PermissionConstants.TOOL_DELETE.get_workspace_permission()) @has_permissions(PermissionConstants.TOOL_DELETE.get_workspace_permission())
@log(menu='Tool', operate="Delete tool",
get_operation_object=lambda r,k: get_tool_operation_object(k.get('tool_id')))
def delete(self, request: Request, workspace_id: str, tool_id: str): def delete(self, request: Request, workspace_id: str, tool_id: str):
return result.success(ToolSerializer.Operate( return result.success(ToolSerializer.Operate(
data={'id': tool_id, 'workspace_id': workspace_id} data={'id': tool_id, 'workspace_id': workspace_id}
@ -128,6 +145,7 @@ class ToolView(APIView):
tags=[_('Tool')] # type: ignore tags=[_('Tool')] # type: ignore
) )
@has_permissions(PermissionConstants.TOOL_READ.get_workspace_permission()) @has_permissions(PermissionConstants.TOOL_READ.get_workspace_permission())
@log(menu='Tool', operate='Get tool list')
def get(self, request: Request, workspace_id: str, current_page: int, page_size: int): def get(self, request: Request, workspace_id: str, current_page: int, page_size: int):
return result.success(ToolTreeSerializer.Query( return result.success(ToolTreeSerializer.Query(
data={ data={
@ -153,6 +171,7 @@ class ToolView(APIView):
tags=[_("Tool")] # type: ignore tags=[_("Tool")] # type: ignore
) )
@has_permissions(PermissionConstants.TOOL_IMPORT.get_workspace_permission()) @has_permissions(PermissionConstants.TOOL_IMPORT.get_workspace_permission())
@log(menu='Tool', operate='Import tool')
def post(self, request: Request, workspace_id: str): def post(self, request: Request, workspace_id: str):
return result.success(ToolSerializer.Import( return result.success(ToolSerializer.Import(
data={'workspace_id': workspace_id, 'file': request.FILES.get('file'), 'user_id': request.user.id} data={'workspace_id': workspace_id, 'file': request.FILES.get('file'), 'user_id': request.user.id}
@ -171,6 +190,8 @@ class ToolView(APIView):
tags=[_("Tool")] # type: ignore tags=[_("Tool")] # type: ignore
) )
@has_permissions(PermissionConstants.TOOL_EXPORT.get_workspace_permission()) @has_permissions(PermissionConstants.TOOL_EXPORT.get_workspace_permission())
@log(menu='Tool', operate="Export function",
get_operation_object=lambda r,k: get_tool_operation_object(k.get('id')))
def get(self, request: Request, tool_id: str, workspace_id: str): def get(self, request: Request, tool_id: str, workspace_id: str):
return ToolSerializer.Operate( return ToolSerializer.Operate(
data={'id': tool_id, 'workspace_id': workspace_id} data={'id': tool_id, 'workspace_id': workspace_id}

View File

@ -12,9 +12,20 @@ from rest_framework.request import Request
from rest_framework.views import APIView from rest_framework.views import APIView
from common import result from common import result
from common.log.log import log
from common.utils.common import encryption
from users.api.login import LoginAPI, CaptchaAPI from users.api.login import LoginAPI, CaptchaAPI
from users.serializers.login import LoginSerializer, CaptchaSerializer from users.serializers.login import LoginSerializer, CaptchaSerializer
def _get_details(request):
path = request.path
body = request.data
query = request.query_params
return {
'path':path,
'body':{**body, 'password': encryption(body.get('password',''))},
'query': query
}
class LoginView(APIView): class LoginView(APIView):
@extend_schema(methods=['POST'], @extend_schema(methods=['POST'],
@ -24,6 +35,9 @@ class LoginView(APIView):
tags=[_("User Management")], # type: ignore tags=[_("User Management")], # type: ignore
request=LoginAPI.get_request(), request=LoginAPI.get_request(),
responses=LoginAPI.get_response()) responses=LoginAPI.get_response())
@log(menu='User management', operate='Log in', get_user=lambda r: {'username': r.data.get('username', None)},
get_details=_get_details,
get_operation_object=lambda r,k: {'name': r.data.get('username')})
def post(self, request: Request): def post(self, request: Request):
return result.success(LoginSerializer().login(request.data)) return result.success(LoginSerializer().login(request.data))

View File

@ -6,6 +6,7 @@
@date2025/4/14 19:25 @date2025/4/14 19:25
@desc: @desc:
""" """
from django.db.models import QuerySet
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from drf_spectacular.utils import extend_schema from drf_spectacular.utils import extend_schema
from rest_framework.request import Request from rest_framework.request import Request
@ -14,16 +15,40 @@ from rest_framework.views import APIView
from common.auth.authenticate import TokenAuth from common.auth.authenticate import TokenAuth
from common.auth.authentication import has_permissions from common.auth.authentication import has_permissions
from common.constants.permission_constants import PermissionConstants, Permission, Group, Operate from common.constants.permission_constants import PermissionConstants, Permission, Group, Operate
from common.log.log import log
from common.result import result from common.result import result
from maxkb.const import CONFIG from maxkb.const import CONFIG
from models_provider.api.model import DefaultModelResponse from models_provider.api.model import DefaultModelResponse
from tools.serializers.tool import encryption
from users.api.user import UserProfileAPI, TestWorkspacePermissionUserApi, DeleteUserApi, EditUserApi, \ from users.api.user import UserProfileAPI, TestWorkspacePermissionUserApi, DeleteUserApi, EditUserApi, \
ChangeUserPasswordApi, UserPageApi, UserListApi, UserPasswordResponse, WorkspaceUserAPI ChangeUserPasswordApi, UserPageApi, UserListApi, UserPasswordResponse, WorkspaceUserAPI
from users.models import User
from users.serializers.user import UserProfileSerializer, UserManageSerializer from users.serializers.user import UserProfileSerializer, UserManageSerializer
default_password = CONFIG.get('default_password', 'MaxKB@123..') default_password = CONFIG.get('default_password', 'MaxKB@123..')
def get_user_operation_object(user_id):
user_model = QuerySet(model=User).filter(id=user_id).first()
if user_model is not None:
return {
"name":user_model.name
}
return {}
def get_re_password_details(request):
path = request.path
body = request.data
query = request.query_params
return {
"path": path,
"body": {**body, 'password': encryption(body.get('password', '')),
're_password': encryption(body.get('re_password',''))},
"query": query
}
class UserProfileView(APIView): class UserProfileView(APIView):
authentication_classes = [TokenAuth] authentication_classes = [TokenAuth]
@ -32,6 +57,7 @@ class UserProfileView(APIView):
description=_("Get current user information"), description=_("Get current user information"),
operation_id=_("Get current user information"), # type: ignore operation_id=_("Get current user information"), # type: ignore
tags=[_("User Management")], # type: ignore tags=[_("User Management")], # type: ignore
responses=UserProfileAPI.get_response()) responses=UserProfileAPI.get_response())
def get(self, request: Request): def get(self, request: Request):
return result.success(UserProfileSerializer().profile(request.user, request.auth)) return result.success(UserProfileSerializer().profile(request.user, request.auth))
@ -118,6 +144,8 @@ class UserManage(APIView):
parameters=DeleteUserApi.get_parameters(), parameters=DeleteUserApi.get_parameters(),
responses=DefaultModelResponse.get_response()) responses=DefaultModelResponse.get_response())
@has_permissions(PermissionConstants.USER_DELETE) @has_permissions(PermissionConstants.USER_DELETE)
@log(menu='User management', operate='Delete user',
get_operation_object= lambda r,k: get_user_operation_object(k.get('user_id')))
def delete(self, request: Request, user_id): def delete(self, request: Request, user_id):
return result.success(UserManageSerializer.Operate(data={'id': user_id}).delete(with_valid=True)) return result.success(UserManageSerializer.Operate(data={'id': user_id}).delete(with_valid=True))
@ -156,6 +184,8 @@ class UserManage(APIView):
request=DeleteUserApi.get_request(), request=DeleteUserApi.get_request(),
responses=DefaultModelResponse.get_response()) responses=DefaultModelResponse.get_response())
@has_permissions(PermissionConstants.USER_DELETE) @has_permissions(PermissionConstants.USER_DELETE)
@log(menu='User management', operate='Batch delete user',
get_operation_object= lambda r,k: get_user_operation_object(k.get('user_id')))
def post(self, request: Request): def post(self, request: Request):
return result.success(UserManageSerializer.BatchDelete(data=request.data).batch_delete(with_valid=True)) return result.success(UserManageSerializer.BatchDelete(data=request.data).batch_delete(with_valid=True))
@ -170,6 +200,9 @@ class UserManage(APIView):
parameters=DeleteUserApi.get_parameters(), parameters=DeleteUserApi.get_parameters(),
request=ChangeUserPasswordApi.get_request(), request=ChangeUserPasswordApi.get_request(),
responses=DefaultModelResponse.get_response()) responses=DefaultModelResponse.get_response())
@log(menu='User management', operate='Change password',
get_operation_object= lambda r,k: get_user_operation_object(k.get('user_id')),
get_details=get_re_password_details)
def put(self, request: Request, user_id): def put(self, request: Request, user_id):
return result.success( return result.success(
UserManageSerializer.Operate(data={'id': user_id}).re_password(request.data, with_valid=True)) UserManageSerializer.Operate(data={'id': user_id}).re_password(request.data, with_valid=True))