diff --git a/addons/mail/models/mail_activity.py b/addons/mail/models/mail_activity.py index f09de56ed78..6241cd61083 100644 --- a/addons/mail/models/mail_activity.py +++ b/addons/mail/models/mail_activity.py @@ -453,6 +453,20 @@ class MailActivityMixin(models.AbstractModel): ).unlink() return result + @api.multi + def toggle_active(self): + """ Before archiving the record we should also remove its ongoing + activities. Otherwise they stay in the systray and concerning archived + records it makes no sense. """ + record_to_deactivate = self.filtered(lambda rec: rec.active) + if record_to_deactivate: + # use a sudo to bypass every access rights; all activities should be removed + self.env['mail.activity'].sudo().search([ + ('res_model', '=', self._name), + ('res_id', 'in', record_to_deactivate.ids) + ]).unlink() + return super(MailActivityMixin, self).toggle_active() + def activity_schedule(self, act_type_xmlid='', date_deadline=None, summary='', note='', **act_values): """ Schedule an activity on each record of the current record set. This method allow to provide as parameter act_type_xmlid. This is an diff --git a/addons/test_mail/tests/test_mail_activity.py b/addons/test_mail/tests/test_mail_activity.py index fd584bbb759..7ac2fb5fe95 100644 --- a/addons/test_mail/tests/test_mail_activity.py +++ b/addons/test_mail/tests/test_mail_activity.py @@ -144,6 +144,19 @@ class TestMailActivity(BaseFunctionalTest): self.assertEqual(self.test_record.activity_ids, self.env['mail.activity']) self.assertEqual(len(self.test_record.message_ids), 2) + def test_activity_mixin_archive(self): + rec = self.test_record.sudo(self.user_employee) + new_act = rec.activity_schedule( + 'test_mail.mail_act_test_todo', + user_id=self.user_admin.id) + self.assertEqual(rec.activity_ids, new_act) + rec.toggle_active() + self.assertEqual(rec.active, False) + self.assertEqual(rec.activity_ids, self.env['mail.activity']) + rec.toggle_active() + self.assertEqual(rec.active, True) + self.assertEqual(rec.activity_ids, self.env['mail.activity']) + def test_activity_notify_other_user(self): self.user_admin.notification_type = 'email' rec = self.test_record.sudo(self.user_employee)