diff --git a/apps/common/constants/permission_constants.py b/apps/common/constants/permission_constants.py index 21de8b16c..ab6a54a44 100644 --- a/apps/common/constants/permission_constants.py +++ b/apps/common/constants/permission_constants.py @@ -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]) diff --git a/apps/modules/api/module.py b/apps/modules/api/module.py index 27a3d5fab..73a7e513d 100644 --- a/apps/modules/api/module.py +++ b/apps/modules/api/module.py @@ -83,6 +83,10 @@ class ModuleEditAPI(ModuleReadAPI): return ModuleEditRequest +class ModuleDeleteAPI(ModuleReadAPI): + pass + + class ModuleTreeReadAPI(APIMixin): @staticmethod def get_parameters(): diff --git a/apps/modules/serializers/module.py b/apps/modules/serializers/module.py index 98d947505..85b8e9c5f 100644 --- a/apps/modules/serializers/module.py +++ b/apps/modules/serializers/module.py @@ -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 # 这是可序列化的字典 diff --git a/apps/modules/views/module.py b/apps/modules/views/module.py index d1353a2b3..ea883b9ab 100644 --- a/apps/modules/views/module.py +++ b/apps/modules/views/module.py @@ -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]