commit
d96713de48
1
mail_parent_recipient/README.rst
Normal file
1
mail_parent_recipient/README.rst
Normal file
@ -0,0 +1 @@
|
||||
wait for the bot
|
1
mail_parent_recipient/__init__.py
Normal file
1
mail_parent_recipient/__init__.py
Normal file
@ -0,0 +1 @@
|
||||
from . import models
|
17
mail_parent_recipient/__manifest__.py
Normal file
17
mail_parent_recipient/__manifest__.py
Normal file
@ -0,0 +1,17 @@
|
||||
# Copyright 2018-2022 Camptocamp
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
{
|
||||
"name": "Mail parent recipient",
|
||||
"summary": "Send email to parent partner if partner's email is empty",
|
||||
"category": "Mail",
|
||||
"license": "AGPL-3",
|
||||
"version": "15.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"],
|
||||
}
|
2
mail_parent_recipient/models/__init__.py
Normal file
2
mail_parent_recipient/models/__init__.py
Normal file
@ -0,0 +1,2 @@
|
||||
from . import mail_template
|
||||
from . import res_config
|
35
mail_parent_recipient/models/mail_template.py
Normal file
35
mail_parent_recipient/models/mail_template.py
Normal file
@ -0,0 +1,35 @@
|
||||
# Copyright 2018-2022 Camptocamp
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
from odoo import models
|
||||
|
||||
|
||||
class MailTemplate(models.Model):
|
||||
|
||||
_inherit = "mail.template"
|
||||
|
||||
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().generate_recipients(results, res_ids)
|
||||
use_parent_address = (
|
||||
self.env["ir.config_parameter"].sudo().get_param("mail.use_parent_address")
|
||||
)
|
||||
disabled = self.env.context.get("no_parent_mail_recipient")
|
||||
if use_parent_address and not disabled:
|
||||
for res_id, values in results.items():
|
||||
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:
|
||||
if partner.commercial_partner_id.id not in partners.ids:
|
||||
partners_with_emails.append(
|
||||
partner.commercial_partner_id.id
|
||||
)
|
||||
results[res_id]["partner_ids"] = partners_with_emails
|
||||
return results
|
16
mail_parent_recipient/models/res_config.py
Normal file
16
mail_parent_recipient/models/res_config.py
Normal file
@ -0,0 +1,16 @@
|
||||
# Copyright 2022 Camptocamp SA
|
||||
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class ResConfigSettings(models.TransientModel):
|
||||
_inherit = "res.config.settings"
|
||||
|
||||
use_parent_mail_address = fields.Boolean(
|
||||
config_parameter="mail.use_parent_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
|
6
mail_parent_recipient/readme/DESCRIPTION.rst
Normal file
6
mail_parent_recipient/readme/DESCRIPTION.rst
Normal file
@ -0,0 +1,6 @@
|
||||
This module will check the recipients of an outgoing email.
|
||||
If a recipient has no email address set, it will use the parent's partner
|
||||
(if it has an email address) as recipient.
|
||||
|
||||
A setting named `Use Parent Mail Address` is available in
|
||||
the `Discuss` section of the general settings page.
|
1
mail_parent_recipient/tests/__init__.py
Normal file
1
mail_parent_recipient/tests/__init__.py
Normal file
@ -0,0 +1 @@
|
||||
from . import test_mail_parent_recipient
|
79
mail_parent_recipient/tests/test_mail_parent_recipient.py
Normal file
79
mail_parent_recipient/tests/test_mail_parent_recipient.py
Normal file
@ -0,0 +1,79 @@
|
||||
# Copyright 2018-2022 Camptocamp
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo.addons.mail.tests.common import MailCommon
|
||||
|
||||
|
||||
class TestMailTemplate(MailCommon):
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
super().setUpClass()
|
||||
cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True))
|
||||
|
||||
cls.env["ir.config_parameter"].set_param("mail.use_parent_address", True)
|
||||
|
||||
cls.res_partner = cls.env["res.partner"]
|
||||
cls.company_test = cls.res_partner.create(
|
||||
{
|
||||
"name": "company_name_test",
|
||||
"email": "company.mail.test@company",
|
||||
}
|
||||
)
|
||||
cls.partner_no_mail = cls.res_partner.create(
|
||||
{
|
||||
"name": "partner_1",
|
||||
"parent_id": cls.company_test.id,
|
||||
}
|
||||
)
|
||||
cls.partner_with_mail = cls.res_partner.create(
|
||||
{
|
||||
"name": "partner_2",
|
||||
"email": "partner.2.mail.test@company",
|
||||
"parent_id": cls.company_test.id,
|
||||
}
|
||||
)
|
||||
cls.record = cls.env.ref("base.partner_demo")
|
||||
cls.email_template = (
|
||||
cls.env["mail.template"]
|
||||
.with_context(test_parent_mail_recipient=True)
|
||||
.create(
|
||||
{
|
||||
"model_id": cls.env["ir.model"]
|
||||
.search([("model", "=", "mail.channel")], limit=1)
|
||||
.id,
|
||||
"name": "Pigs Template",
|
||||
"subject": "${object.name}",
|
||||
"body_html": "${object.description}",
|
||||
"partner_to": "",
|
||||
}
|
||||
)
|
||||
)
|
||||
|
||||
def _get_email_recipient_for(self, partner_to_send_ids):
|
||||
self.email_template.partner_to = ",".join(
|
||||
[str(partner_id) for partner_id in partner_to_send_ids]
|
||||
)
|
||||
values = self.email_template.generate_email(self.record.id, ["partner_to"])
|
||||
return values["partner_ids"]
|
||||
|
||||
def test_mail_send_to_partner_no_mail(self):
|
||||
"""Check recipient without email, comapny email is used."""
|
||||
recipients = self._get_email_recipient_for(self.partner_no_mail.ids)
|
||||
self.assertEqual(recipients, self.company_test.ids)
|
||||
|
||||
def test_mail_send_to_partner_with_mail(self):
|
||||
"""Check recipient has email, nothing is changed."""
|
||||
recipients = self._get_email_recipient_for(self.partner_with_mail.ids)
|
||||
self.assertEqual(recipients, self.partner_with_mail.ids)
|
||||
|
||||
def test_mail_send_to_company_test(self):
|
||||
"""Check company email is used."""
|
||||
recipients = self._get_email_recipient_for(self.company_test.ids)
|
||||
self.assertEqual(recipients, self.company_test.ids)
|
||||
|
||||
def test_mail_send_to_company_and_partner_no_mail(self):
|
||||
"""Check a partner is not add twice in recipient list."""
|
||||
recipients = self._get_email_recipient_for(
|
||||
[self.partner_no_mail.id, self.company_test.id]
|
||||
)
|
||||
self.assertEqual(recipients, self.company_test.ids)
|
25
mail_parent_recipient/views/res_config_views.xml
Normal file
25
mail_parent_recipient/views/res_config_views.xml
Normal file
@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<odoo>
|
||||
<record id="view_configuration_mail_parent_recipient" model="ir.ui.view">
|
||||
<field name="name">mail.parent.recipient.config.settings</field>
|
||||
<field name="model">res.config.settings</field>
|
||||
<field name="inherit_id" ref="mail.res_config_settings_view_form" />
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//div[@id='emails']" position='inside'>
|
||||
|
||||
<div class="col-12 col-lg-6 o_setting_box" id="mail_parent_recipient_setting">
|
||||
<div class="o_setting_left_pane">
|
||||
<field name="use_parent_mail_address" />
|
||||
</div>
|
||||
<div class="o_setting_right_pane">
|
||||
<label for="use_parent_mail_address" />
|
||||
<div class="text-muted" id="mail_parent_recipient">
|
||||
Use partner's parent email if recipient partner has not email set.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
</odoo>
|
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