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)