From 879131e364fb87972e30d46971d36b1259678f21 Mon Sep 17 00:00:00 2001
From: ernesto
Date: Sun, 11 Nov 2018 09:18:45 -0500
Subject: [PATCH] [MIG] mass_mailing_unique: Migration to 12.0
---
mass_mailing_unique/README.rst | 10 ++--
mass_mailing_unique/__init__.py | 1 -
mass_mailing_unique/__manifest__.py | 3 +-
mass_mailing_unique/hooks.py | 10 ++--
mass_mailing_unique/models/__init__.py | 4 +-
.../models/mail_mass_mailing_contact.py | 22 ++++++++
.../models/mail_mass_mailing_list.py | 12 +++++
.../mail_mass_mailing_list_contact_rel.py | 12 +++++
mass_mailing_unique/models/mass_mailing.py | 20 +------
mass_mailing_unique/readme/DESCRIPTION.rst | 5 +-
.../static/description/index.html | 6 +--
.../img}/error-duplicated-email.png | Bin
.../img}/error-duplicated-list.png | Bin
.../tests/test_mass_mailing_unique.py | 49 +++++++++++++++++-
14 files changed, 114 insertions(+), 40 deletions(-)
create mode 100644 mass_mailing_unique/models/mail_mass_mailing_contact.py
create mode 100644 mass_mailing_unique/models/mail_mass_mailing_list.py
create mode 100644 mass_mailing_unique/models/mail_mass_mailing_list_contact_rel.py
rename mass_mailing_unique/{images => static/img}/error-duplicated-email.png (100%)
rename mass_mailing_unique/{images => static/img}/error-duplicated-list.png (100%)
diff --git a/mass_mailing_unique/README.rst b/mass_mailing_unique/README.rst
index 2ba28873..fb49e801 100644
--- a/mass_mailing_unique/README.rst
+++ b/mass_mailing_unique/README.rst
@@ -14,13 +14,13 @@ Unique records for mass mailing
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fsocial-lightgray.png?logo=github
- :target: https://github.com/OCA/social/tree/11.0/mass_mailing_unique
+ :target: https://github.com/OCA/social/tree/12.0/mass_mailing_unique
:alt: OCA/social
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
- :target: https://translation.odoo-community.org/projects/social-11-0/social-11-0-mass_mailing_unique
+ :target: https://translation.odoo-community.org/projects/social-12-0/social-12-0-mass_mailing_unique
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
- :target: https://runbot.odoo-community.org/runbot/205/11.0
+ :target: https://runbot.odoo-community.org/runbot/205/12.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
@@ -57,7 +57,7 @@ Bug Tracker
Bugs are tracked on `GitHub Issues `_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
-`feedback `_.
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -92,6 +92,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
-This module is part of the `OCA/social `_ project on GitHub.
+This module is part of the `OCA/social `_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/mass_mailing_unique/__init__.py b/mass_mailing_unique/__init__.py
index 268d80e5..50800f2d 100644
--- a/mass_mailing_unique/__init__.py
+++ b/mass_mailing_unique/__init__.py
@@ -2,6 +2,5 @@
# Copyright 2016 Tecnativa - Vicent Cubells
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
-
from . import models
from .hooks import pre_init_hook
diff --git a/mass_mailing_unique/__manifest__.py b/mass_mailing_unique/__manifest__.py
index beaeae84..b2e916e1 100644
--- a/mass_mailing_unique/__manifest__.py
+++ b/mass_mailing_unique/__manifest__.py
@@ -1,11 +1,12 @@
# Copyright 2015 Grupo ESOC IngenierĂa de Servicios, S.L.U. - Jairo Llopis
# Copyright 2016 Tecnativa - Vicent Cubells
+# Copyright 2018 Tecnativa - Ernesto Tejeda
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
{
"name": "Unique records for mass mailing",
"summary": "Avoids duplicate mailing lists and contacts",
- "version": "11.0.1.0.0",
+ "version": "12.0.1.0.0",
"category": "Marketing",
"website": "https://github.com/OCA/social",
"author": "Tecnativa, "
diff --git a/mass_mailing_unique/hooks.py b/mass_mailing_unique/hooks.py
index 8927e114..6360c102 100644
--- a/mass_mailing_unique/hooks.py
+++ b/mass_mailing_unique/hooks.py
@@ -3,7 +3,6 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
-from odoo import _
from odoo.exceptions import ValidationError
@@ -27,8 +26,7 @@ def pre_init_hook(cr):
GROUP BY l.name, e
HAVING COUNT(c.id) > 1""")
for result in cr.fetchall():
- errors.append(
- _("{0} appears {2} times in list {1}.").format(*result))
+ errors.append("{0} appears {2} times in list {1}.".format(*result))
# Search for duplicates in list's name
cr.execute("""SELECT name, COUNT(id)
@@ -36,11 +34,9 @@ def pre_init_hook(cr):
GROUP BY name
HAVING COUNT(id) > 1""")
for result in cr.fetchall():
- errors.append(
- _("There are {1} lists with name {0}.").format(*result))
+ errors.append("There are {1} lists with name {0}.".format(*result))
# Abort if duplicates are found
if errors:
raise ValidationError(
- _("Fix this before installing:") +
- "".join("\n" + e for e in errors))
+ "Fix this before installing:" + "".join("\n" + e for e in errors))
diff --git a/mass_mailing_unique/models/__init__.py b/mass_mailing_unique/models/__init__.py
index 8251b7ac..d795d08a 100644
--- a/mass_mailing_unique/models/__init__.py
+++ b/mass_mailing_unique/models/__init__.py
@@ -2,5 +2,7 @@
# Copyright 2016 Tecnativa - Vicent Cubells
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
-
+from . import mail_mass_mailing_contact
+from . import mail_mass_mailing_list
+from . import mail_mass_mailing_list_contact_rel
from . import mass_mailing
diff --git a/mass_mailing_unique/models/mail_mass_mailing_contact.py b/mass_mailing_unique/models/mail_mass_mailing_contact.py
new file mode 100644
index 00000000..3b9768af
--- /dev/null
+++ b/mass_mailing_unique/models/mail_mass_mailing_contact.py
@@ -0,0 +1,22 @@
+# Copyright 2018 Tecnativa - Ernesto Tejeda
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from odoo import _, api, models
+from odoo.exceptions import ValidationError
+
+
+class MailMassMailingContact(models.Model):
+ _inherit = 'mail.mass_mailing.contact'
+
+ @api.constrains('email', 'list_ids')
+ def _check_email_list_ids(self):
+ for contact in self:
+ lists = contact.subscription_list_ids.mapped('list_id')
+ lists |= contact.list_ids
+ others = lists.mapped('contact_ids') - contact
+
+ contact_email = contact.email.strip().lower()
+ other_emails = [e.strip().lower() for e in others.mapped('email')]
+ if contact_email in other_emails:
+ raise ValidationError(_("Cannot have the same email more "
+ "than once in the same list"))
diff --git a/mass_mailing_unique/models/mail_mass_mailing_list.py b/mass_mailing_unique/models/mail_mass_mailing_list.py
new file mode 100644
index 00000000..9a80b8f2
--- /dev/null
+++ b/mass_mailing_unique/models/mail_mass_mailing_list.py
@@ -0,0 +1,12 @@
+# Copyright 2018 Tecnativa - Ernesto Tejeda
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from odoo import api, models
+
+
+class MailMassMailingList(models.Model):
+ _inherit = 'mail.mass_mailing.list'
+
+ @api.constrains('contact_ids')
+ def _check_contact_ids_email(self):
+ self.mapped("contact_ids")._check_email_list_ids()
diff --git a/mass_mailing_unique/models/mail_mass_mailing_list_contact_rel.py b/mass_mailing_unique/models/mail_mass_mailing_list_contact_rel.py
new file mode 100644
index 00000000..70cd1375
--- /dev/null
+++ b/mass_mailing_unique/models/mail_mass_mailing_list_contact_rel.py
@@ -0,0 +1,12 @@
+# Copyright 2018 Tecnativa - Ernesto Tejeda
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from odoo import api, models
+
+
+class MailMassMailingContactListRel(models.Model):
+ _inherit = 'mail.mass_mailing.list_contact_rel'
+
+ @api.constrains('contact_id', 'list_id')
+ def _check_contact_id_partner_id_list_id(self):
+ self.mapped("contact_id")._check_email_list_ids()
diff --git a/mass_mailing_unique/models/mass_mailing.py b/mass_mailing_unique/models/mass_mailing.py
index 849591b6..3ef1eaf7 100644
--- a/mass_mailing_unique/models/mass_mailing.py
+++ b/mass_mailing_unique/models/mass_mailing.py
@@ -2,28 +2,12 @@
# Copyright 2016 Tecnativa - Vicent Cubells
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
-
-from odoo import models, api, _, tools
-from odoo.exceptions import ValidationError
-
-
-class MailMassMailingContact(models.Model):
- _inherit = "mail.mass_mailing.contact"
-
- @api.constrains('email', 'list_ids')
- def _check_email_list_ids(self):
- for contact in self:
- other_contact = self.search([
- ('email', '=ilike', tools.escape_psql(contact.email)),
- ('id', '!=', contact.id)
- ])
- if contact.list_ids & other_contact.mapped('list_ids'):
- raise ValidationError(_("Cannot have the same email more "
- "than once in the same list"))
+from odoo import models
class MailMassMailingList(models.Model):
_inherit = "mail.mass_mailing.list"
+
_sql_constraints = [
("unique_name", "UNIQUE(name)",
"Cannot have more than one lists with the same name.")
diff --git a/mass_mailing_unique/readme/DESCRIPTION.rst b/mass_mailing_unique/readme/DESCRIPTION.rst
index 5e7fae79..1003e4e0 100644
--- a/mass_mailing_unique/readme/DESCRIPTION.rst
+++ b/mass_mailing_unique/readme/DESCRIPTION.rst
@@ -1,6 +1,5 @@
This module extends the functionality of mass mailing lists to disable
duplicate entries in list names and contact emails per list.
-This way you will avoid sending the same message more than once to the same
-contact when selecting a mailing list, and you will avoid conflicts when
-importing contacts to a list that has a duplicated name.
+This way you will avoid conflicts when importing contacts to a list that has a
+duplicated name.
diff --git a/mass_mailing_unique/static/description/index.html b/mass_mailing_unique/static/description/index.html
index 12f97dda..27b9df33 100644
--- a/mass_mailing_unique/static/description/index.html
+++ b/mass_mailing_unique/static/description/index.html
@@ -367,7 +367,7 @@ ul.auto-toc {
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-
+
This module extends the functionality of mass mailing lists to disable
duplicate entries in list names and contact emails per list.
This way you will avoid sending the same message more than once to the same
@@ -405,7 +405,7 @@ duplicated email inside one. You will not can.
Bugs are tracked on GitHub Issues.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
-feedback.
+feedback.
Do not contact contributors directly about support or help with technical issues.
@@ -435,7 +435,7 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
-
This module is part of the OCA/social project on GitHub.
+
This module is part of the OCA/social project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/mass_mailing_unique/images/error-duplicated-email.png b/mass_mailing_unique/static/img/error-duplicated-email.png
similarity index 100%
rename from mass_mailing_unique/images/error-duplicated-email.png
rename to mass_mailing_unique/static/img/error-duplicated-email.png
diff --git a/mass_mailing_unique/images/error-duplicated-list.png b/mass_mailing_unique/static/img/error-duplicated-list.png
similarity index 100%
rename from mass_mailing_unique/images/error-duplicated-list.png
rename to mass_mailing_unique/static/img/error-duplicated-list.png
diff --git a/mass_mailing_unique/tests/test_mass_mailing_unique.py b/mass_mailing_unique/tests/test_mass_mailing_unique.py
index f244fbbe..625eda1c 100644
--- a/mass_mailing_unique/tests/test_mass_mailing_unique.py
+++ b/mass_mailing_unique/tests/test_mass_mailing_unique.py
@@ -3,6 +3,7 @@
from odoo.tests import common
from odoo import exceptions
+
from ..hooks import pre_init_hook
@@ -31,10 +32,56 @@ class TestMassMailingUnique(common.SavepointCase):
with self.assertRaises(exceptions.ValidationError):
pre_init_hook(self.env.cr)
- def test_init_hook_contact(self):
+ def test_add_contact_with_list(self):
with self.assertRaises(exceptions.ValidationError):
self.env['mail.mass_mailing.contact'].create({
'name': 'Contact 2',
'email': 'email1@test.com',
'list_ids': [(6, 0, [self.list.id])]
})
+
+ def test_add_contact_with_subscription(self):
+ with self.assertRaises(exceptions.ValidationError):
+ self.env['mail.mass_mailing.contact'].create({
+ 'name': 'Contact 2',
+ 'email': 'email1@test.com',
+ 'subscription_list_ids': [
+ (0, 0, {'list_id': self.list.id})
+ ]
+ })
+
+ def test_add_list_with_contacts(self):
+ contact2 = self.env['mail.mass_mailing.contact'].create({
+ 'name': 'Contact 2',
+ 'email': 'email1@test.com',
+ })
+ with self.assertRaises(exceptions.ValidationError):
+ self.env['mail.mass_mailing.list'].create({
+ 'name': 'Test list 2',
+ 'contact_ids': [(6, 0, (self.contact1 | contact2).ids)]
+ })
+
+ def test_add_list_with_subscriptions(self):
+ contact2 = self.env['mail.mass_mailing.contact'].create({
+ 'name': 'Contact 2',
+ 'email': 'email1@test.com',
+ })
+ with self.assertRaises(exceptions.ValidationError):
+ self.env['mail.mass_mailing.list'].create({
+ 'name': 'Test list 2',
+ 'subscription_contact_ids': [
+ (0, 0, {'contact_id': self.contact1.id}),
+ (0, 0, {'contact_id': contact2.id})
+ ]
+ })
+
+ def test_add_list_contact_rel(self):
+ contact2 = self.env['mail.mass_mailing.contact'].create({
+ 'name': 'Contact 2',
+ 'email': 'email1@test.com',
+ })
+ with self.assertRaises(exceptions.ValidationError):
+ self.env['mail.mass_mailing.list_contact_rel'].create({
+ 'list_id': self.list.id,
+ 'contact_id': contact2.id
+ })