[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:
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user