From fb20523977342f215b84344e614e650156983119 Mon Sep 17 00:00:00 2001 From: Tonow-c2c Date: Mon, 26 Nov 2018 17:55:52 +0100 Subject: [PATCH 01/10] [ADD][mail_parent_recipient][10] Add module to use mail of first partner --- mail_parent_recipient/__init__.py | 3 + mail_parent_recipient/__manifest__.py | 22 ++++ mail_parent_recipient/models/__init__.py | 3 + mail_parent_recipient/models/mail_template.py | 35 ++++++ mail_parent_recipient/readme/CONTRIBUTORS.rst | 1 + mail_parent_recipient/readme/CREDITS.rst | 4 + mail_parent_recipient/readme/DESCRIPTION.rst | 3 + mail_parent_recipient/readme/HISTORY.rst | 0 mail_parent_recipient/tests/__init__.py | 3 + .../tests/test_mail_parent_recipient.py | 101 ++++++++++++++++++ 10 files changed, 175 insertions(+) create mode 100644 mail_parent_recipient/__init__.py create mode 100644 mail_parent_recipient/__manifest__.py create mode 100644 mail_parent_recipient/models/__init__.py create mode 100644 mail_parent_recipient/models/mail_template.py create mode 100644 mail_parent_recipient/readme/CONTRIBUTORS.rst create mode 100644 mail_parent_recipient/readme/CREDITS.rst create mode 100644 mail_parent_recipient/readme/DESCRIPTION.rst create mode 100644 mail_parent_recipient/readme/HISTORY.rst create mode 100644 mail_parent_recipient/tests/__init__.py create mode 100644 mail_parent_recipient/tests/test_mail_parent_recipient.py 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..95e7fc5e --- /dev/null +++ b/mail_parent_recipient/__manifest__.py @@ -0,0 +1,22 @@ +# -*- 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)", + "license": "AGPL-3", + "application": False, + "installable": True, + "pre_init_hook": "pre_init_hook", + "post_init_hook": "post_init_hook", + "post_load": "post_load", + "uninstall_hook": "uninstall_hook", + "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..7c6c0487 --- /dev/null +++ b/mail_parent_recipient/models/mail_template.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# Copyright 2018 Camptocamp +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import models, api + + +class MailTemplate(models.Model): + + _inherit = 'mail.template' + + @api.multi + def generate_recipients(self, results, res_ids): + """ + Modify the code that set the default recipient in an email to the first + partner having an email set following the parents tree. + If no parent with an email is found, + it reverts to the popup asking to set an email for the current partner + """ + results = super(MailTemplate, self).generate_recipients( + results, + res_ids + ) + for res_id, values in results.iteritems(): + partner_ids = values.get('partner_ids', []) + partners_with_emails = [] + for partner in self.env['res.partner'].sudo().browse(partner_ids): + 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..ea08384b --- /dev/null +++ b/mail_parent_recipient/readme/CREDITS.rst @@ -0,0 +1,4 @@ + +The development of this module has been financially supported by: + +* Camptocamp Thomas Nowicki diff --git a/mail_parent_recipient/readme/DESCRIPTION.rst b/mail_parent_recipient/readme/DESCRIPTION.rst new file mode 100644 index 00000000..d8c106f8 --- /dev/null +++ b/mail_parent_recipient/readme/DESCRIPTION.rst @@ -0,0 +1,3 @@ +This modules set the default recipient in an email to the first partner having +an email set following the parents tree. If no parent with an email is found, +it reverts to the popup asking to set an email for the current partner. 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..e245e17f --- /dev/null +++ b/mail_parent_recipient/tests/test_mail_parent_recipient.py @@ -0,0 +1,101 @@ +# -*- 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): + + def setUp(self): + super(TestMailTemplate, self).setUp() + + self.Users = self.env['res.users'] + self.res_parter = self.env['res.partner'] + self.mail_template = self.env['mail.template'] + self.mail_comp_msg = self.env['mail.compose.message'] + + # Company + company_vals = { + 'name': 'company_name_test', + 'email': 'company.mail.test@company' + } + + self.company_test = self.res_parter.create(company_vals) + + # Partners test 1 without email + partner_no_mail_vals = { + 'name': 'partner_1', + 'parent_id': self.company_test.id, + } + + + # Partners test 2 with email + partner_with_mail_vals = { + 'name': 'partner_2', + 'email': 'partner.2.mail.test@company', + 'parent_id': self.company_test.id, + } + + self.partner_no_mail = self.res_parter.create(partner_no_mail_vals) + self.partner_with_mail = self.res_parter.create(partner_with_mail_vals) + + self.email_template = self.env['mail.template'].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': '${object.partner_id.id}', # TODO change + }) + + self.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': self.email_template.id + }) + + # def test_1_mail_send_to_partner_no_mail(self): + # """ + # Mail should only send with company mail + # even if is sended to partner_no_mail + # """ + # import pdb; pdb.set_trace() + # mail_id = self.email_template.send_mail(self.partner_no_mail.id) + # mail = self.env['mail.mail'].browse(mail_id) + # + # self.assertEqual(mail.recipient_ids, self.company_test.id) + # self.assertNotEqual(mail.recipient_ids, self.partner_no_mail.id) + # self.assertNotEqual(mail.recipient_ids, self.partner_with_mail.id) + # self.assertEqual(len(mail.recipient_ids), 1) + # + # def test_2_mail_send_to_partner_with_mail(self): + # """ + # Mail should only send with company mail + # even if is sended to partner_with_mail + # """ + # mail_id = self.email_template.send_mail(self.partner_with_mail.id) + # mail = self.env['mail.mail'].browse(mail_id) + # + # self.assertEqual(mail.recipient_ids, self.company_test.id) + # self.assertNotEqual(mail.recipient_ids, self.partner_no_mail.id) + # self.assertNotEqual(mail.recipient_ids, self.partner_with_mail.id) + # self.assertEqual(len(mail.recipient_ids), 1) + # + # def test_3_mail_send_to_company_test(self): + # """ + # Mail should only send with company mail + # """ + # mail_id = self.email_template.send_mail(self.company_test.id) + # mail = self.env['mail.mail'].browse(mail_id) + # + # self.assertEqual(mail.recipient_ids, self.company_test.id) + # self.assertNotEqual(mail.recipient_ids, self.partner_no_mail.id) + # self.assertNotEqual(mail.recipient_ids, self.partner_with_mail.id) + # self.assertEqual(len(mail.recipient_ids), 1) From 7485214b95c0074a33d90f19a4dd42180572c2b4 Mon Sep 17 00:00:00 2001 From: Tonow-c2c Date: Mon, 26 Nov 2018 18:49:17 +0100 Subject: [PATCH 02/10] fixup! [ADD][mail_parent_recipient][10] Add module to use mail of first partner --- mail_parent_recipient/__manifest__.py | 1 - .../tests/test_mail_parent_recipient.py | 9 +++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/mail_parent_recipient/__manifest__.py b/mail_parent_recipient/__manifest__.py index 95e7fc5e..f312b584 100644 --- a/mail_parent_recipient/__manifest__.py +++ b/mail_parent_recipient/__manifest__.py @@ -14,7 +14,6 @@ "installable": True, "pre_init_hook": "pre_init_hook", "post_init_hook": "post_init_hook", - "post_load": "post_load", "uninstall_hook": "uninstall_hook", "depends": [ 'mail', diff --git a/mail_parent_recipient/tests/test_mail_parent_recipient.py b/mail_parent_recipient/tests/test_mail_parent_recipient.py index e245e17f..cd3cd946 100644 --- a/mail_parent_recipient/tests/test_mail_parent_recipient.py +++ b/mail_parent_recipient/tests/test_mail_parent_recipient.py @@ -29,7 +29,6 @@ class TestMailTemplate(TestMail): 'parent_id': self.company_test.id, } - # Partners test 2 with email partner_with_mail_vals = { 'name': 'partner_2', @@ -40,6 +39,7 @@ class TestMailTemplate(TestMail): self.partner_no_mail = self.res_parter.create(partner_no_mail_vals) self.partner_with_mail = self.res_parter.create(partner_with_mail_vals) + def create_mail_composer(self, partner_to_send_id): self.email_template = self.env['mail.template'].create({ 'model_id': self.env['ir.model'].search([ ('model', '=', 'mail.channel') @@ -48,7 +48,7 @@ class TestMailTemplate(TestMail): 'subject': '${object.name}', 'body_html': '${object.description}', 'user_signature': False, - 'partner_to': '${object.partner_id.id}', # TODO change + 'partner_to': '%s' % (partner_to_send_id), }) self.composer = self.mail_comp_msg.with_context({ @@ -61,12 +61,15 @@ class TestMailTemplate(TestMail): 'template_id': self.email_template.id }) + return self.composer + # def test_1_mail_send_to_partner_no_mail(self): # """ # Mail should only send with company mail # even if is sended to partner_no_mail # """ # import pdb; pdb.set_trace() + # mail_composer = self.create_mail_composer(self.partner_no_mail.id) # mail_id = self.email_template.send_mail(self.partner_no_mail.id) # mail = self.env['mail.mail'].browse(mail_id) # @@ -80,6 +83,7 @@ class TestMailTemplate(TestMail): # Mail should only send with company mail # even if is sended to partner_with_mail # """ + # mail_composer = self.create_mail_composer(self.partner_no_mail.id) # mail_id = self.email_template.send_mail(self.partner_with_mail.id) # mail = self.env['mail.mail'].browse(mail_id) # @@ -92,6 +96,7 @@ class TestMailTemplate(TestMail): # """ # Mail should only send with company mail # """ + # mail_composer = self.create_mail_composer(self.partner_no_mail.id) # mail_id = self.email_template.send_mail(self.company_test.id) # mail = self.env['mail.mail'].browse(mail_id) # From 4f6e3242b8801e63b171103ebf2ff4744a94971c Mon Sep 17 00:00:00 2001 From: Tonow-c2c Date: Tue, 27 Nov 2018 17:15:34 +0100 Subject: [PATCH 03/10] fixup! fixup! [ADD][mail_parent_recipient][10] Add module to use mail of first partner --- mail_parent_recipient/README.rst | 0 .../tests/test_mail_parent_recipient.py | 98 +++++++++---------- 2 files changed, 48 insertions(+), 50 deletions(-) create mode 100644 mail_parent_recipient/README.rst 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/tests/test_mail_parent_recipient.py b/mail_parent_recipient/tests/test_mail_parent_recipient.py index cd3cd946..04be0927 100644 --- a/mail_parent_recipient/tests/test_mail_parent_recipient.py +++ b/mail_parent_recipient/tests/test_mail_parent_recipient.py @@ -11,7 +11,7 @@ class TestMailTemplate(TestMail): super(TestMailTemplate, self).setUp() self.Users = self.env['res.users'] - self.res_parter = self.env['res.partner'] + self.res_partner = self.env['res.partner'] self.mail_template = self.env['mail.template'] self.mail_comp_msg = self.env['mail.compose.message'] @@ -21,7 +21,7 @@ class TestMailTemplate(TestMail): 'email': 'company.mail.test@company' } - self.company_test = self.res_parter.create(company_vals) + self.company_test = self.res_partner.create(company_vals) # Partners test 1 without email partner_no_mail_vals = { @@ -36,11 +36,11 @@ class TestMailTemplate(TestMail): 'parent_id': self.company_test.id, } - self.partner_no_mail = self.res_parter.create(partner_no_mail_vals) - self.partner_with_mail = self.res_parter.create(partner_with_mail_vals) + self.partner_no_mail = self.res_partner.create(partner_no_mail_vals) + self.partner_with_mail = self.res_partner.create(partner_with_mail_vals) def create_mail_composer(self, partner_to_send_id): - self.email_template = self.env['mail.template'].create({ + email_template = self.env['mail.template'].create({ 'model_id': self.env['ir.model'].search([ ('model', '=', 'mail.channel') ], limit=1).id, @@ -51,56 +51,54 @@ class TestMailTemplate(TestMail): 'partner_to': '%s' % (partner_to_send_id), }) - self.composer = self.mail_comp_msg.with_context({ + 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': self.email_template.id + 'template_id': email_template.id }) + values = composer.onchange_template_id( + email_template.id, + 'comment', 'mail.channel', self.group_pigs.id + )['value'] - return self.composer - - # def test_1_mail_send_to_partner_no_mail(self): - # """ - # Mail should only send with company mail - # even if is sended to partner_no_mail - # """ - # import pdb; pdb.set_trace() - # mail_composer = self.create_mail_composer(self.partner_no_mail.id) - # mail_id = self.email_template.send_mail(self.partner_no_mail.id) - # mail = self.env['mail.mail'].browse(mail_id) - # - # self.assertEqual(mail.recipient_ids, self.company_test.id) - # self.assertNotEqual(mail.recipient_ids, self.partner_no_mail.id) - # self.assertNotEqual(mail.recipient_ids, self.partner_with_mail.id) - # self.assertEqual(len(mail.recipient_ids), 1) - # - # def test_2_mail_send_to_partner_with_mail(self): - # """ - # Mail should only send with company mail - # even if is sended to partner_with_mail - # """ - # mail_composer = self.create_mail_composer(self.partner_no_mail.id) - # mail_id = self.email_template.send_mail(self.partner_with_mail.id) - # mail = self.env['mail.mail'].browse(mail_id) - # - # self.assertEqual(mail.recipient_ids, self.company_test.id) - # self.assertNotEqual(mail.recipient_ids, self.partner_no_mail.id) - # self.assertNotEqual(mail.recipient_ids, self.partner_with_mail.id) - # self.assertEqual(len(mail.recipient_ids), 1) - # - # def test_3_mail_send_to_company_test(self): - # """ - # Mail should only send with company mail - # """ - # mail_composer = self.create_mail_composer(self.partner_no_mail.id) - # mail_id = self.email_template.send_mail(self.company_test.id) - # mail = self.env['mail.mail'].browse(mail_id) - # - # self.assertEqual(mail.recipient_ids, self.company_test.id) - # self.assertNotEqual(mail.recipient_ids, self.partner_no_mail.id) - # self.assertNotEqual(mail.recipient_ids, self.partner_with_mail.id) - # self.assertEqual(len(mail.recipient_ids), 1) + # 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): + """ + Mail should only send with company mail + even if is sended to partner_no_mail + """ + recipients = self.create_mail_composer(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): + """ + Mail should only send with company mail + even if is sended to partner_with_mail + """ + recipients = self.create_mail_composer(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): + """ + Mail should only send with company mail + """ + recipients = self.create_mail_composer(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) From 6bd5dc3a0bc205995fa053b89947b21a4c20c4fb Mon Sep 17 00:00:00 2001 From: Tonow-c2c Date: Tue, 27 Nov 2018 17:22:26 +0100 Subject: [PATCH 04/10] fixup! fixup! fixup! [ADD][mail_parent_recipient][10] Add module to use mail of first partner --- .../tests/test_mail_parent_recipient.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/mail_parent_recipient/tests/test_mail_parent_recipient.py b/mail_parent_recipient/tests/test_mail_parent_recipient.py index 04be0927..1d371574 100644 --- a/mail_parent_recipient/tests/test_mail_parent_recipient.py +++ b/mail_parent_recipient/tests/test_mail_parent_recipient.py @@ -37,7 +37,9 @@ class TestMailTemplate(TestMail): } self.partner_no_mail = self.res_partner.create(partner_no_mail_vals) - self.partner_with_mail = self.res_partner.create(partner_with_mail_vals) + self.partner_with_mail = self.res_partner.create( + partner_with_mail_vals + ) def create_mail_composer(self, partner_to_send_id): email_template = self.env['mail.template'].create({ @@ -65,8 +67,11 @@ class TestMailTemplate(TestMail): '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)) + # 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 From 24446c122939d7247ca2428a29e8c97ddb27e65d Mon Sep 17 00:00:00 2001 From: Tonow-c2c Date: Tue, 27 Nov 2018 17:23:21 +0100 Subject: [PATCH 05/10] fixup! fixup! fixup! fixup! [ADD][mail_parent_recipient][10] Add module to use mail of first partner --- mail_parent_recipient/__manifest__.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/mail_parent_recipient/__manifest__.py b/mail_parent_recipient/__manifest__.py index f312b584..e740386b 100644 --- a/mail_parent_recipient/__manifest__.py +++ b/mail_parent_recipient/__manifest__.py @@ -12,9 +12,6 @@ "license": "AGPL-3", "application": False, "installable": True, - "pre_init_hook": "pre_init_hook", - "post_init_hook": "post_init_hook", - "uninstall_hook": "uninstall_hook", "depends": [ 'mail', ] From cecc83111a65fadf8577c75f07a772c4a3856796 Mon Sep 17 00:00:00 2001 From: Tonow-c2c Date: Tue, 27 Nov 2018 17:28:59 +0100 Subject: [PATCH 06/10] fixup! fixup! fixup! fixup! fixup! [ADD][mail_parent_recipient][10] Add module to use mail of first partner --- mail_parent_recipient/__manifest__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/mail_parent_recipient/__manifest__.py b/mail_parent_recipient/__manifest__.py index e740386b..3a7d7614 100644 --- a/mail_parent_recipient/__manifest__.py +++ b/mail_parent_recipient/__manifest__.py @@ -9,7 +9,6 @@ "version": "10.0.1.0.0", "website": "https://github.com/OCA/social", "author": "Camptocamp, Odoo Community Association (OCA)", - "license": "AGPL-3", "application": False, "installable": True, "depends": [ From 23ea229ed7397c10e2fee1de0e0d60ea8ffa5e9e Mon Sep 17 00:00:00 2001 From: Tonow-c2c Date: Thu, 29 Nov 2018 09:56:30 +0100 Subject: [PATCH 07/10] fixup! fixup! fixup! fixup! fixup! fixup! [ADD][mail_parent_recipient][10] Add module to use mail of first partner --- mail_parent_recipient/models/mail_template.py | 9 ++++----- mail_parent_recipient/readme/CREDITS.rst | 3 +-- mail_parent_recipient/readme/DESCRIPTION.rst | 4 +--- .../tests/test_mail_parent_recipient.py | 16 ++++------------ 4 files changed, 10 insertions(+), 22 deletions(-) diff --git a/mail_parent_recipient/models/mail_template.py b/mail_parent_recipient/models/mail_template.py index 7c6c0487..8de8068e 100644 --- a/mail_parent_recipient/models/mail_template.py +++ b/mail_parent_recipient/models/mail_template.py @@ -10,11 +10,10 @@ class MailTemplate(models.Model): @api.multi def generate_recipients(self, results, res_ids): - """ - Modify the code that set the default recipient in an email to the first - partner having an email set following the parents tree. - If no parent with an email is found, - it reverts to the popup asking to set an email for the current partner + """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, diff --git a/mail_parent_recipient/readme/CREDITS.rst b/mail_parent_recipient/readme/CREDITS.rst index ea08384b..f5cc070c 100644 --- a/mail_parent_recipient/readme/CREDITS.rst +++ b/mail_parent_recipient/readme/CREDITS.rst @@ -1,4 +1,3 @@ - The development of this module has been financially supported by: -* Camptocamp Thomas Nowicki +* Camptocamp diff --git a/mail_parent_recipient/readme/DESCRIPTION.rst b/mail_parent_recipient/readme/DESCRIPTION.rst index d8c106f8..f0420bc9 100644 --- a/mail_parent_recipient/readme/DESCRIPTION.rst +++ b/mail_parent_recipient/readme/DESCRIPTION.rst @@ -1,3 +1 @@ -This modules set the default recipient in an email to the first partner having -an email set following the parents tree. If no parent with an email is found, -it reverts to the popup asking to set an email for the current partner. +This modules add the fact to use partner's parent email as recipient. diff --git a/mail_parent_recipient/tests/test_mail_parent_recipient.py b/mail_parent_recipient/tests/test_mail_parent_recipient.py index 1d371574..a6823c94 100644 --- a/mail_parent_recipient/tests/test_mail_parent_recipient.py +++ b/mail_parent_recipient/tests/test_mail_parent_recipient.py @@ -77,10 +77,7 @@ class TestMailTemplate(TestMail): return recipients def test_1_mail_send_to_partner_no_mail(self): - """ - Mail should only send with company mail - even if is sended to partner_no_mail - """ + """Use company mail if recipient partner has no email.""" recipients = self.create_mail_composer(self.partner_no_mail.id) self.assertEqual(recipients.email, self.company_test.email) @@ -88,10 +85,7 @@ class TestMailTemplate(TestMail): self.assertNotEqual(recipients.email, self.partner_with_mail.email) def test_2_mail_send_to_partner_with_mail(self): - """ - Mail should only send with company mail - even if is sended to partner_with_mail - """ + """Use partner mail if recipient partner has an email.""" recipients = self.create_mail_composer(self.partner_with_mail.id) self.assertNotEqual(recipients.email, self.company_test.email) @@ -99,10 +93,8 @@ class TestMailTemplate(TestMail): self.assertEqual(recipients.email, self.partner_with_mail.email) def test_3_mail_send_to_company_test(self): - """ - Mail should only send with company mail - """ - recipients = self.create_mail_composer(self.partner_no_mail.id) + """Use company mail if recipient is the company.""" + recipients = self.create_mail_composer(self.company_test.id) self.assertEqual(recipients.email, self.company_test.email) self.assertNotEqual(recipients.email, self.partner_no_mail.email) From 89d859da589dd9ff04e5207d249a22a79cebf9a9 Mon Sep 17 00:00:00 2001 From: Tonow-c2c Date: Thu, 29 Nov 2018 14:44:11 +0100 Subject: [PATCH 08/10] fixup! fixup! fixup! fixup! fixup! fixup! fixup! [ADD][mail_parent_recipient][10] Add module to use mail of first partner --- .../tests/test_mail_parent_recipient.py | 63 ++++++++++--------- 1 file changed, 32 insertions(+), 31 deletions(-) diff --git a/mail_parent_recipient/tests/test_mail_parent_recipient.py b/mail_parent_recipient/tests/test_mail_parent_recipient.py index a6823c94..d98a7d99 100644 --- a/mail_parent_recipient/tests/test_mail_parent_recipient.py +++ b/mail_parent_recipient/tests/test_mail_parent_recipient.py @@ -7,13 +7,14 @@ from odoo.addons.mail.tests.common import TestMail class TestMailTemplate(TestMail): - def setUp(self): - super(TestMailTemplate, self).setUp() + @classmethod + def setUpClass(cls): + super(TestMailTemplate, cls).setUpClass() - self.Users = self.env['res.users'] - self.res_partner = self.env['res.partner'] - self.mail_template = self.env['mail.template'] - self.mail_comp_msg = self.env['mail.compose.message'] + 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 = { @@ -21,29 +22,29 @@ class TestMailTemplate(TestMail): 'email': 'company.mail.test@company' } - self.company_test = self.res_partner.create(company_vals) + cls.company_test = cls.res_partner.create(company_vals) # Partners test 1 without email partner_no_mail_vals = { 'name': 'partner_1', - 'parent_id': self.company_test.id, + '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': self.company_test.id, + 'parent_id': cls.company_test.id, } - self.partner_no_mail = self.res_partner.create(partner_no_mail_vals) - self.partner_with_mail = self.res_partner.create( + 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_id): - email_template = self.env['mail.template'].create({ - 'model_id': self.env['ir.model'].search([ + def create_mail_composer(cls, partner_to_send_id): + email_template = cls.env['mail.template'].create({ + 'model_id': cls.env['ir.model'].search([ ('model', '=', 'mail.channel') ], limit=1).id, 'name': 'Pigs Template', @@ -53,7 +54,7 @@ class TestMailTemplate(TestMail): 'partner_to': '%s' % (partner_to_send_id), }) - composer = self.mail_comp_msg.with_context({ + composer = cls.mail_comp_msg.with_context({ 'default_composition_mode': 'comment', 'default_model': 'mail.channel', 'default_use_template': True, @@ -64,7 +65,7 @@ class TestMailTemplate(TestMail): }) values = composer.onchange_template_id( email_template.id, - 'comment', 'mail.channel', self.group_pigs.id + 'comment', 'mail.channel', cls.group_pigs.id )['value'] # use _convert_to_cache to return a browse record list from command @@ -76,26 +77,26 @@ class TestMailTemplate(TestMail): return recipients - def test_1_mail_send_to_partner_no_mail(self): + def test_1_mail_send_to_partner_no_mail(cls): """Use company mail if recipient partner has no email.""" - recipients = self.create_mail_composer(self.partner_no_mail.id) + recipients = cls.create_mail_composer(cls.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) + cls.assertEqual(recipients.email, cls.company_test.email) + cls.assertNotEqual(recipients.email, cls.partner_no_mail.email) + cls.assertNotEqual(recipients.email, cls.partner_with_mail.email) - def test_2_mail_send_to_partner_with_mail(self): + def test_2_mail_send_to_partner_with_mail(cls): """Use partner mail if recipient partner has an email.""" - recipients = self.create_mail_composer(self.partner_with_mail.id) + recipients = cls.create_mail_composer(cls.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) + cls.assertNotEqual(recipients.email, cls.company_test.email) + cls.assertNotEqual(recipients.email, cls.partner_no_mail.email) + cls.assertEqual(recipients.email, cls.partner_with_mail.email) - def test_3_mail_send_to_company_test(self): + def test_3_mail_send_to_company_test(cls): """Use company mail if recipient is the company.""" - recipients = self.create_mail_composer(self.company_test.id) + recipients = cls.create_mail_composer(cls.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) + cls.assertEqual(recipients.email, cls.company_test.email) + cls.assertNotEqual(recipients.email, cls.partner_no_mail.email) + cls.assertNotEqual(recipients.email, cls.partner_with_mail.email) From be859926efb6978f43f28134754815a909de8d34 Mon Sep 17 00:00:00 2001 From: Tonow-c2c Date: Wed, 9 Jan 2019 15:03:31 +0100 Subject: [PATCH 09/10] fixup! fixup! fixup! fixup! fixup! fixup! fixup! fixup! [ADD][mail_parent_recipient][10] Add module to use mail of first partner --- mail_parent_recipient/readme/DESCRIPTION.rst | 3 +- .../tests/test_mail_parent_recipient.py | 59 ++++++++++++------- 2 files changed, 39 insertions(+), 23 deletions(-) diff --git a/mail_parent_recipient/readme/DESCRIPTION.rst b/mail_parent_recipient/readme/DESCRIPTION.rst index f0420bc9..27998dfc 100644 --- a/mail_parent_recipient/readme/DESCRIPTION.rst +++ b/mail_parent_recipient/readme/DESCRIPTION.rst @@ -1 +1,2 @@ -This modules add the fact to use partner's parent email as recipient. +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/tests/test_mail_parent_recipient.py b/mail_parent_recipient/tests/test_mail_parent_recipient.py index d98a7d99..c1324256 100644 --- a/mail_parent_recipient/tests/test_mail_parent_recipient.py +++ b/mail_parent_recipient/tests/test_mail_parent_recipient.py @@ -42,19 +42,19 @@ class TestMailTemplate(TestMail): partner_with_mail_vals ) - def create_mail_composer(cls, partner_to_send_id): - email_template = cls.env['mail.template'].create({ - 'model_id': cls.env['ir.model'].search([ + def create_mail_composer(self, partner_to_send_ids): + email_template = self.env['mail.template'].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': '%s' % (partner_to_send_id), + 'partner_to': ",".join(partner_to_send_ids), }) - composer = cls.mail_comp_msg.with_context({ + composer = self.mail_comp_msg.with_context({ 'default_composition_mode': 'comment', 'default_model': 'mail.channel', 'default_use_template': True, @@ -65,7 +65,7 @@ class TestMailTemplate(TestMail): }) values = composer.onchange_template_id( email_template.id, - 'comment', 'mail.channel', cls.group_pigs.id + 'comment', 'mail.channel', self.group_pigs.id )['value'] # use _convert_to_cache to return a browse record list from command @@ -77,26 +77,41 @@ class TestMailTemplate(TestMail): return recipients - def test_1_mail_send_to_partner_no_mail(cls): + def test_1_mail_send_to_partner_no_mail(self): """Use company mail if recipient partner has no email.""" - recipients = cls.create_mail_composer(cls.partner_no_mail.id) + recipients = self.create_mail_composer([str(self.partner_no_mail.id)]) - cls.assertEqual(recipients.email, cls.company_test.email) - cls.assertNotEqual(recipients.email, cls.partner_no_mail.email) - cls.assertNotEqual(recipients.email, cls.partner_with_mail.email) + 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(cls): + def test_2_mail_send_to_partner_with_mail(self): """Use partner mail if recipient partner has an email.""" - recipients = cls.create_mail_composer(cls.partner_with_mail.id) + recipients = self.create_mail_composer( + [str(self.partner_with_mail.id)] + ) - cls.assertNotEqual(recipients.email, cls.company_test.email) - cls.assertNotEqual(recipients.email, cls.partner_no_mail.email) - cls.assertEqual(recipients.email, cls.partner_with_mail.email) + 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(cls): + def test_3_mail_send_to_company_test(self): """Use company mail if recipient is the company.""" - recipients = cls.create_mail_composer(cls.company_test.id) - - cls.assertEqual(recipients.email, cls.company_test.email) - cls.assertNotEqual(recipients.email, cls.partner_no_mail.email) - cls.assertNotEqual(recipients.email, cls.partner_with_mail.email) + 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) From 7119f3d7b23ac7a7eb0d39664cc3f7afd9d35f4c Mon Sep 17 00:00:00 2001 From: Tonow-c2c Date: Wed, 9 Jan 2019 16:39:10 +0100 Subject: [PATCH 10/10] fixup! fixup! fixup! fixup! fixup! fixup! fixup! [ADD][mail_parent_recipient][10] Add module to use mail of first partner --- mail_parent_recipient/models/mail_template.py | 32 ++++++++++++------- .../tests/test_mail_parent_recipient.py | 4 ++- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/mail_parent_recipient/models/mail_template.py b/mail_parent_recipient/models/mail_template.py index 8de8068e..24ca15d5 100644 --- a/mail_parent_recipient/models/mail_template.py +++ b/mail_parent_recipient/models/mail_template.py @@ -2,6 +2,7 @@ # 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): @@ -19,16 +20,25 @@ class MailTemplate(models.Model): results, res_ids ) - for res_id, values in results.iteritems(): - partner_ids = values.get('partner_ids', []) - partners_with_emails = [] - for partner in self.env['res.partner'].sudo().browse(partner_ids): - current = partner - while current: - if current.email: - break - current = current.parent_id - partners_with_emails.append(current.id or partner.id) + 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 + results[res_id]['partner_ids'] = partners_with_emails return results diff --git a/mail_parent_recipient/tests/test_mail_parent_recipient.py b/mail_parent_recipient/tests/test_mail_parent_recipient.py index c1324256..3ebbba22 100644 --- a/mail_parent_recipient/tests/test_mail_parent_recipient.py +++ b/mail_parent_recipient/tests/test_mail_parent_recipient.py @@ -43,7 +43,9 @@ class TestMailTemplate(TestMail): ) def create_mail_composer(self, partner_to_send_ids): - email_template = self.env['mail.template'].create({ + 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,