Add mail_parent_recipient
This commit is contained in:
parent
2c10160c18
commit
985840a348
3
mail_parent_recipient/__init__.py
Normal file
3
mail_parent_recipient/__init__.py
Normal file
@ -0,0 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import models
|
18
mail_parent_recipient/__manifest__.py
Normal file
18
mail_parent_recipient/__manifest__.py
Normal file
@ -0,0 +1,18 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright 2018 Camptocamp
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
{
|
||||
"name": "Mail parent recipient",
|
||||
"description": "Send email to parent partner if partner's email is empty",
|
||||
"category": "Mail",
|
||||
"license": "AGPL-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',
|
||||
],
|
||||
"data": ["views/res_config_views.xml"]
|
||||
}
|
5
mail_parent_recipient/models/__init__.py
Normal file
5
mail_parent_recipient/models/__init__.py
Normal file
@ -0,0 +1,5 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import company
|
||||
from . import mail_template
|
||||
from . import res_config
|
16
mail_parent_recipient/models/company.py
Normal file
16
mail_parent_recipient/models/company.py
Normal file
@ -0,0 +1,16 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright 2022 Camptocamp SA
|
||||
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class ResCompany(models.Model):
|
||||
|
||||
_inherit = "res.company"
|
||||
|
||||
use_parent_mail_address = fields.Boolean(
|
||||
string="Use Parent Mail Address",
|
||||
help="When an email is sent, fallback to partner's parent email if no "
|
||||
"email is set on the recipient partner."
|
||||
)
|
38
mail_parent_recipient/models/mail_template.py
Normal file
38
mail_parent_recipient/models/mail_template.py
Normal file
@ -0,0 +1,38 @@
|
||||
# -*- 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):
|
||||
"""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
|
||||
)
|
||||
disabled = self.env.context.get('no_parent_mail_recipient')
|
||||
if self.env.user.company_id.use_parent_mail_address and not disabled:
|
||||
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:
|
||||
if partner.email:
|
||||
partners_with_emails.append(partner.id)
|
||||
elif partner.commercial_partner_id.email:
|
||||
partners_with_emails.append(
|
||||
partner.commercial_partner_id.id
|
||||
)
|
||||
# else:
|
||||
# partner_with_emails.append(partner.id)
|
||||
results[res_id]['partner_ids'] = partners_with_emails
|
||||
return results
|
17
mail_parent_recipient/models/res_config.py
Normal file
17
mail_parent_recipient/models/res_config.py
Normal file
@ -0,0 +1,17 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright 2022 Camptocamp SA
|
||||
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class BaseConfiguration(models.TransientModel):
|
||||
_inherit = "base.config.settings"
|
||||
|
||||
use_parent_mail_address = fields.Boolean(
|
||||
related="company_id.use_parent_mail_address",
|
||||
help="""
|
||||
When checked, for partner without eamil the system will try
|
||||
to use the email address of the partner's parent.
|
||||
"""
|
||||
)
|
2
mail_parent_recipient/readme/CONTRIBUTORS.rst
Normal file
2
mail_parent_recipient/readme/CONTRIBUTORS.rst
Normal file
@ -0,0 +1,2 @@
|
||||
* Thomas Nowicki <thomas.nowicki@camptocamp.com>
|
||||
* Thierry Ducrest <thierry.ducrest@camptocamp.com>
|
3
mail_parent_recipient/readme/CREDITS.rst
Normal file
3
mail_parent_recipient/readme/CREDITS.rst
Normal file
@ -0,0 +1,3 @@
|
||||
The development of this module has been financially supported by:
|
||||
|
||||
* Camptocamp
|
2
mail_parent_recipient/readme/DESCRIPTION.rst
Normal file
2
mail_parent_recipient/readme/DESCRIPTION.rst
Normal file
@ -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.
|
3
mail_parent_recipient/tests/__init__.py
Normal file
3
mail_parent_recipient/tests/__init__.py
Normal file
@ -0,0 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import test_mail_parent_recipient
|
122
mail_parent_recipient/tests/test_mail_parent_recipient.py
Normal file
122
mail_parent_recipient/tests/test_mail_parent_recipient.py
Normal file
@ -0,0 +1,122 @@
|
||||
# -*- 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.env = cls.env(context=dict(cls.env.context, tracking_disable=True))
|
||||
|
||||
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']
|
||||
|
||||
cls.env.user.company_id.use_parent_mail_address = True
|
||||
# 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({
|
||||
'test_parent_mail_recipient': True,
|
||||
'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)
|
18
mail_parent_recipient/views/res_config_views.xml
Normal file
18
mail_parent_recipient/views/res_config_views.xml
Normal file
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data>
|
||||
<record id="view_configuration_mail_parent_recipient" model="ir.ui.view">
|
||||
<field name="name">mail.parent.recipient.config.settings</field>
|
||||
<field name="model">base.config.settings</field>
|
||||
<field name="inherit_id" ref="mail.view_general_configuration_mail_alias_domain"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//div[@name='email']" position='inside'>
|
||||
<div>
|
||||
<field name="use_parent_mail_address"/>
|
||||
<label for="use_parent_mail_address"/>
|
||||
</div>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
1
setup/mail_parent_recipient/odoo/__init__.py
Normal file
1
setup/mail_parent_recipient/odoo/__init__.py
Normal file
@ -0,0 +1 @@
|
||||
__import__('pkg_resources').declare_namespace(__name__)
|
1
setup/mail_parent_recipient/odoo/addons/__init__.py
Normal file
1
setup/mail_parent_recipient/odoo/addons/__init__.py
Normal file
@ -0,0 +1 @@
|
||||
__import__('pkg_resources').declare_namespace(__name__)
|
1
setup/mail_parent_recipient/odoo/addons/mail_parent_recipient
Symbolic link
1
setup/mail_parent_recipient/odoo/addons/mail_parent_recipient
Symbolic link
@ -0,0 +1 @@
|
||||
../../../../mail_parent_recipient
|
6
setup/mail_parent_recipient/setup.py
Normal file
6
setup/mail_parent_recipient/setup.py
Normal file
@ -0,0 +1,6 @@
|
||||
import setuptools
|
||||
|
||||
setuptools.setup(
|
||||
setup_requires=['setuptools-odoo'],
|
||||
odoo_addon=True,
|
||||
)
|
Loading…
Reference in New Issue
Block a user