From bbb452dd39afd54135c96507ba6bb7012b3143ed Mon Sep 17 00:00:00 2001 From: "Thomas Lefebvre (thle)" Date: Thu, 31 Aug 2023 09:14:22 +0000 Subject: [PATCH] [FIX] project: avoid modify `display_in_project` during duplication Version: -------- - saas-16.4 only Issue: ------ When a project is duplicated, all tasks and sub-tasks are visible in the new project's kanban view. Cause: ------ When writing `project.write({'tasks': [Command.set(new_tasks.ids)]})`, we trigger an inverse which writes the `project_id` field to the tasks. This will set the value of `display_in_project` to `True`. Solution: --------- Rewrite the `display_in_project` field if necessary. opw-3479714 closes odoo/odoo#136527 X-original-commit: 6f62d156b65b331a0a15406a90b174c265100491 Signed-off-by: Xavier Bol (xbo) --- addons/project/models/project_project.py | 7 +++ addons/project/tests/test_project_subtasks.py | 52 +++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/addons/project/models/project_project.py b/addons/project/models/project_project.py index fd876ae9577..fb99ddd59cc 100644 --- a/addons/project/models/project_project.py +++ b/addons/project/models/project_project.py @@ -399,7 +399,14 @@ class Project(models.Model): # preserve task name and stage, normally altered during copy defaults = self._map_tasks_default_valeus(task, project) new_tasks |= task.copy(defaults) + all_subtasks = new_tasks._get_all_subtasks() + subtasks_not_displayed = all_subtasks.filtered( + lambda task: not task.display_in_project + ) project.write({'tasks': [Command.set(new_tasks.ids)]}) + subtasks_not_displayed.write({ + 'display_in_project': False + }) return True @api.returns('self', lambda value: value.id) diff --git a/addons/project/tests/test_project_subtasks.py b/addons/project/tests/test_project_subtasks.py index 7aa94c5a5cf..8753808a40c 100644 --- a/addons/project/tests/test_project_subtasks.py +++ b/addons/project/tests/test_project_subtasks.py @@ -255,3 +255,55 @@ class TestProjectSubtasks(TestProjectCommon): self.assertEqual(task.subtask_count, 1, "Parent task should have 1 children") task_2 = task.copy() self.assertEqual(task_2.subtask_count, 1, "If the parent task is duplicated then the sub task should be copied") + + def test_subtask_copy_display_in_project(self): + """ + Check if `display_in_project` of subtask is not set to `True` during copy + """ + project = self.env['project.project'].create({ + 'name': 'Project', + }) + task_A, task_B = self.env['project.task'].create([ + { + 'name': 'Task A', + 'project_id': project.id, + 'display_in_project': True, + }, + { + 'name': 'Task B', + 'project_id': project.id, + 'display_in_project': True, + }, + ]) + self.env['project.task'].create([ + { + 'name': 'Subtask A 1', + 'parent_id': task_A.id, + 'project_id': project.id, + 'display_in_project': False, + }, + { + 'name': 'Subtask A 2', + 'parent_id': task_A.id, + 'project_id': project.id, + 'display_in_project': False, + }, + { + 'name': 'Subtask B 1', + 'parent_id': task_B.id, + 'project_id': project.id, + 'display_in_project': False, + }, + { + 'name': 'Subtask B 2', + 'parent_id': task_B.id, + 'project_id': project.id, + 'display_in_project': False, + } + ]) + subtask_not_display_in_project = project.task_ids.child_ids.filtered(lambda t: not t.display_in_project) + self.assertEqual(len(subtask_not_display_in_project), 4, "No subtask should be displayed in the project") + project_copy = project.copy() + self.assertEqual(len(project_copy.task_ids.child_ids), 4) + subtask_not_display_in_project_copy = project_copy.task_ids.child_ids.filtered(lambda t: not t.display_in_project) + self.assertEqual(len(subtask_not_display_in_project_copy), 4, "No subtask should be displayed in the duplicate project")