From 417ead3465c3eb356bb529227db64ba9a75f63fa Mon Sep 17 00:00:00 2001
From: Raf Ven <raf.ven@dynapps.be>
Date: Thu, 3 Jun 2021 09:04:16 +0000
Subject: [PATCH] [IMP] base: merge activities of merged partners

When merging partners through the ``base.partner.merge.automatic.wizard``
wizard, messages and followers are merged. However activities are not
probably because its underlying model is "newer" then messages and followers.

This commits fixes that behavior.

Task-2641572
PR odoo#76159
Closes #71654

Part-of: odoo/odoo#76159
Co-authored-by: Thibault Delavallee <tde@odoo.com>
---
 addons/mail/tests/test_res_partner.py         | 49 ++++++++++++++++++-
 odoo/addons/base/wizard/base_partner_merge.py |  1 +
 2 files changed, 48 insertions(+), 2 deletions(-)

diff --git a/addons/mail/tests/test_res_partner.py b/addons/mail/tests/test_res_partner.py
index de6359305122..97828c0981df 100644
--- a/addons/mail/tests/test_res_partner.py
+++ b/addons/mail/tests/test_res_partner.py
@@ -1,10 +1,11 @@
 # -*- coding: utf-8 -*-
 # Part of Odoo. See LICENSE file for full copyright and licensing details.
 
-from odoo.tests.common import TransactionCase
+from odoo.addons.mail.tests.common import MailCommon
+from odoo.tests.common import Form, users
 
 
-class TestPartner(TransactionCase):
+class TestPartner(MailCommon):
 
     def test_res_partner_find_or_create(self):
         Partner = self.env['res.partner']
@@ -25,3 +26,47 @@ class TestPartner(TransactionCase):
         self.assertEqual(new2.name, 'Patrick Caché')
         self.assertEqual(new2.email, '2patrick@example.com')
         self.assertEqual(new2.email_normalized, '2patrick@example.com')
+
+    @users('admin')
+    def test_res_partner_merge_wizards(self):
+        Partner = self.env['res.partner']
+
+        p1 = Partner.create({'name': 'Customer1', 'email': 'test1@test.example.com'})
+        p1_msg_ids_init = p1.message_ids
+        p2 = Partner.create({'name': 'Customer2', 'email': 'test2@test.example.com'})
+        p2_msg_ids_init = p2.message_ids
+        p3 = Partner.create({'name': 'Other (dup email)', 'email': 'test1@test.example.com'})
+
+        # add some mail related documents
+        p1.message_subscribe(partner_ids=p3.ids)
+        p1_act1 = p1.activity_schedule(act_type_xmlid='mail.mail_activity_data_todo')
+        p1_msg1 = p1.message_post(
+            body='<p>Log on P1</p>',
+            subtype_id=self.env.ref('mail.mt_comment').id
+        )
+        self.assertEqual(p1.activity_ids, p1_act1)
+        self.assertEqual(p1.message_follower_ids.partner_id, self.partner_admin + p3)
+        self.assertEqual(p1.message_ids, p1_msg_ids_init + p1_msg1)
+        self.assertEqual(p2.activity_ids, self.env['mail.activity'])
+        self.assertEqual(p2.message_follower_ids.partner_id, self.partner_admin)
+        self.assertEqual(p2.message_ids, p2_msg_ids_init)
+
+        MergeForm = Form(self.env['base.partner.merge.automatic.wizard'].with_context(
+            active_model='res.partner',
+            active_ids=(p1 + p2).ids
+        ))
+        self.assertEqual(MergeForm.partner_ids[:], p1 + p2)
+        self.assertEqual(MergeForm.dst_partner_id, p2)
+        merge_form = MergeForm.save()
+        merge_form.action_merge()
+
+        # check destination and removal
+        self.assertFalse(p1.exists())
+        self.assertTrue(p2.exists())
+        # check mail documents have been moved
+        self.assertEqual(p2.activity_ids, p1_act1)
+        # TDE note: currently not working as soon as there is a single partner duplicated -> should be improved
+        # self.assertEqual(p2.message_follower_ids.partner_id, self.partner_admin + p3)
+        all_msg = p2_msg_ids_init + p1_msg_ids_init + p1_msg1
+        self.assertEqual(len(p2.message_ids), len(all_msg) + 1, 'Should have original messages + a log')
+        self.assertTrue(all(msg in p2.message_ids for msg in all_msg))
diff --git a/odoo/addons/base/wizard/base_partner_merge.py b/odoo/addons/base/wizard/base_partner_merge.py
index 484964e35585..e40908e965a0 100644
--- a/odoo/addons/base/wizard/base_partner_merge.py
+++ b/odoo/addons/base/wizard/base_partner_merge.py
@@ -204,6 +204,7 @@ class MergePartnerAutomatic(models.TransientModel):
             update_records('calendar', src=partner, field_model='model_id.model')
             update_records('ir.attachment', src=partner, field_model='res_model')
             update_records('mail.followers', src=partner, field_model='res_model')
+            update_records('mail.activity', src=partner, field_model='res_model')
             update_records('mail.message', src=partner)
             update_records('ir.model.data', src=partner)
 
-- 
GitLab