diff --git a/addons/project/models/project_task.py b/addons/project/models/project_task.py index 7e3d5f7fb91..571786088ae 100644 --- a/addons/project/models/project_task.py +++ b/addons/project/models/project_task.py @@ -1049,8 +1049,10 @@ class Task(models.Model): recurrence = self.env['project.task.recurrence'].create(rec_values) task.recurrence_id = recurrence.id - if 'recurring_task' in vals and not vals.get('recurring_task'): + if not vals.get('recurring_task', True) and self.recurrence_id: + tasks_in_recurrence = self.recurrence_id.task_ids self.recurrence_id.unlink() + tasks_in_recurrence.write({'recurring_task': False}) # The sudo is required for a portal user as the record update # requires the write access on others models, as rating.rating diff --git a/addons/project/tests/test_project_recurrence.py b/addons/project/tests/test_project_recurrence.py index 361ee25490a..2d3417110ce 100644 --- a/addons/project/tests/test_project_recurrence.py +++ b/addons/project/tests/test_project_recurrence.py @@ -117,3 +117,32 @@ class TestProjectRecurrence(TransactionCase): .create({'group_project_recurring_tasks': False}) \ .execute() self.assertFalse(test_task.recurring_task, 'The "Recurring" feature should not be enabled by default.') + + def test_disabling_recurrence(self): + """ + Disabling the recurrence of one task in a recurrence suite should disable *all* + recurrences option on the tasks linked to that recurrence + """ + with freeze_time(self.date_01_01): + form = Form(self.env['project.task']) + form.name = 'test recurring task' + form.project_id = self.project_recurring + form.recurring_task = True + form.repeat_interval = 5 + form.repeat_unit = 'day' + form.repeat_type = 'forever' + task = form.save() + + with freeze_time(self.date_01_01 + relativedelta(day=1)): + task.state = '1_done' + other_task = self.project_recurring.task_ids - task + + with freeze_time(self.date_01_01 + relativedelta(day=2)): + other_task.state = '1_done' + + task_c, task_b, task_a = self.env['project.task'].search([('project_id', '=', self.project_recurring.id)]) + + task_b.recurring_task = False + + self.assertFalse(any((task_a + task_b + task_c).mapped('recurring_task')), + "All tasks in the recurrence should have their recurrence disabled")