diff --git a/apps/folders/serializers/folder.py b/apps/folders/serializers/folder.py index 1aad31cc466..7b3b9477492 100644 --- a/apps/folders/serializers/folder.py +++ b/apps/folders/serializers/folder.py @@ -245,9 +245,13 @@ def edit(self, instance): and current_node.parent_id != parent_id ): source_type = self.data.get("source") - if has_target_permission( - current_node.workspace_id, source_type, self.data.get("user_id"), parent_id - ) or is_workspace_manage(self.data.get("user_id"), current_node.workspace_id): + if ( + parent_id == current_node.workspace_id + or has_target_permission( + current_node.workspace_id, source_type, self.data.get("user_id"), parent_id + ) + or is_workspace_manage(self.data.get("user_id"), current_node.workspace_id) + ): current_depth = get_max_depth(current_node) check_depth(self.data.get("source"), parent_id, current_node.workspace_id, current_depth) parent = Folder.objects.get(id=parent_id) diff --git a/apps/folders/tests/test_mptt_compatibility.py b/apps/folders/tests/test_mptt_compatibility.py index 0190ae00052..bdf5879aa82 100644 --- a/apps/folders/tests/test_mptt_compatibility.py +++ b/apps/folders/tests/test_mptt_compatibility.py @@ -76,6 +76,18 @@ def test_serializer_moves_a_subtree_without_losing_descendants(self, _permission self.assertEqual(list(leaf.get_ancestors().values_list("id", flat=True)), [root.id, right.id, left.id]) self.assert_valid_tree(model, root.workspace_id) + @patch("folders.serializers.folder.is_workspace_manage", return_value=False) + @patch("folders.serializers.folder.has_target_permission", return_value=False) + def test_regular_user_can_move_subfolder_to_workspace_root(self, _target_permission, _workspace_manage): + for source, model in self.folder_types: + with self.subTest(source=source): + root, _, _, leaf = self.make_tree(model) + result = self.operation(source, leaf).edit({"parent_id": root.id}) + self.assertEqual(result["parent_id"], root.id) + leaf.refresh_from_db() + self.assertEqual(leaf.parent_id, root.id) + self.assert_valid_tree(model, root.workspace_id) + def test_move_to_refreshes_instances_loaded_before_another_move(self): for source, model in self.folder_types: with self.subTest(source=source):