diff --git a/mail_parent_recipient/README.rst b/mail_parent_recipient/README.rst new file mode 100644 index 00000000..e69de29b diff --git a/mail_parent_recipient/__init__.py b/mail_parent_recipient/__init__.py new file mode 100644 index 00000000..cde864ba --- /dev/null +++ b/mail_parent_recipient/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import models diff --git a/mail_parent_recipient/__manifest__.py b/mail_parent_recipient/__manifest__.py new file mode 100644 index 00000000..3a7d7614 --- /dev/null +++ b/mail_parent_recipient/__manifest__.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +# Copyright 2018 Camptocamp +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Mail parent recipient", + "summary": "Sending the email in any case by the main partner", + "category": "Mail", + "license": "LGPL-3", + "version": "10.0.1.0.0", + "website": "https://github.com/OCA/social", + "author": "Camptocamp, Odoo Community Association (OCA)", + "application": False, + "installable": True, + "depends": [ + 'mail', + ] +} diff --git a/mail_parent_recipient/models/__init__.py b/mail_parent_recipient/models/__init__.py new file mode 100644 index 00000000..2eb803a7 --- /dev/null +++ b/mail_parent_recipient/models/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import mail_template diff --git a/mail_parent_recipient/models/mail_template.py b/mail_parent_recipient/models/mail_template.py new file mode 100644 index 00000000..24ca15d5 --- /dev/null +++ b/mail_parent_recipient/models/mail_template.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +# Copyright 2018 Camptocamp +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import models, api +from odoo.tools import config + + +class MailTemplate(models.Model): + + _inherit = 'mail.template' + + @api.multi + def generate_recipients(self, results, res_ids): + """Use partner's parent email as recipient. + + Walk up the hierarchy of recipient partners via `parent_id` + and pick the 1st one having an email. + """ + results = super(MailTemplate, self).generate_recipients( + results, + res_ids + ) + test_condition = ( + config['test_enable'] and not self.env.context.get( + 'test_parent_mail_recipient' + ) + ) + if not test_condition and not self.env.context.get( + 'no_parent_mail_recipient' + ): + for res_id, values in results.iteritems(): + partner_ids = values.get('partner_ids', []) + partners_with_emails = [] + partners = self.env['res.partner'].sudo().browse(partner_ids) + for partner in partners: + current = partner + while current: + if current.email: + break + current = current.parent_id + partners_with_emails.append(current.id or partner.id) + + results[res_id]['partner_ids'] = partners_with_emails + return results diff --git a/mail_parent_recipient/readme/CONTRIBUTORS.rst b/mail_parent_recipient/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000..0a9139f7 --- /dev/null +++ b/mail_parent_recipient/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Thomas Nowicki diff --git a/mail_parent_recipient/readme/CREDITS.rst b/mail_parent_recipient/readme/CREDITS.rst new file mode 100644 index 00000000..f5cc070c --- /dev/null +++ b/mail_parent_recipient/readme/CREDITS.rst @@ -0,0 +1,3 @@ +The development of this module has been financially supported by: + +* Camptocamp diff --git a/mail_parent_recipient/readme/DESCRIPTION.rst b/mail_parent_recipient/readme/DESCRIPTION.rst new file mode 100644 index 00000000..27998dfc --- /dev/null +++ b/mail_parent_recipient/readme/DESCRIPTION.rst @@ -0,0 +1,2 @@ +This module modifies how Odoo get email recipients from partners. +Partner's closest parent email will be used as recipient if partner has no email address. diff --git a/mail_parent_recipient/readme/HISTORY.rst b/mail_parent_recipient/readme/HISTORY.rst new file mode 100644 index 00000000..e69de29b diff --git a/mail_parent_recipient/tests/__init__.py b/mail_parent_recipient/tests/__init__.py new file mode 100644 index 00000000..8b3803cf --- /dev/null +++ b/mail_parent_recipient/tests/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import test_mail_parent_recipient diff --git a/mail_parent_recipient/tests/test_mail_parent_recipient.py b/mail_parent_recipient/tests/test_mail_parent_recipient.py new file mode 100644 index 00000000..3ebbba22 --- /dev/null +++ b/mail_parent_recipient/tests/test_mail_parent_recipient.py @@ -0,0 +1,119 @@ +# -*- coding: utf-8 -*- +# Copyright 2018 Camptocamp +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo.addons.mail.tests.common import TestMail + + +class TestMailTemplate(TestMail): + + @classmethod + def setUpClass(cls): + super(TestMailTemplate, cls).setUpClass() + + cls.Users = cls.env['res.users'] + cls.res_partner = cls.env['res.partner'] + cls.mail_template = cls.env['mail.template'] + cls.mail_comp_msg = cls.env['mail.compose.message'] + + # Company + company_vals = { + 'name': 'company_name_test', + 'email': 'company.mail.test@company' + } + + cls.company_test = cls.res_partner.create(company_vals) + + # Partners test 1 without email + partner_no_mail_vals = { + 'name': 'partner_1', + 'parent_id': cls.company_test.id, + } + + # Partners test 2 with email + partner_with_mail_vals = { + 'name': 'partner_2', + 'email': 'partner.2.mail.test@company', + 'parent_id': cls.company_test.id, + } + + cls.partner_no_mail = cls.res_partner.create(partner_no_mail_vals) + cls.partner_with_mail = cls.res_partner.create( + partner_with_mail_vals + ) + + def create_mail_composer(self, partner_to_send_ids): + email_template = self.env[ + 'mail.template' + ].with_context(test_parent_mail_recipient=True).create({ + 'model_id': self.env['ir.model'].search([ + ('model', '=', 'mail.channel') + ], limit=1).id, + 'name': 'Pigs Template', + 'subject': '${object.name}', + 'body_html': '${object.description}', + 'user_signature': False, + 'partner_to': ",".join(partner_to_send_ids), + }) + + composer = self.mail_comp_msg.with_context({ + 'default_composition_mode': 'comment', + 'default_model': 'mail.channel', + 'default_use_template': True, + }).create({ + 'subject': 'Forget me subject', + 'body': 'Dummy body', + 'template_id': email_template.id + }) + values = composer.onchange_template_id( + email_template.id, + 'comment', 'mail.channel', self.group_pigs.id + )['value'] + + # use _convert_to_cache to return a browse record list from command + # list or id list for x2many fields + values = composer._convert_to_record( + composer._convert_to_cache(values) + ) + recipients = values['partner_ids'] + + return recipients + + def test_1_mail_send_to_partner_no_mail(self): + """Use company mail if recipient partner has no email.""" + recipients = self.create_mail_composer([str(self.partner_no_mail.id)]) + + self.assertEqual(recipients.email, self.company_test.email) + self.assertNotEqual(recipients.email, self.partner_no_mail.email) + self.assertNotEqual(recipients.email, self.partner_with_mail.email) + + def test_2_mail_send_to_partner_with_mail(self): + """Use partner mail if recipient partner has an email.""" + recipients = self.create_mail_composer( + [str(self.partner_with_mail.id)] + ) + + self.assertNotEqual(recipients.email, self.company_test.email) + self.assertNotEqual(recipients.email, self.partner_no_mail.email) + self.assertEqual(recipients.email, self.partner_with_mail.email) + + def test_3_mail_send_to_company_test(self): + """Use company mail if recipient is the company.""" + recipients = self.create_mail_composer([str(self.company_test.id)]) + + self.assertEqual(recipients.email, self.company_test.email) + self.assertNotEqual(recipients.email, self.partner_no_mail.email) + self.assertNotEqual(recipients.email, self.partner_with_mail.email) + + def test_4_mail_send_to_company_and_partner_no_mail(self): + """ Use only one time company mail if recipient is the company + and partner without mail. + """ + recipients = self.create_mail_composer([ + str(self.partner_no_mail.id), + str(self.company_test.id) + ]) + + self.assertEqual(recipients.email, self.company_test.email) + self.assertNotEqual(recipients.email, self.partner_no_mail.email) + self.assertNotEqual(recipients.email, self.partner_with_mail.email)