[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) <xbo@odoo.com>
This commit is contained in:
Thomas Lefebvre (thle)
2023-09-27 17:41:02 +00:00
parent 7032917771
commit bbb452dd39
2 changed files with 59 additions and 0 deletions
+7
View File
@@ -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)
@@ -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")