From 168e1c04182fe65faed0a7e8fbeb501c40229346 Mon Sep 17 00:00:00 2001 From: Damien Carlier Date: Thu, 14 Jun 2018 19:10:13 +0200 Subject: [PATCH] [MIG] mass_mailing_list_dynamic: Migration to 11.0 --- mass_mailing_list_dynamic/__init__.py | 1 - mass_mailing_list_dynamic/__manifest__.py | 3 +- mass_mailing_list_dynamic/models/__init__.py | 1 - .../models/mail_mass_mailing.py | 1 - .../models/mail_mass_mailing_contact.py | 18 +++++----- .../models/mail_mass_mailing_list.py | 35 ++++++++++++++----- .../models/res_partner.py | 1 - mass_mailing_list_dynamic/tests/__init__.py | 1 - .../tests/test_dynamic_lists.py | 11 +++--- .../views/mail_mass_mailing_list_view.xml | 17 ++++----- mass_mailing_list_dynamic/wizards/__init__.py | 1 - .../wizards/mail_mass_mailing_load_filter.py | 1 - 12 files changed, 51 insertions(+), 40 deletions(-) diff --git a/mass_mailing_list_dynamic/__init__.py b/mass_mailing_list_dynamic/__init__.py index 2966b917..adc6207f 100644 --- a/mass_mailing_list_dynamic/__init__.py +++ b/mass_mailing_list_dynamic/__init__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from . import models diff --git a/mass_mailing_list_dynamic/__manifest__.py b/mass_mailing_list_dynamic/__manifest__.py index 6e0e2439..82e5a02e 100644 --- a/mass_mailing_list_dynamic/__manifest__.py +++ b/mass_mailing_list_dynamic/__manifest__.py @@ -1,11 +1,10 @@ -# -*- coding: utf-8 -*- # Copyright 2017 Tecnativa - Jairo Llopis # Copyright 2018 Tecnativa - David Vidal # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { "name": "Dynamic Mass Mailing Lists", "summary": "Mass mailing lists that get autopopulated", - "version": "10.0.1.2.0", + "version": "11.0.1.0.0", "category": "Marketing", "website": "https://github.com/OCA/social", "author": "Tecnativa, Odoo Community Association (OCA)", diff --git a/mass_mailing_list_dynamic/models/__init__.py b/mass_mailing_list_dynamic/models/__init__.py index 2e3ac3d4..3bb2fc2b 100644 --- a/mass_mailing_list_dynamic/models/__init__.py +++ b/mass_mailing_list_dynamic/models/__init__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from . import mail_mass_mailing diff --git a/mass_mailing_list_dynamic/models/mail_mass_mailing.py b/mass_mailing_list_dynamic/models/mail_mass_mailing.py index 536448bb..7538360f 100644 --- a/mass_mailing_list_dynamic/models/mail_mass_mailing.py +++ b/mass_mailing_list_dynamic/models/mail_mass_mailing.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2017 Tecnativa - Jairo Llopis # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). 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 8dd28174..8c507634 100644 --- a/mass_mailing_list_dynamic/models/mail_mass_mailing_contact.py +++ b/mass_mailing_list_dynamic/models/mail_mass_mailing_contact.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2017 Tecnativa - Jairo Llopis # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). @@ -9,13 +8,16 @@ from odoo.exceptions import ValidationError class MassMailingContact(models.Model): _inherit = "mail.mass_mailing.contact" - @api.constrains("partner_id", "list_id", "name", "email") + @api.constrains("partner_id", "list_ids", "name", "email") def _check_no_manual_edits_on_fully_synced_lists(self): if self.env.context.get("syncing"): return - if any((one.list_id.dynamic and - one.list_id.sync_method == "full") for one in self): - raise ValidationError( - _("Cannot edit manually contacts in a fully " - "synchronized list. Change its sync method or execute " - "a manual sync instead.")) + for one in self: + if any((list.dynamic and + list.sync_method == "full") for list in one.list_ids): + # if any((one.list_id.dynamic and + # one.list_id.sync_method == "full") for one in self): + raise ValidationError( + _("Cannot edit manually contacts in a fully " + "synchronized list. Change its sync method or execute " + "a manual sync instead.")) diff --git a/mass_mailing_list_dynamic/models/mail_mass_mailing_list.py b/mass_mailing_list_dynamic/models/mail_mass_mailing_list.py index 47be1b65..e6eb3e24 100644 --- a/mass_mailing_list_dynamic/models/mail_mass_mailing_list.py +++ b/mass_mailing_list_dynamic/models/mail_mass_mailing_list.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2017 Tecnativa - Jairo Llopis # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). @@ -47,18 +46,36 @@ class MassMailingList(models.Model): desired_partners = Partner.search(sync_domain) # Remove undesired contacts when synchronization is full if one.sync_method == "full": - Contact.search([ - ("list_id", "=", one.id), - ("partner_id", "not in", desired_partners.ids), - ]).unlink() - current_contacts = Contact.search([("list_id", "=", one.id)]) - current_partners = current_contacts.mapped("partner_id") + contacts = Contact.search([("list_ids", "in", [one.id]), + ("partner_id", "not in", + desired_partners.ids)]) + for contact in contacts: + # No delete contacts with other lists + if len(contact.list_ids) > 1: + contact.write({'list_ids': [(3, one.id, False)]}) + else: + contact.unlink() + current_contacts_in_list = \ + Contact.search([("list_ids", "in", [one.id])]) + current_partners_in_list = \ + current_contacts_in_list.mapped("partner_id") + current_contacts_not_in_list = \ + Contact.search([("partner_id", "in", desired_partners.ids), + ("list_ids", "not in", [one.id])]) + current_partners_not_in_list = \ + current_contacts_not_in_list.mapped("partner_id") # Add new contacts - for partner in desired_partners - current_partners: + for partner in desired_partners - current_partners_in_list - \ + current_partners_not_in_list: Contact.create({ - "list_id": one.id, + "list_ids": [(4, one.id, False)], "partner_id": partner.id, }) + # Add list in existing contacts + for contact in current_contacts_not_in_list: + contact.write({ + "list_ids": [(4, one.id, False)], + }) one.is_synced = True # Invalidate cached contact count self.invalidate_cache(["contact_nbr"], dynamic.ids) diff --git a/mass_mailing_list_dynamic/models/res_partner.py b/mass_mailing_list_dynamic/models/res_partner.py index 465f5304..a58d6e62 100644 --- a/mass_mailing_list_dynamic/models/res_partner.py +++ b/mass_mailing_list_dynamic/models/res_partner.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2017 Tecnativa - Pedro M. Baeza # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). diff --git a/mass_mailing_list_dynamic/tests/__init__.py b/mass_mailing_list_dynamic/tests/__init__.py index 778cd50f..d5210483 100644 --- a/mass_mailing_list_dynamic/tests/__init__.py +++ b/mass_mailing_list_dynamic/tests/__init__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from . import test_dynamic_lists diff --git a/mass_mailing_list_dynamic/tests/test_dynamic_lists.py b/mass_mailing_list_dynamic/tests/test_dynamic_lists.py index eb781a59..313c2695 100644 --- a/mass_mailing_list_dynamic/tests/test_dynamic_lists.py +++ b/mass_mailing_list_dynamic/tests/test_dynamic_lists.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2017 Tecnativa - Jairo Llopis # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). @@ -45,7 +44,7 @@ class DynamicListCase(common.SavepointCase): self.list.dynamic = False # Create contact for partner 0 in unsynced list contact0 = Contact.create({ - "list_id": self.list.id, + "list_ids": [(4, self.list.id, False)], "partner_id": self.partners[0].id, }) self.assertEqual(self.list.contact_nbr, 1) @@ -57,7 +56,7 @@ class DynamicListCase(common.SavepointCase): # Set list as full-synced self.list.sync_method = "full" Contact.search([ - ("list_id", "=", self.list.id), + ("list_ids", "in", [self.list.id]), ("partner_id", "=", self.partners[2].id), ]).unlink() self.list.action_sync() @@ -66,11 +65,11 @@ class DynamicListCase(common.SavepointCase): # Cannot add or edit contacts in fully synced lists with self.assertRaises(ValidationError): Contact.create({ - "list_id": self.list.id, + "list_ids": [(4, self.list.id, False)], "partner_id": self.partners[0].id, }) contact1 = Contact.search([ - ("list_id", "=", self.list.id), + ("list_ids", "in", [self.list.id]), ], limit=1) with self.assertRaises(ValidationError): contact1.name = "other" @@ -82,7 +81,7 @@ class DynamicListCase(common.SavepointCase): self.list.dynamic = False # Now the contact is created without exception Contact.create({ - "list_id": self.list.id, + "list_ids": [(4, self.list.id, False)], "email": "test@example.com", }) # Contacts can now be changed diff --git a/mass_mailing_list_dynamic/views/mail_mass_mailing_list_view.xml b/mass_mailing_list_dynamic/views/mail_mass_mailing_list_view.xml index 79dc523f..b0badfe2 100644 --- a/mass_mailing_list_dynamic/views/mail_mass_mailing_list_view.xml +++ b/mass_mailing_list_dynamic/views/mail_mass_mailing_list_view.xml @@ -54,7 +54,7 @@ You cannot make manual editions of contacts in fully synchronized lists. - -