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]) RoleConstants.USER])
TOOL_MODULE_EDIT = Permission(group=Group.TOOL, operate=Operate.EDIT, role_list=[RoleConstants.ADMIN, TOOL_MODULE_EDIT = Permission(group=Group.TOOL, operate=Operate.EDIT, role_list=[RoleConstants.ADMIN,
RoleConstants.USER]) 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, TOOL_CREATE = Permission(group=Group.TOOL, operate=Operate.CREATE, role_list=[RoleConstants.ADMIN,
RoleConstants.USER]) RoleConstants.USER])

View File

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

View File

@ -1,7 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import uuid_utils.compat as uuid 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 django.utils.translation import gettext_lazy as _
from rest_framework import serializers from rest_framework import serializers
@ -83,6 +83,13 @@ class ModuleSerializer(serializers.Serializer):
module = QuerySet(Module).filter(id=self.data.get('id')).first() module = QuerySet(Module).filter(id=self.data.get('id')).first()
return ModuleSerializer(module).data 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): class ModuleTreeSerializer(serializers.Serializer):
workspace_id = serializers.CharField(required=True, allow_null=True, allow_blank=True, label=_('workspace id')) 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): def get_module_tree(self):
self.is_valid(raise_exception=True) self.is_valid(raise_exception=True)
Module = get_module_type(self.data.get('source')) 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) serializer = ToolModuleTreeSerializer(nodes, many=True)
return serializer.data # 这是可序列化的字典 return serializer.data # 这是可序列化的字典

View File

@ -7,7 +7,7 @@ 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.result import result 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 from modules.serializers.module import ModuleSerializer, ModuleTreeSerializer
@ -61,6 +61,18 @@ class ModuleView(APIView):
data={'id': module_id, 'workspace_id': workspace_id, 'source': source} data={'id': module_id, 'workspace_id': workspace_id, 'source': source}
).one()) ).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): class ModuleTreeView(APIView):
authentication_classes = [TokenAuth] authentication_classes = [TokenAuth]