diff --git a/mass_mailing_partner/README.rst b/mass_mailing_partner/README.rst index cc54775b..e8f19a29 100644 --- a/mass_mailing_partner/README.rst +++ b/mass_mailing_partner/README.rst @@ -14,13 +14,13 @@ Link partners with 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_partner + :target: https://github.com/OCA/social/tree/12.0/mass_mailing_partner :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_partner + :target: https://translation.odoo-community.org/projects/social-12-0/social-12-0-mass_mailing_partner :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| @@ -61,7 +61,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. @@ -99,6 +99,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_partner/__manifest__.py b/mass_mailing_partner/__manifest__.py index 20e2e738..c70313c8 100644 --- a/mass_mailing_partner/__manifest__.py +++ b/mass_mailing_partner/__manifest__.py @@ -5,7 +5,7 @@ { "name": "Link partners with mass-mailing", - "version": "11.0.1.0.0", + "version": "12.0.1.0.0", "author": "Tecnativa, " "Odoo Community Association (OCA)", "website": "https://github.com/OCA/social", diff --git a/mass_mailing_partner/models/__init__.py b/mass_mailing_partner/models/__init__.py index 6de33d61..6b744423 100644 --- a/mass_mailing_partner/models/__init__.py +++ b/mass_mailing_partner/models/__init__.py @@ -7,3 +7,4 @@ from . import mail_mass_mailing_contact from . import res_partner from . import mail_mass_mailing from . import mail_mail_statistics +from . import mail_mass_mailing_list_contact_rel diff --git a/mass_mailing_partner/models/mail_mass_mailing.py b/mass_mailing_partner/models/mail_mass_mailing.py index 14169aeb..48e4c8f9 100644 --- a/mass_mailing_partner/models/mail_mass_mailing.py +++ b/mass_mailing_partner/models/mail_mass_mailing.py @@ -3,7 +3,8 @@ # Copyright 2015 Javier Iniesta # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from odoo import fields, models +from odoo import api, fields, models, _ +from odoo.exceptions import ValidationError class MailMassMailingList(models.Model): @@ -13,3 +14,18 @@ class MailMassMailingList(models.Model): default=False) partner_category = fields.Many2one(comodel_name='res.partner.category', string="Partner Tag") + + @api.constrains('contact_ids') + def _check_contact_ids_partner_id(self): + contact_obj = self.env['mail.mass_mailing.contact'] + for mailing_list in self: + data = contact_obj.read_group( + [ + ('id', 'in', mailing_list.contact_ids.ids), + ('partner_id', '!=', False), + ], + ['partner_id'], ['partner_id'] + ) + if len(list(filter(lambda r: r['partner_id_count'] > 1, data))): + raise ValidationError(_("A partner cannot be multiple times " + "in the same list")) diff --git a/mass_mailing_partner/models/mail_mass_mailing_contact.py b/mass_mailing_partner/models/mail_mass_mailing_contact.py index e5acf556..ce723787 100644 --- a/mass_mailing_partner/models/mail_mass_mailing_contact.py +++ b/mass_mailing_partner/models/mail_mass_mailing_contact.py @@ -45,6 +45,10 @@ class MailMassMailingContact(models.Model): record._set_partner() record._onchange_partner_mass_mailing_partner() new_vals = record._convert_to_write(record._cache) + new_vals.update( + subscription_list_ids=vals.get('subscription_list_ids', False), + list_ids=vals.get('list_ids', False) + ) return super(MailMassMailingContact, self).create(new_vals) def write(self, vals): @@ -55,6 +59,10 @@ class MailMassMailingContact(models.Model): record._set_partner() record._onchange_partner_mass_mailing_partner() new_vals = record._convert_to_write(record._cache) + new_vals.update( + subscription_list_ids=vals.get('subscription_list_ids', False), + list_ids=vals.get('list_ids', False) + ) super(MailMassMailingContact, contact).write(new_vals) return True @@ -92,6 +100,9 @@ class MailMassMailingContact(models.Model): if partner: # Partner found self.partner_id = partner - elif self.list_ids.filtered('partner_mandatory'): - # Create partner - self.partner_id = m_partner.sudo().create(self._prepare_partner()) + else: + lts = self.subscription_list_ids.mapped('list_id') | self.list_ids + if lts.filtered('partner_mandatory'): + # Create partner + partner_vals = self._prepare_partner() + self.partner_id = m_partner.sudo().create(partner_vals) diff --git a/mass_mailing_partner/models/mail_mass_mailing_list_contact_rel.py b/mass_mailing_partner/models/mail_mass_mailing_list_contact_rel.py new file mode 100644 index 00000000..c59b639d --- /dev/null +++ b/mass_mailing_partner/models/mail_mass_mailing_list_contact_rel.py @@ -0,0 +1,18 @@ +# 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 MassMailingContactListRel(models.Model): + _inherit = 'mail.mass_mailing.list_contact_rel' + + @api.constrains('contact_id', 'list_id') + def _check_contact_id_partner_id_list_id(self): + for rel in self: + if rel.contact_id.partner_id: + contacts = rel.list_id.contact_ids - rel.contact_id + if rel.contact_id.partner_id in contacts.mapped('partner_id'): + raise ValidationError(_("A partner cannot be multiple " + "times in the same list")) diff --git a/mass_mailing_partner/models/res_partner.py b/mass_mailing_partner/models/res_partner.py index e6310e3b..4d279e12 100644 --- a/mass_mailing_partner/models/res_partner.py +++ b/mass_mailing_partner/models/res_partner.py @@ -14,7 +14,6 @@ class ResPartner(models.Model): mass_mailing_contact_ids = fields.One2many( string="Mailing contacts", oldname="mass_mailing_contacts", - domain=[('opt_out', '=', False)], comodel_name='mail.mass_mailing.contact', inverse_name='partner_id') mass_mailing_contacts_count = fields.Integer( string='Mailing contacts number', @@ -36,8 +35,7 @@ class ResPartner(models.Model): "mailing contact. Email must be assigned." ) % partner.name) - @api.depends('mass_mailing_contact_ids', - 'mass_mailing_contact_ids.opt_out') + @api.depends('mass_mailing_contact_ids') def _compute_mass_mailing_contacts_count(self): contact_data = self.env['mail.mass_mailing.contact'].read_group( [('partner_id', 'in', self.ids)], ['partner_id'], ['partner_id']) diff --git a/mass_mailing_partner/static/description/index.html b/mass_mailing_partner/static/description/index.html index 14166ac6..01adc4b0 100644 --- a/mass_mailing_partner/static/description/index.html +++ b/mass_mailing_partner/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 links mass-mailing contacts with partners.

Features

@@ -404,7 +404,7 @@ as mailing list contacts.

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.

@@ -442,7 +442,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_partner/tests/__init__.py b/mass_mailing_partner/tests/__init__.py index 9ab068b7..8d03b544 100644 --- a/mass_mailing_partner/tests/__init__.py +++ b/mass_mailing_partner/tests/__init__.py @@ -6,3 +6,5 @@ from . import test_mail_mass_mailing_contact, test_res_partner from . import test_mail_mail_statistics from . import test_partner_mail_list_wizard +from . import test_mail_mass_mailing_list +from . import test_mail_mass_mailing_list_contact_rel \ No newline at end of file diff --git a/mass_mailing_partner/tests/base.py b/mass_mailing_partner/tests/base.py index 2b3a4c1e..049d794b 100644 --- a/mass_mailing_partner/tests/base.py +++ b/mass_mailing_partner/tests/base.py @@ -13,13 +13,13 @@ class BaseCase(TransactionCase): self.main_company = self.env.ref('base.main_company') self.country_es = self.env.ref('base.es') self.category_0 = self.env.ref('base.res_partner_category_0') - self.category_1 = self.env.ref('base.res_partner_category_1') + self.category_2 = self.env.ref('base.res_partner_category_2') self.title_mister = self.env.ref('base.res_partner_title_mister') self.partner = self.create_partner( {'name': 'Partner test', 'email': 'partner@test.com', 'title': self.title_mister.id, 'company_id': self.main_company.id, 'country_id': self.country_es.id, - 'category_id': [(6, 0, (self.category_0 | self.category_1).ids)]}) + 'category_id': [(6, 0, (self.category_0 | self.category_2).ids)]}) self.category_3 = self.env.ref('base.res_partner_category_3') self.mailing_list = self.create_mailing_list({'name': 'List test'}) diff --git a/mass_mailing_partner/tests/test_mail_mass_mailing_contact.py b/mass_mailing_partner/tests/test_mail_mass_mailing_contact.py index de4d5648..d491b721 100644 --- a/mass_mailing_partner/tests/test_mail_mass_mailing_contact.py +++ b/mass_mailing_partner/tests/test_mail_mass_mailing_contact.py @@ -21,13 +21,13 @@ class MailMassMailingContactCase(base.BaseCase): def test_create_mass_mailing_contact(self): title_doctor = self.env.ref('base.res_partner_title_doctor') country_cu = self.env.ref('base.cu') - category_4 = self.env.ref('base.res_partner_category_4') - category_5 = self.env.ref('base.res_partner_category_5') + category_8 = self.env.ref('base.res_partner_category_8') + category_11 = self.env.ref('base.res_partner_category_11') contact_vals = { 'name': 'Partner test 2', 'email': 'partner2@test.com', 'title_id': title_doctor.id, 'company_name': "TestCompany", 'country_id': country_cu.id, - 'tag_ids': [(6, 0, (category_4 | category_5).ids)], + 'tag_ids': [(6, 0, (category_8 | category_11).ids)], 'list_ids': [(6, 0, (self.mailing_list | self.mailing_list2).ids)], } contact = self.create_mailing_contact(contact_vals) @@ -37,6 +37,31 @@ class MailMassMailingContactCase(base.BaseCase): {'email': 'partner2@test.com', 'list_ids': [[6, 0, [self.mailing_list2.id]]]}) + def test_create_mass_mailing_contact_with_subscription(self): + title_doctor = self.env.ref('base.res_partner_title_doctor') + country_cu = self.env.ref('base.cu') + category_8 = self.env.ref('base.res_partner_category_8') + category_11 = self.env.ref('base.res_partner_category_11') + contact_vals = { + 'name': 'Partner test 2', 'email': 'partner2@test.com', + 'title_id': title_doctor.id, 'company_name': "TestCompany", + 'country_id': country_cu.id, + 'tag_ids': [(6, 0, (category_8 | category_11).ids)], + 'subscription_list_ids': [ + (0, 0, {'list_id': self.mailing_list.id}), + (0, 0, {'list_id': self.mailing_list2.id}), + ], + } + contact = self.create_mailing_contact(contact_vals) + self.check_mailing_contact_partner(contact) + with self.assertRaises(ValidationError): + self.create_mailing_contact({ + 'email': 'partner2@test.com', + 'subscription_list_ids': [ + (0, 0, {'list_id': self.mailing_list2.id}), + ], + }) + def test_write_mass_mailing_contact(self): contact = self.create_mailing_contact( {'email': 'partner@test.com', @@ -55,13 +80,13 @@ class MailMassMailingContactCase(base.BaseCase): 'list_ids': [[6, 0, [self.mailing_list.id]]]}) title_doctor = self.env.ref('base.res_partner_title_doctor') country_cu = self.env.ref('base.cu') - category_4 = self.env.ref('base.res_partner_category_4') - category_5 = self.env.ref('base.res_partner_category_5') + category_8 = self.env.ref('base.res_partner_category_8') + category_11 = self.env.ref('base.res_partner_category_11') partner_vals = { 'name': 'Partner test 2', 'email': 'partner2@test.com', 'title': title_doctor.id, 'company_id': self.main_company.id, 'country_id': country_cu.id, - 'category_id': [(6, 0, (category_4 | category_5).ids)], + 'category_id': [(6, 0, (category_8 | category_11).ids)], } partner = self.create_partner(partner_vals) with self.env.do_in_onchange(): diff --git a/mass_mailing_partner/tests/test_mail_mass_mailing_list.py b/mass_mailing_partner/tests/test_mail_mass_mailing_list.py new file mode 100644 index 00000000..76a67e4f --- /dev/null +++ b/mass_mailing_partner/tests/test_mail_mass_mailing_list.py @@ -0,0 +1,41 @@ +# Copyright 2018 Tecnativa - Ernesto tejeda +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import base +from odoo.exceptions import ValidationError + + +class MailMassMailingListCase(base.BaseCase): + + def test_create_mass_mailing_list(self): + contact_test_1 = self.create_mailing_contact({ + 'name': 'Contact test 1', + 'partner_id': self.partner.id, + }) + contact_test_2 = self.create_mailing_contact({ + 'name': 'Contact test 2', + 'partner_id': self.partner.id, + }) + with self.assertRaises(ValidationError): + self.create_mailing_list({ + 'name': 'List test 3', + 'contact_ids': [(6, 0, (contact_test_1 | contact_test_2).ids)] + }) + + def test_create_mass_mailing_list_with_subscription(self): + contact_test_1 = self.create_mailing_contact({ + 'name': 'Contact test 1', + 'partner_id': self.partner.id, + }) + contact_test_2 = self.create_mailing_contact({ + 'name': 'Contact test 2', + 'partner_id': self.partner.id, + }) + with self.assertRaises(ValidationError): + self.create_mailing_list({ + 'name': 'List test 3', + 'subscription_contact_ids': [ + (0, 0, {'contact_id': contact_test_1.id}), + (0, 0, {'contact_id': contact_test_2.id}), + ] + }) diff --git a/mass_mailing_partner/tests/test_mail_mass_mailing_list_contact_rel.py b/mass_mailing_partner/tests/test_mail_mass_mailing_list_contact_rel.py new file mode 100644 index 00000000..bd68d91f --- /dev/null +++ b/mass_mailing_partner/tests/test_mail_mass_mailing_list_contact_rel.py @@ -0,0 +1,30 @@ +# Copyright 2018 Tecnativa - Ernesto tejeda +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import base +from odoo.exceptions import ValidationError + + +class MailMassMailingListContactRelCase(base.BaseCase): + + def test_create_mass_mailing_list(self): + contact_test_1 = self.create_mailing_contact({ + 'name': 'Contact test 1', + 'partner_id': self.partner.id, + }) + contact_test_2 = self.create_mailing_contact({ + 'name': 'Contact test 2', + 'partner_id': self.partner.id, + }) + list_3 = self.create_mailing_list({'name': 'List test 3'}) + + self.env['mail.mass_mailing.list_contact_rel'].create({ + 'list_id': list_3.id, + 'contact_id': contact_test_1.id, + }) + + with self.assertRaises(ValidationError): + self.env['mail.mass_mailing.list_contact_rel'].create({ + 'list_id': list_3.id, + 'contact_id': contact_test_2.id, + }) diff --git a/mass_mailing_partner/tests/test_res_partner.py b/mass_mailing_partner/tests/test_res_partner.py index 732f8b1a..837c4081 100644 --- a/mass_mailing_partner/tests/test_res_partner.py +++ b/mass_mailing_partner/tests/test_res_partner.py @@ -26,13 +26,13 @@ class ResPartnerCase(base.BaseCase): title_doctor = self.env.ref('base.res_partner_title_doctor') country_cu = self.env.ref('base.cu') - category_4 = self.env.ref('base.res_partner_category_4') - category_5 = self.env.ref('base.res_partner_category_5') + category_8 = self.env.ref('base.res_partner_category_8') + category_11 = self.env.ref('base.res_partner_category_11') self.partner.write({ 'name': 'Changed', 'email': 'partner@changed.com', 'title': title_doctor.id, 'company_id': self.main_company.id, 'country_id': country_cu.id, - 'category_id': [(6, 0, (category_4 | category_5).ids)], + 'category_id': [(6, 0, (category_8 | category_11).ids)], }) self.check_mailing_contact_partner(contact) with self.assertRaises(ValidationError): diff --git a/mass_mailing_partner/views/mail_mass_mailing_contact_view.xml b/mass_mailing_partner/views/mail_mass_mailing_contact_view.xml index a9c4017d..dcbac351 100644 --- a/mass_mailing_partner/views/mail_mass_mailing_contact_view.xml +++ b/mass_mailing_partner/views/mail_mass_mailing_contact_view.xml @@ -22,9 +22,9 @@ mail.mass_mailing.contact - + - + {'readonly': [('partner_id', '!=', False)]}