diff --git a/addons/mail/models/mail_activity.py b/addons/mail/models/mail_activity.py index a976bb318ccda..b4cf2a2fee5dd 100644 --- a/addons/mail/models/mail_activity.py +++ b/addons/mail/models/mail_activity.py @@ -532,19 +532,8 @@ def _action_done(self, feedback=False, attachment_ids=None): for activity in self: # extract value to generate next activities if activity.chaining_type == 'trigger': - Activity = self.env['mail.activity'].with_context(activity_previous_deadline=activity.date_deadline) # context key is required in the onchange to set deadline - vals = Activity.default_get(Activity.fields_get()) - - vals.update({ - 'previous_activity_type_id': activity.activity_type_id.id, - 'res_id': activity.res_id, - 'res_model': activity.res_model, - 'res_model_id': self.env['ir.model']._get(activity.res_model).id, - }) - virtual_activity = Activity.new(vals) - virtual_activity._onchange_previous_activity_type_id() - virtual_activity._onchange_activity_type_id() - next_activities_values.append(virtual_activity._convert_to_write(virtual_activity._cache)) + vals = activity.with_context(activity_previous_deadline=activity.date_deadline)._prepare_next_activity_values() + next_activities_values.append(vals) # post message on activity, before deleting it record = self.env[activity.res_model].browse(activity.res_id) @@ -633,3 +622,25 @@ def get_activity_data(self, res_model, domain): 'activity_res_ids': sorted(res_id_to_deadline, key=lambda item: res_id_to_deadline[item]), 'grouped_activities': activity_data, } + + # ---------------------------------------------------------------------- + # TOOLS + # ---------------------------------------------------------------------- + + def _prepare_next_activity_values(self): + """ Prepare the next activity values based on the current activity record and applies _onchange methods + :returns a dict of values for the new activity + """ + self.ensure_one() + vals = self.default_get(self.fields_get()) + + vals.update({ + 'previous_activity_type_id': self.activity_type_id.id, + 'res_id': self.res_id, + 'res_model': self.res_model, + 'res_model_id': self.env['ir.model']._get(self.res_model).id, + }) + virtual_activity = self.new(vals) + virtual_activity._onchange_previous_activity_type_id() + virtual_activity._onchange_activity_type_id() + return virtual_activity._convert_to_write(virtual_activity._cache) diff --git a/addons/test_mail/data/data.xml b/addons/test_mail/data/data.xml index e0e1b65f85f71..01e6b0325417a 100644 --- a/addons/test_mail/data/data.xml +++ b/addons/test_mail/data/data.xml @@ -19,5 +19,21 @@ default mail.test.activity + + Step 2 + Take the second step. + default + mail.test.activity + 10 + current_date + + + Step 1 + Take the first step. + default + mail.test.activity + trigger + + diff --git a/addons/test_mail/tests/test_mail_activity.py b/addons/test_mail/tests/test_mail_activity.py index abd1e1682e27d..51f65f12d4f70 100644 --- a/addons/test_mail/tests/test_mail_activity.py +++ b/addons/test_mail/tests/test_mail_activity.py @@ -266,6 +266,27 @@ def test_action_feedback_attachment(self): self.assertEqual(attachment.res_id, activity_message.id) self.assertEqual(attachment.res_model, activity_message._name) + def test_chained_activities(self): + Partner = self.env['ir.model']._get('res.partner') + partner = self.env['res.partner'].create({ + 'name': 'Tester', + }) + chained_activity = self.env['mail.activity'].create({ + 'summary': 'Test', + 'activity_type_id': self.env.ref('test_mail.mail_act_test_chained_1').id, + 'res_model_id': Partner.id, + 'res_id': partner.id, + }) + chained_activity.action_feedback(feedback='Done') + + self.assertFalse(chained_activity.exists()) + + next_activity = partner.activity_ids + + self.assertNotEqual(chained_activity.id, next_activity.id) + self.assertEqual(next_activity.summary, 'Take the second step.') + self.assertEqual(next_activity.date_deadline, date.today() + relativedelta(days=10)) + @tests.tagged('mail_activity') class TestActivityMixin(TestActivityCommon):