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. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/social Translate me on Weblate Try me on Runbot

+

Beta License: AGPL-3 OCA/social Translate me on Weblate Try me on Runbot

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 + })