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):