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.
-
-
+
+
+
diff --git a/mass_mailing_list_dynamic/wizards/__init__.py b/mass_mailing_list_dynamic/wizards/__init__.py
index da942605..5c4e8060 100644
--- a/mass_mailing_list_dynamic/wizards/__init__.py
+++ b/mass_mailing_list_dynamic/wizards/__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_load_filter
diff --git a/mass_mailing_list_dynamic/wizards/mail_mass_mailing_load_filter.py b/mass_mailing_list_dynamic/wizards/mail_mass_mailing_load_filter.py
index 89834a2f..3c11b53c 100644
--- a/mass_mailing_list_dynamic/wizards/mail_mass_mailing_load_filter.py
+++ b/mass_mailing_list_dynamic/wizards/mail_mass_mailing_load_filter.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# Copyright 2017 Tecnativa - Pedro M. Baeza
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).