From ead52d72a7c91fcc174e8de9dff3a07a874a870c Mon Sep 17 00:00:00 2001 From: Raouf Date: Fri, 30 Sep 2022 14:40:00 +0000 Subject: [PATCH] [FIX] project: add missing stage when import tasks Before this commit: Let's consider project P1 having no stages. Let's consider project P2 having Stage 1, Stage 2 When importing tasks via csv file: - Task 1 for project P1 and Stage 1 - Task 2 for project P1 and Stage 2 Stage 1 and Stage 2 are still assigned only to project P1. After this commit: Stage 1 and Stage 2 are now assigned to P1 and P2. Task-2996393 closes odoo/odoo#103819 X-original-commit: 2e6a7741dd2c993daa1b1aafe4ebd422cd57235c Signed-off-by: Xavier --- addons/project/models/project.py | 11 ++++++++++- addons/project/tests/test_project_base.py | 19 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/addons/project/models/project.py b/addons/project/models/project.py index 473a73f670e..6e968c3e8ef 100644 --- a/addons/project/models/project.py +++ b/addons/project/models/project.py @@ -1931,7 +1931,16 @@ class Task(models.Model): project_id = vals.get('project_id') if project_id: self = self.with_context(default_project_id=project_id) - return super()._load_records_create(vals_list) + tasks = super()._load_records_create(vals_list) + stage_ids_per_project = defaultdict(list) + for task in tasks: + if task.stage_id and task.stage_id not in task.project_id.type_ids and task.stage_id.id not in stage_ids_per_project[task.project_id]: + stage_ids_per_project[task.project_id].append(task.stage_id.id) + + for project, stage_ids in stage_ids_per_project.items(): + project.write({'type_ids': [Command.link(stage_id) for stage_id in stage_ids]}) + + return tasks @api.model_create_multi def create(self, vals_list): diff --git a/addons/project/tests/test_project_base.py b/addons/project/tests/test_project_base.py index dfd3f200d38..acc99100230 100644 --- a/addons/project/tests/test_project_base.py +++ b/addons/project/tests/test_project_base.py @@ -120,3 +120,22 @@ class TestProjectBase(TestProjectCommon): project_unlink.unlink() self.assertNotEqual(task_count, 0, "The all tasks linked to project should be deleted when user delete the project") + + def test_auto_assign_stages_when_importing_tasks(self): + self.assertFalse(self.project_pigs.type_ids) + self.assertEqual(len(self.project_goats.type_ids), 2) + first_stage = self.project_goats.type_ids[0] + self.env['project.task']._load_records_create([{ + 'name': 'First Task', + 'project_id': self.project_pigs.id, + 'stage_id': first_stage.id, + }]) + self.assertEqual(self.project_pigs.type_ids, first_stage) + self.env['project.task']._load_records_create([ + { + 'name': 'task', + 'project_id': self.project_pigs.id, + 'stage_id': stage.id, + } for stage in self.project_goats.type_ids + ]) + self.assertEqual(self.project_pigs.type_ids, self.project_goats.type_ids)