fix: improve module tree query to use Q object for filtering by workspace_id

This commit is contained in:
CaptainB 2025-04-18 14:31:16 +08:00 committed by 刘瑞斌
parent ac4df1421a
commit 8f0dd16949
4 changed files with 28 additions and 3 deletions

View File

@ -128,6 +128,8 @@ class PermissionConstants(Enum):
RoleConstants.USER])
TOOL_MODULE_EDIT = Permission(group=Group.TOOL, operate=Operate.EDIT, role_list=[RoleConstants.ADMIN,
RoleConstants.USER])
TOOL_MODULE_DELETE = Permission(group=Group.TOOL, operate=Operate.DELETE, role_list=[RoleConstants.ADMIN,
RoleConstants.USER])
TOOL_CREATE = Permission(group=Group.TOOL, operate=Operate.CREATE, role_list=[RoleConstants.ADMIN,
RoleConstants.USER])

View File

@ -83,6 +83,10 @@ class ModuleEditAPI(ModuleReadAPI):
return ModuleEditRequest
class ModuleDeleteAPI(ModuleReadAPI):
pass
class ModuleTreeReadAPI(APIMixin):
@staticmethod
def get_parameters():

View File

@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
import uuid_utils.compat as uuid
from django.db.models import QuerySet
from django.db.models import QuerySet, Q
from django.utils.translation import gettext_lazy as _
from rest_framework import serializers
@ -83,6 +83,13 @@ class ModuleSerializer(serializers.Serializer):
module = QuerySet(Module).filter(id=self.data.get('id')).first()
return ModuleSerializer(module).data
def delete(self):
self.is_valid(raise_exception=True)
if self.data.get('id') == 'root':
raise serializers.ValidationError(_('Cannot delete root module'))
Module = get_module_type(self.data.get('source'))
QuerySet(Module).filter(id=self.data.get('id')).delete()
class ModuleTreeSerializer(serializers.Serializer):
workspace_id = serializers.CharField(required=True, allow_null=True, allow_blank=True, label=_('workspace id'))
@ -91,6 +98,6 @@ class ModuleTreeSerializer(serializers.Serializer):
def get_module_tree(self):
self.is_valid(raise_exception=True)
Module = get_module_type(self.data.get('source'))
nodes = Module.objects.filter(workspace_id=self.data.get('workspace_id')).get_cached_trees()
nodes = Module.objects.filter(Q(workspace_id=self.data.get('workspace_id'))).get_cached_trees()
serializer = ToolModuleTreeSerializer(nodes, many=True)
return serializer.data # 这是可序列化的字典

View File

@ -7,7 +7,7 @@ from common.auth import TokenAuth
from common.auth.authentication import has_permissions
from common.constants.permission_constants import Permission, Group, Operate
from common.result import result
from modules.api.module import ModuleCreateAPI, ModuleEditAPI, ModuleReadAPI, ModuleTreeReadAPI
from modules.api.module import ModuleCreateAPI, ModuleEditAPI, ModuleReadAPI, ModuleTreeReadAPI, ModuleDeleteAPI
from modules.serializers.module import ModuleSerializer, ModuleTreeSerializer
@ -61,6 +61,18 @@ class ModuleView(APIView):
data={'id': module_id, 'workspace_id': workspace_id, 'source': source}
).one())
@extend_schema(methods=['DELETE'],
description=_('Delete module'),
operation_id=_('Delete module'),
parameters=ModuleDeleteAPI.get_parameters(),
tags=[_('Module')])
@has_permissions(lambda r, kwargs: Permission(group=Group(kwargs.get('source')), operate=Operate.DELETE,
resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}"))
def delete(self, request: Request, workspace_id: str, source: str, module_id: str):
return result.success(ModuleSerializer.Operate(
data={'id': module_id, 'workspace_id': workspace_id, 'source': source}
).delete())
class ModuleTreeView(APIView):
authentication_classes = [TokenAuth]