From 8e299fb2ee399693328331de71a8a3cdb33a7be5 Mon Sep 17 00:00:00 2001 From: "Nasreddin Boulif (bon)" Date: Mon, 27 Feb 2023 15:04:47 +0000 Subject: [PATCH] [FIX] base: fix partner merge wizard Steps to reproduce: - Install `Contacts` module - Create 3 contacts with the same name - Archive one of the contacts - Go to list view - Edit search filter to display archived and non archived contacts - Select the 3 created contacts - Open `Action` menu and click on `Merge` Issues: - Archived partner is set by default as destination partner. - Archived partner is not displayed in the list of partners to merge. Cause: - The default destination partner set is the last record of the record set returned by `_get_ordered_partner` (where `Archived` partners are the last ones in the record set). - The field `partner_ids` does not allow archived records. Solution: - Sort the partners to have the archived ones on top (since we took the last one). - Set `active_test` to False in the context of the partner_ids field. opw-3205577 closes odoo/odoo#114508 X-original-commit: 8d0cec6844b248d3787bd7d6b8868d930d25e38c Signed-off-by: Xavier Morel (xmo) Signed-off-by: Nasreddin Boulif (bon) --- odoo/addons/base/wizard/base_partner_merge.py | 4 ++-- .../test_new_api/tests/test_one2many.py | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/odoo/addons/base/wizard/base_partner_merge.py b/odoo/addons/base/wizard/base_partner_merge.py index 424a731492c..85df8df4506 100644 --- a/odoo/addons/base/wizard/base_partner_merge.py +++ b/odoo/addons/base/wizard/base_partner_merge.py @@ -66,7 +66,7 @@ class MergePartnerAutomatic(models.TransientModel): number_group = fields.Integer('Group of Contacts', readonly=True) current_line_id = fields.Many2one('base.partner.merge.line', string='Current Line') line_ids = fields.One2many('base.partner.merge.line', 'wizard_id', string='Lines') - partner_ids = fields.Many2many('res.partner', string='Contacts') + partner_ids = fields.Many2many('res.partner', string='Contacts', context={'active_test': False}) dst_partner_id = fields.Many2one('res.partner', string='Destination Contact') exclude_contact = fields.Boolean('A user associated to the contact') @@ -429,7 +429,7 @@ class MergePartnerAutomatic(models.TransientModel): :param partner_ids : list of partner ids to sort """ return self.env['res.partner'].browse(partner_ids).sorted( - key=lambda p: (p.active, (p.create_date or datetime.datetime(1970, 1, 1))), + key=lambda p: (not p.active, (p.create_date or datetime.datetime(1970, 1, 1))), reverse=True, ) diff --git a/odoo/addons/test_new_api/tests/test_one2many.py b/odoo/addons/test_new_api/tests/test_one2many.py index 8dfa81c18b6..5b05038eebe 100644 --- a/odoo/addons/test_new_api/tests/test_one2many.py +++ b/odoo/addons/test_new_api/tests/test_one2many.py @@ -169,6 +169,25 @@ class One2manyCase(TransactionCase): self.assertTrue(model2.exists()) self.assertEqual(model2.pArTneR_321_id, p1) + def test_merge_partner_archived(self): + partner = self.env['res.partner'] + + p1 = partner.create({'name': 'test1'}) + p2 = partner.create({'name': 'test2'}) + p3 = partner.create({'name': 'test3', 'active': False}) + partners_ids = (p1 + p2 + p3) + + wizard = self.env['base.partner.merge.automatic.wizard'].with_context(active_ids=partners_ids.ids, active_model='res.partner').create({}) + + self.assertEqual(wizard.partner_ids, partners_ids) + self.assertEqual(wizard.dst_partner_id, p2) + + wizard.action_merge() + + self.assertFalse(p1.exists()) + self.assertTrue(p2.exists()) + self.assertFalse(p3.exists()) + def test_cache_invalidation(self): """ Cache invalidation for one2many with integer inverse. """ record0 = self.env['test_new_api.attachment.host'].create({})