diff --git a/addons/mail/models/mail_activity.py b/addons/mail/models/mail_activity.py index a1eb827db98..4f760baad73 100644 --- a/addons/mail/models/mail_activity.py +++ b/addons/mail/models/mail_activity.py @@ -602,10 +602,14 @@ class MailActivityMixin(models.AbstractModel): activities |= self.env['mail.activity'].create(create_vals) return activities - def activity_reschedule(self, act_type_xmlids, user_id=None, date_deadline=None): + def activity_reschedule(self, act_type_xmlids, user_id=None, date_deadline=None, new_user_id=None): """ Reschedule some automated activities. Activities to reschedule are selected based on type xml ids and optionally by user. Purpose is to be - able to change the deadline, not anything else currently. """ + able to + + * update the deadline to date_deadline; + * update the responsible to new_user_id; + """ if self.env.context.get('mail_activity_automation_skip'): return False @@ -622,9 +626,12 @@ class MailActivityMixin(models.AbstractModel): domain = ['&'] + domain + [('user_id', '=', user_id)] activities = self.env['mail.activity'].search(domain) if activities: - activities.write({ - 'date_deadline': date_deadline, - }) + write_vals = {} + if date_deadline: + write_vals['date_deadline'] = date_deadline + if new_user_id: + write_vals['user_id'] = new_user_id + activities.write(write_vals) return activities def activity_feedback(self, act_type_xmlids, user_id=None, feedback=None): diff --git a/addons/test_mail/tests/test_mail_activity.py b/addons/test_mail/tests/test_mail_activity.py index 7ac2fb5fe95..b29fa7a465b 100644 --- a/addons/test_mail/tests/test_mail_activity.py +++ b/addons/test_mail/tests/test_mail_activity.py @@ -157,6 +157,26 @@ class TestMailActivity(BaseFunctionalTest): self.assertEqual(rec.active, True) self.assertEqual(rec.activity_ids, self.env['mail.activity']) + def test_activity_mixin_reschedule_user(self): + rec = self.test_record.sudo(self.user_employee) + rec.activity_schedule( + 'test_mail.mail_act_test_todo', + user_id=self.user_admin.id) + self.assertEqual(rec.activity_ids[0].user_id, self.user_admin) + + # reschedule its own should not alter other's activities + rec.activity_reschedule( + ['test_mail.mail_act_test_todo'], + user_id=self.user_employee.id, + new_user_id=self.user_employee.id) + self.assertEqual(rec.activity_ids[0].user_id, self.user_admin) + + rec.activity_reschedule( + ['test_mail.mail_act_test_todo'], + user_id=self.user_admin.id, + new_user_id=self.user_employee.id) + self.assertEqual(rec.activity_ids[0].user_id, self.user_employee) + def test_activity_notify_other_user(self): self.user_admin.notification_type = 'email' rec = self.test_record.sudo(self.user_employee)