Skip to content

Commit 8f0dd16

Browse files
committed
fix: improve module tree query to use Q object for filtering by workspace_id
1 parent ac4df14 commit 8f0dd16

File tree

4 files changed

+28
-3
lines changed

4 files changed

+28
-3
lines changed

apps/common/constants/permission_constants.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@ class PermissionConstants(Enum):
128128
RoleConstants.USER])
129129
TOOL_MODULE_EDIT = Permission(group=Group.TOOL, operate=Operate.EDIT, role_list=[RoleConstants.ADMIN,
130130
RoleConstants.USER])
131+
TOOL_MODULE_DELETE = Permission(group=Group.TOOL, operate=Operate.DELETE, role_list=[RoleConstants.ADMIN,
132+
RoleConstants.USER])
131133

132134
TOOL_CREATE = Permission(group=Group.TOOL, operate=Operate.CREATE, role_list=[RoleConstants.ADMIN,
133135
RoleConstants.USER])

apps/modules/api/module.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,10 @@ def get_request():
8383
return ModuleEditRequest
8484

8585

86+
class ModuleDeleteAPI(ModuleReadAPI):
87+
pass
88+
89+
8690
class ModuleTreeReadAPI(APIMixin):
8791
@staticmethod
8892
def get_parameters():

apps/modules/serializers/module.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# -*- coding: utf-8 -*-
22

33
import uuid_utils.compat as uuid
4-
from django.db.models import QuerySet
4+
from django.db.models import QuerySet, Q
55
from django.utils.translation import gettext_lazy as _
66
from rest_framework import serializers
77

@@ -83,6 +83,13 @@ def one(self):
8383
module = QuerySet(Module).filter(id=self.data.get('id')).first()
8484
return ModuleSerializer(module).data
8585

86+
def delete(self):
87+
self.is_valid(raise_exception=True)
88+
if self.data.get('id') == 'root':
89+
raise serializers.ValidationError(_('Cannot delete root module'))
90+
Module = get_module_type(self.data.get('source'))
91+
QuerySet(Module).filter(id=self.data.get('id')).delete()
92+
8693

8794
class ModuleTreeSerializer(serializers.Serializer):
8895
workspace_id = serializers.CharField(required=True, allow_null=True, allow_blank=True, label=_('workspace id'))
@@ -91,6 +98,6 @@ class ModuleTreeSerializer(serializers.Serializer):
9198
def get_module_tree(self):
9299
self.is_valid(raise_exception=True)
93100
Module = get_module_type(self.data.get('source'))
94-
nodes = Module.objects.filter(workspace_id=self.data.get('workspace_id')).get_cached_trees()
101+
nodes = Module.objects.filter(Q(workspace_id=self.data.get('workspace_id'))).get_cached_trees()
95102
serializer = ToolModuleTreeSerializer(nodes, many=True)
96103
return serializer.data # 这是可序列化的字典

apps/modules/views/module.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from common.auth.authentication import has_permissions
88
from common.constants.permission_constants import Permission, Group, Operate
99
from common.result import result
10-
from modules.api.module import ModuleCreateAPI, ModuleEditAPI, ModuleReadAPI, ModuleTreeReadAPI
10+
from modules.api.module import ModuleCreateAPI, ModuleEditAPI, ModuleReadAPI, ModuleTreeReadAPI, ModuleDeleteAPI
1111
from modules.serializers.module import ModuleSerializer, ModuleTreeSerializer
1212

1313

@@ -61,6 +61,18 @@ def get(self, request: Request, workspace_id: str, source: str, module_id: str):
6161
data={'id': module_id, 'workspace_id': workspace_id, 'source': source}
6262
).one())
6363

64+
@extend_schema(methods=['DELETE'],
65+
description=_('Delete module'),
66+
operation_id=_('Delete module'),
67+
parameters=ModuleDeleteAPI.get_parameters(),
68+
tags=[_('Module')])
69+
@has_permissions(lambda r, kwargs: Permission(group=Group(kwargs.get('source')), operate=Operate.DELETE,
70+
resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}"))
71+
def delete(self, request: Request, workspace_id: str, source: str, module_id: str):
72+
return result.success(ModuleSerializer.Operate(
73+
data={'id': module_id, 'workspace_id': workspace_id, 'source': source}
74+
).delete())
75+
6476

6577
class ModuleTreeView(APIView):
6678
authentication_classes = [TokenAuth]

0 commit comments

Comments
 (0)