diff --git a/mass_mailing_list_dynamic/models/mail_mass_mailing_contact.py b/mass_mailing_list_dynamic/models/mail_mass_mailing_contact.py index b080487e5..da38cbc4f 100644 --- a/mass_mailing_list_dynamic/models/mail_mass_mailing_contact.py +++ b/mass_mailing_list_dynamic/models/mail_mass_mailing_contact.py @@ -11,7 +11,10 @@ class MassMailingContact(models.Model): _inherit = "mail.mass_mailing.contact" def _check_dynamic_full_sync_list(self, mailing_list): - if mailing_list.dynamic and mailing_list.sync_method == "full": + if ( + mailing_list.dynamic and mailing_list.sync_method == "full" + and not self.env.context.get("bypass_dynamic_list_check") + ): raise ValidationError(_( "Cannot edit manually contacts in a fully " "synchronized list. Change its sync method or execute " diff --git a/mass_mailing_list_dynamic/readme/CONTRIBUTORS.rst b/mass_mailing_list_dynamic/readme/CONTRIBUTORS.rst index 58843eb22..c54469b89 100644 --- a/mass_mailing_list_dynamic/readme/CONTRIBUTORS.rst +++ b/mass_mailing_list_dynamic/readme/CONTRIBUTORS.rst @@ -1,6 +1,7 @@ * `Tecnativa `_: - * Jairo Llopis - * Pedro M. Baeza - * David Vidal - * Victor M.M. Torres + * Jairo Llopis + * Pedro M. Baeza + * David Vidal + * Victor M.M. Torres + * Victor Nartínez diff --git a/mass_mailing_list_dynamic/tests/test_dynamic_lists.py b/mass_mailing_list_dynamic/tests/test_dynamic_lists.py index 6f24648bf..f9722bf77 100644 --- a/mass_mailing_list_dynamic/tests/test_dynamic_lists.py +++ b/mass_mailing_list_dynamic/tests/test_dynamic_lists.py @@ -1,4 +1,5 @@ # Copyright 2017 Tecnativa - Jairo Llopis +# Copyright 2021 Tecnativa - Víctor Martínez # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from mock import patch @@ -150,3 +151,50 @@ class DynamicListCase(common.SavepointCase): "dynamic": False, }) contact.list_ids = [(4, list2.id)] + + def test_partners_merge(self): + tag2 = self.tag.copy({ + "name": "Tag 2" + }) + self.list.sync_method = "full" + list2 = self.list.copy({ + "name": "test list 2", + "sync_domain": repr([("category_id", "in", tag2.ids)]), + }) + partner_1 = self.partners.create({ + "name": "Demo 1", + "email": "demo1@demo.com", + "category_id": [(4, self.tag.id, False)], + }) + partner_2 = self.partners.create({ + "name": "Demo 2", + "email": "demo2@demo.com", + "category_id": [(4, self.tag.id, False), (4, tag2.id, False)], + }) + self.list.action_sync() + list2.action_sync() + self.assertTrue( + partner_1.id in self.list.contact_ids.mapped('partner_id').ids + ) + self.assertTrue( + partner_2.id in self.list.contact_ids.mapped('partner_id').ids + ) + self.assertFalse( + partner_1.id in list2.contact_ids.mapped('partner_id').ids + ) + self.assertTrue( + partner_2.id in list2.contact_ids.mapped('partner_id').ids + ) + # Wizard partner merge (partner_1 + partner_2) in partner_i1 + wizard = self.env["base.partner.merge.automatic.wizard"].create({ + "state": "option", + "dst_partner_id": partner_1.id, + "partner_ids": [(4, partner_1.id), (4, partner_2.id)] + }) + wizard.action_merge() + self.assertTrue( + partner_1.id in self.list.contact_ids.mapped('partner_id').ids + ) + self.assertTrue( + partner_1.id in list2.contact_ids.mapped('partner_id').ids + ) diff --git a/mass_mailing_list_dynamic/wizards/__init__.py b/mass_mailing_list_dynamic/wizards/__init__.py index 5c4e8060c..c5ac60a28 100644 --- a/mass_mailing_list_dynamic/wizards/__init__.py +++ b/mass_mailing_list_dynamic/wizards/__init__.py @@ -1,3 +1,4 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from . import mail_mass_mailing_load_filter +from . import partner_merge diff --git a/mass_mailing_list_dynamic/wizards/partner_merge.py b/mass_mailing_list_dynamic/wizards/partner_merge.py new file mode 100644 index 000000000..1c4c6c230 --- /dev/null +++ b/mass_mailing_list_dynamic/wizards/partner_merge.py @@ -0,0 +1,17 @@ +# Copyright 2021 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import models + + +class BasePartnerMergeAutomaticWizard(models.TransientModel): + _inherit = "base.partner.merge.automatic.wizard" + + def _merge(self, partner_ids, dst_partner=None, extra_checks=True): + return super( + BasePartnerMergeAutomaticWizard, self.with_context( + bypass_dynamic_list_check=True + ) + )._merge( + partner_ids=partner_ids, dst_partner=dst_partner, extra_checks=extra_checks, + )