From 3c31fbd52723a80074356de4eebed2d7b48a4193 Mon Sep 17 00:00:00 2001 From: CaptainB Date: Thu, 6 Nov 2025 16:07:31 +0800 Subject: [PATCH] feat: add KnowledgeWorkflowModelSerializer and Operate class for workflow management --- .../serializers/knowledge_workflow.py | 20 +++++- apps/knowledge/urls.py | 1 + apps/knowledge/views/knowledge_workflow.py | 63 ++++++++++++++++++- 3 files changed, 81 insertions(+), 3 deletions(-) diff --git a/apps/knowledge/serializers/knowledge_workflow.py b/apps/knowledge/serializers/knowledge_workflow.py index d41362c28..c849ac8ef 100644 --- a/apps/knowledge/serializers/knowledge_workflow.py +++ b/apps/knowledge/serializers/knowledge_workflow.py @@ -15,6 +15,12 @@ from system_manage.models import AuthTargetType from system_manage.serializers.user_resource_permission import UserResourcePermissionSerializer +class KnowledgeWorkflowModelSerializer(serializers.ModelSerializer): + class Meta: + model = KnowledgeWorkflow + fields = '__all__' + + class KnowledgeWorkflowSerializer(serializers.Serializer): class Create(serializers.Serializer): user_id = serializers.UUIDField(required=True, label=_('user id')) @@ -59,9 +65,21 @@ class KnowledgeWorkflowSerializer(serializers.Serializer): knowledge_id=knowledge_id, workspace_id=self.data.get('workspace_id'), work_flow=instance.get('work_flow', {}), - ) knowledge_workflow.save() return {**KnowledgeModelSerializer(knowledge).data, 'document_list': []} + + class Operate(serializers.Serializer): + user_id = serializers.UUIDField(required=True, label=_('user id')) + workspace_id = serializers.CharField(required=True, label=_('workspace id')) + knowledge_id = serializers.UUIDField(required=True, label=_('knowledge id')) + + def edit(self, instance: Dict): + pass + + def one(self): + self.is_valid(raise_exception=True) + workflow = QuerySet(KnowledgeWorkflow).filter(knowledge_id=self.data.get('knowledge_id')).first() + return {**KnowledgeWorkflowModelSerializer(workflow).data} diff --git a/apps/knowledge/urls.py b/apps/knowledge/urls.py index 1ba3d59de..1ff53a9cf 100644 --- a/apps/knowledge/urls.py +++ b/apps/knowledge/urls.py @@ -16,6 +16,7 @@ urlpatterns = [ path('workspace//knowledge/tags', views.KnowledgeView.Tags.as_view()), path('workspace//knowledge/', views.KnowledgeView.Operate.as_view()), path('workspace//knowledge//sync', views.KnowledgeView.SyncWeb.as_view()), + path('workspace//knowledge//workfolw', views.KnowledgeWorkflowView.Operate.as_view()), path('workspace//knowledge//generate_related', views.KnowledgeView.GenerateRelated.as_view()), path('workspace//knowledge//embedding', views.KnowledgeView.Embedding.as_view()), path('workspace//knowledge//hit_test', views.KnowledgeView.HitTest.as_view()), diff --git a/apps/knowledge/views/knowledge_workflow.py b/apps/knowledge/views/knowledge_workflow.py index 1b8b47ddb..539a1e957 100644 --- a/apps/knowledge/views/knowledge_workflow.py +++ b/apps/knowledge/views/knowledge_workflow.py @@ -7,9 +7,12 @@ from rest_framework.views import APIView from common.auth import TokenAuth from common.auth.authentication import has_permissions -from common.constants.permission_constants import PermissionConstants, RoleConstants +from common.constants.permission_constants import PermissionConstants, RoleConstants, ViewPermission, CompareConstants +from common.log.log import log from common.result import result from knowledge.api.knowledge_workflow import KnowledgeWorkflowApi +from knowledge.serializers.common import get_knowledge_operation_object +from knowledge.serializers.knowledge import KnowledgeSerializer from knowledge.serializers.knowledge_workflow import KnowledgeWorkflowSerializer @@ -17,7 +20,7 @@ class KnowledgeWorkflowView(APIView): authentication_classes = [TokenAuth] @extend_schema( - methods=['GET'], + methods=['POST'], description=_('Create knowledge workflow'), summary=_('Create knowledge workflow'), operation_id=_('Create knowledge workflow'), # type: ignore @@ -34,6 +37,62 @@ class KnowledgeWorkflowView(APIView): data={'user_id': request.user.id, 'workspace_id': workspace_id} ).save_workflow(request.data)) + class Operate(APIView): + authentication_classes = [TokenAuth] + + @extend_schema( + methods=['PUT'], + description=_('Edit knowledge workflow'), + summary=_('Edit knowledge workflow'), + operation_id=_('Edit knowledge workflow'), # type: ignore + parameters=KnowledgeWorkflowApi.get_parameters(), + request=KnowledgeWorkflowApi.get_request(), + responses=KnowledgeWorkflowApi.get_response(), + tags=[_('Knowledge Base')] # type: ignore + ) + @has_permissions( + PermissionConstants.KNOWLEDGE_EDIT.get_workspace_knowledge_permission(), + PermissionConstants.KNOWLEDGE_EDIT.get_workspace_permission_workspace_manage_role(), + RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), + ViewPermission( + [RoleConstants.USER.get_workspace_role()], + [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], + CompareConstants.AND + ) + ) + @log( + menu='Knowledge Base', operate="Modify knowledge workflow", + 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): + return result.success(KnowledgeWorkflowSerializer.Operate( + data={'user_id': request.user.id, 'workspace_id': workspace_id, 'knowledge_id': knowledge_id} + ).edit(request.data)) + + @extend_schema( + methods=['GET'], + description=_('Get knowledge workflow'), + summary=_('Get knowledge workflow'), + operation_id=_('Get knowledge workflow'), # type: ignore + parameters=KnowledgeWorkflowApi.get_parameters(), + responses=KnowledgeWorkflowApi.get_response(), + tags=[_('Knowledge Base')] # type: ignore + ) + @has_permissions( + PermissionConstants.KNOWLEDGE_READ.get_workspace_knowledge_permission(), + PermissionConstants.KNOWLEDGE_READ.get_workspace_permission_workspace_manage_role(), + RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), + ViewPermission( + [RoleConstants.USER.get_workspace_role()], + [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], + CompareConstants.AND + ), + ) + def get(self, request: Request, workspace_id: str, knowledge_id: str): + return result.success(KnowledgeWorkflowSerializer.Operate( + data={'user_id': request.user.id, 'workspace_id': workspace_id, 'knowledge_id': knowledge_id} + ).one()) + class KnowledgeWorkflowVersionView(APIView): pass