From 6f5645e16c24d8dd3fd8b85f126b8cb778496eba Mon Sep 17 00:00:00 2001 From: CaptainB Date: Tue, 6 May 2025 17:39:26 +0800 Subject: [PATCH] feat: add DocumentTreeReadAPI for document pagination and file size limit to knowledge model --- apps/knowledge/api/document.py | 49 +++++++++++++++++++ ...ze_limit_alter_document_status_and_more.py | 29 +++++++++++ apps/knowledge/models/knowledge.py | 3 +- apps/knowledge/urls.py | 1 + apps/knowledge/views/document.py | 38 +++++++++++--- 5 files changed, 113 insertions(+), 7 deletions(-) create mode 100644 apps/knowledge/migrations/0004_knowledge_file_size_limit_alter_document_status_and_more.py diff --git a/apps/knowledge/api/document.py b/apps/knowledge/api/document.py index 71fd7794c..b8ca2455f 100644 --- a/apps/knowledge/api/document.py +++ b/apps/knowledge/api/document.py @@ -266,3 +266,52 @@ class BatchEditHitHandlingAPI(APIMixin): @staticmethod def get_request(): return BatchEditHitHandlingSerializer + + +class DocumentTreeReadAPI(APIMixin): + @staticmethod + def get_parameters(): + return [ + OpenApiParameter( + name="workspace_id", + description="工作空间id", + type=OpenApiTypes.STR, + location='path', + required=True, + ), + OpenApiParameter( + name="knowledge_id", + description="知识库id", + type=OpenApiTypes.STR, + location='path', + required=True, + ), + OpenApiParameter( + name="folder_id", + description="文件夹id", + type=OpenApiTypes.STR, + location='query', + required=True, + ), + OpenApiParameter( + name="user_id", + description="用户id", + type=OpenApiTypes.STR, + location='query', + required=False, + ), + OpenApiParameter( + name="name", + description="名称", + type=OpenApiTypes.STR, + location='query', + required=False, + ), + OpenApiParameter( + name="desc", + description="描述", + type=OpenApiTypes.STR, + location='query', + required=False, + ), + ] diff --git a/apps/knowledge/migrations/0004_knowledge_file_size_limit_alter_document_status_and_more.py b/apps/knowledge/migrations/0004_knowledge_file_size_limit_alter_document_status_and_more.py new file mode 100644 index 000000000..da3059704 --- /dev/null +++ b/apps/knowledge/migrations/0004_knowledge_file_size_limit_alter_document_status_and_more.py @@ -0,0 +1,29 @@ +# Generated by Django 5.2 on 2025-05-06 09:05 + +import knowledge.models.knowledge +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('knowledge', '0003_alter_document_status_alter_paragraph_status_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='knowledge', + name='file_size_limit', + field=models.IntegerField(default=100, verbose_name='文件大小限制'), + ), + migrations.AlterField( + model_name='document', + name='status', + field=models.CharField(default=knowledge.models.knowledge.Status.__str__, max_length=20, verbose_name='状态'), + ), + migrations.AlterField( + model_name='paragraph', + name='status', + field=models.CharField(default=knowledge.models.knowledge.Status.__str__, max_length=20, verbose_name='状态'), + ), + ] diff --git a/apps/knowledge/models/knowledge.py b/apps/knowledge/models/knowledge.py index d00a655ff..ce087324c 100644 --- a/apps/knowledge/models/knowledge.py +++ b/apps/knowledge/models/knowledge.py @@ -127,6 +127,7 @@ class Knowledge(AppModelMixin): folder = models.ForeignKey(KnowledgeFolder, on_delete=models.DO_NOTHING, verbose_name="文件夹id", default='root') embedding_model = models.ForeignKey(Model, on_delete=models.DO_NOTHING, verbose_name="向量模型", default=default_model) + file_size_limit = models.IntegerField(verbose_name="文件大小限制", default=100) meta = models.JSONField(verbose_name="元数据", default=dict) class Meta: @@ -197,6 +198,7 @@ class ProblemParagraphMapping(AppModelMixin): class Meta: db_table = "problem_paragraph_mapping" + class ApplicationKnowledgeMapping(AppModelMixin): id = models.UUIDField(primary_key=True, max_length=128, default=uuid.uuid7, editable=False, verbose_name="主键id") # application = models.ForeignKey(Application, on_delete=models.CASCADE) @@ -206,7 +208,6 @@ class ApplicationKnowledgeMapping(AppModelMixin): db_table = "application_knowledge_mapping" - class SourceType(models.IntegerChoices): """订单类型""" PROBLEM = 0, '问题' diff --git a/apps/knowledge/urls.py b/apps/knowledge/urls.py index a69da97da..da2f19ec5 100644 --- a/apps/knowledge/urls.py +++ b/apps/knowledge/urls.py @@ -20,5 +20,6 @@ urlpatterns = [ path('workspace//knowledge//document//refresh', views.DocumentView.Refresh.as_view()), path('workspace//knowledge//document//cancel_task', views.DocumentView.CancelTask.as_view()), path('workspace//knowledge//document//cancel_task/batch', views.DocumentView.BatchCancelTask.as_view()), + path('workspace//knowledge//document//', views.DocumentView.Page.as_view()), path('workspace//knowledge//', views.KnowledgeView.Page.as_view()), ] diff --git a/apps/knowledge/views/document.py b/apps/knowledge/views/document.py index 34b242b22..bfaf20d85 100644 --- a/apps/knowledge/views/document.py +++ b/apps/knowledge/views/document.py @@ -10,8 +10,8 @@ from common.constants.permission_constants import PermissionConstants from common.result import result from knowledge.api.document import DocumentSplitAPI, DocumentBatchAPI, DocumentBatchCreateAPI, DocumentCreateAPI, \ DocumentReadAPI, DocumentEditAPI, DocumentDeleteAPI, TableDocumentCreateAPI, QaDocumentCreateAPI, \ - WebDocumentCreateAPI, CancelTaskAPI, BatchCancelTaskAPI, SyncWebAPI, RefreshAPI, BatchEditHitHandlingAPI -from knowledge.api.knowledge import KnowledgeTreeReadAPI + WebDocumentCreateAPI, CancelTaskAPI, BatchCancelTaskAPI, SyncWebAPI, RefreshAPI, BatchEditHitHandlingAPI, \ + DocumentTreeReadAPI from knowledge.serializers.document import DocumentSerializers @@ -40,8 +40,8 @@ class DocumentView(APIView): description=_('Get document'), summary=_('Get document'), operation_id=_('Get document'), - parameters=KnowledgeTreeReadAPI.get_parameters(), - responses=KnowledgeTreeReadAPI.get_response(), + parameters=DocumentTreeReadAPI.get_parameters(), + responses=DocumentTreeReadAPI.get_response(), tags=[_('Knowledge Base/Documentation')] ) @has_permissions(PermissionConstants.DOCUMENT_READ.get_workspace_permission()) @@ -163,16 +163,17 @@ class DocumentView(APIView): authentication_classes = [TokenAuth] @extend_schema( - methods=['PUT'], + methods=['GET'], description=_('Synchronize web site types'), summary=_('Synchronize web site types'), operation_id=_('Synchronize web site types'), parameters=SyncWebAPI.get_parameters(), + request=SyncWebAPI.get_request(), responses=SyncWebAPI.get_response(), tags=[_('Knowledge Base/Documentation')] ) @has_permissions(PermissionConstants.DOCUMENT_EDIT.get_workspace_permission()) - def put(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( data={'document_id': document_id, 'knowledge_id': knowledge_id, 'workspace_id': workspace_id} ).sync()) @@ -291,6 +292,31 @@ class DocumentView(APIView): data={'workspace_id': workspace_id, 'knowledge_id': knowledge_id} ).batch_delete(request.data)) + class Page(APIView): + authentication_classes = [TokenAuth] + + @extend_schema( + methods=['GET'], + description=_('Get document by pagination'), + summary=_('Get document by pagination'), + operation_id=_('Get document by pagination'), + parameters=DocumentTreeReadAPI.get_parameters(), + responses=DocumentTreeReadAPI.get_response(), + tags=[_('Knowledge Base/Documentation')] + ) + @has_permissions(PermissionConstants.DOCUMENT_READ.get_workspace_permission()) + def get(self, request: Request, workspace_id: str, knowledge_id: str, current_page: int, page_size: int): + return result.success(DocumentSerializers.Query( + data={ + 'workspace_id': workspace_id, + 'knowledge_id': knowledge_id, + 'folder_id': request.query_params.get('folder_id'), + 'name': request.query_params.get('name'), + 'desc': request.query_params.get("desc"), + 'user_id': request.query_params.get('user_id') + } + ).page(current_page, page_size)) + class WebDocumentView(APIView): authentication_classes = [TokenAuth]