如何从位于 Odoo 11 表单操作下拉列表中的按钮发送电子邮件?
How to send an email from a button located in the action dropdown of an Odoo 11 form?
我只是 Odoo 的新手。我正在为 Odoo 11 创建一个自定义模块。我想在 hr_payroll
模块中的 hr.payslip
中添加一个新的 link 。因此,当管理员导航到个人工资单时,我想在操作中添加一个名为 Email Payslip 的新选项。单击此按钮后,它会向员工发送电子邮件。
因此,为了实现这一点,我将我的自定义模块命名为电子邮件工资单。
代码是这样的:
init.py
from . import models
清单.py
{
'name': 'Email Payslip',
'summary': """This module will send email with payslip""",
'version': '10.0.1.0.0',
'description': """This module will send email with payslip""",
'author': 'Test',
'company': 'test',
'website': 'https://test.com',
'category': 'Tools',
'depends': ['base'],
'license': 'AGPL-3',
'data': [
'views/email_payslip.xml',
],
'demo': [],
'installable': True,
'auto_install': False,
}
模型init.py
from . import email_payslip
型号email_payslip.py
import babel
from datetime import date, datetime, time
from dateutil.relativedelta import relativedelta
from pytz import timezone
from odoo import api, fields, models, tools, _
from odoo.addons import decimal_precision as dp
from odoo.exceptions import UserError, ValidationError
class EmailPayslip(models.Model):
#print 'sdabhd'
_name = 'email.payslip'
name = fields.Char(string="Title", required=True)
description = 'Email Payslip'
EmailPayslip()
观看次数email_payslip.xml
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<act_window id="email_payslip" src_model="hr.payslip" res_model="hr.payslip.line" name="Email Payslip"/>
</odoo>
上面的代码在操作中显示了电子邮件工资单菜单,但是当我点击 link 它显示的是员工工资单记录。
有人可以帮我吗?实现这一目标的正确方法是什么?非常感谢任何帮助和建议。
这是我目前得到的:
我了解到您想在由模块 hr_payroll
.
创建的模型 hr.payslip
的表单的操作部分添加一个按钮
我看到您正在创建一个名为 email.payslip
的新模型。那不是达到你的目的所必需的,检查以下步骤:
修改模块的 __manifest__.py
使其依赖于 hr_payroll
和 mail
:
'depends': [
'hr_payroll',
'mail',
],
这样修改您的 XML 操作:
<record id="action_email_payslip" model="ir.actions.server">
<field name="name">Email Payslip</field>
<field name="model_id" ref="hr_payroll.model_hr_payslip"/>
<field name="binding_model_id" ref="hr_payroll.model_hr_payslip"/>
<field name="state">code</field>
<field name="code">
if records:
action = records.action_email_payslip_send()
</field>
</record>
这是在模型视图的操作部分创建一个按钮 hr.payslip
。该按钮会调用该模型的一个Python方法,该方法负责调用pop-up发送邮件。
现在让我们在 Python 中定义该方法:
class HrPayslip(models.Model):
_inherit = 'hr.payslip'
@api.multi
def action_email_payslip_send(self):
self.ensure_one()
template = self.env.ref(
'your_module.email_template_payslip',
False,
)
compose_form = self.env.ref(
'mail.email_compose_message_wizard_form',
False,
)
ctx = dict(
default_model='hr.payslip',
default_res_id=self.id,
default_use_template=bool(template),
default_template_id=template and template.id or False,
default_composition_mode='comment',
)
return {
'name': _('Compose Email'),
'type': 'ir.actions.act_window',
'view_type': 'form',
'view_mode': 'form',
'res_model': 'mail.compose.message',
'views': [(compose_form.id, 'form')],
'view_id': compose_form.id,
'target': 'new',
'context': ctx,
}
只需将 your_module
替换为您的模块的技术名称。此方法将打开表单以发送电子邮件,我们告诉它默认加载我们的自定义电子邮件模板,其 XML ID 为 email_template_payslip
.
现在,我们必须在 XML 中定义电子邮件模板。在你模块的根路径下新建一个文件夹,名字叫data
,放在XML文件里面,比如名字叫email_template_data.xml
。不要忘记在 __manifest__.py
的 data
键中添加行 'data/email_template_data.xml'
,以告诉您的模块它必须加载 XML 文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<odoo noupdate="0">
<record id="email_template_payslip" model="mail.template">
<field name="name">Payslip - Send by Email</field>
<field name="email_from">${(user.email or '')|safe}</field>
<field name="subject">${object.company_id.name|safe} Payslip (Ref ${object.name or 'n/a' })</field>
<field name="email_to">${(object.employee_id.work_email or '')|safe}</field>
<field name="model_id" ref="hr_payroll.model_hr_payslip"/>
<field name="auto_delete" eval="True"/>
<field name="lang">${(object.employee_id.user_id.lang or user.lang)}</field>
<field name="body_html"><![CDATA[
<div style="font-family: 'Lucida Grande', Ubuntu, Arial, Verdana, sans-serif; font-size: 12px; color: rgb(34, 34, 34); background-color: #FFF; ">
<p>Hello ${object.employee_id.name},</p>
<p>Here is your payslip from ${object.company_id.name}: </p>
<p style="border-left: 1px solid #8e0000; margin-left: 30px;">
Name: <strong>${object.name}</strong><br />
</p>
<p>If you have any question, do not hesitate to contact us.</p>
<p>Thank you for choosing ${object.company_id.name or 'us'}!</p>
<br/>
<br/>
</div>
]]></field>
</record>
</odoo>
在 ctx
变量中,您拥有在 Python 方法中添加的所有数据。在 object
变量中,当前 hr.payslip
记录的每个字段。您可以使用点符号来访问任何关系字段。查看其他电子邮件模板以了解有关 Mako 语言的更多信息。
如果您确定要使用您的模型 email.payslip
,您应该执行几乎相同的过程(具体取决于您想要什么)并将 hr.payslip
引用替换为 email.payslip
引用.
一旦您非常确定您不再对电子邮件模板进行任何修改,您可以将 noupdate
属性设置为 1,让 Odoo 用户从界面自定义电子邮件模板而不会丢失如果您的模块已更新,它们会发生变化:
<odoo noupdate="1">
...
</odoo>
一旦您看到电子邮件 pop-up 并且模板默认加载成功,请记住检查这三个步骤:
- 必须填写当前工资单记录的员工的工作电子邮件(因为它是电子邮件的目的地)。
- 您必须已经配置了发送邮件服务器。
- 检查 cron 任务 邮件:电子邮件队列管理器。它必须处于活动状态并且每分钟 运行(如果您想最多在一分钟内发送电子邮件),或者只需单击 运行 手动 。也可以在电子邮件中将参数
force_send
设置为 True,以便不依赖于 cron 作业。
我只是 Odoo 的新手。我正在为 Odoo 11 创建一个自定义模块。我想在 hr_payroll
模块中的 hr.payslip
中添加一个新的 link 。因此,当管理员导航到个人工资单时,我想在操作中添加一个名为 Email Payslip 的新选项。单击此按钮后,它会向员工发送电子邮件。
因此,为了实现这一点,我将我的自定义模块命名为电子邮件工资单。
代码是这样的:
init.py
from . import models
清单.py
{
'name': 'Email Payslip',
'summary': """This module will send email with payslip""",
'version': '10.0.1.0.0',
'description': """This module will send email with payslip""",
'author': 'Test',
'company': 'test',
'website': 'https://test.com',
'category': 'Tools',
'depends': ['base'],
'license': 'AGPL-3',
'data': [
'views/email_payslip.xml',
],
'demo': [],
'installable': True,
'auto_install': False,
}
模型init.py
from . import email_payslip
型号email_payslip.py
import babel
from datetime import date, datetime, time
from dateutil.relativedelta import relativedelta
from pytz import timezone
from odoo import api, fields, models, tools, _
from odoo.addons import decimal_precision as dp
from odoo.exceptions import UserError, ValidationError
class EmailPayslip(models.Model):
#print 'sdabhd'
_name = 'email.payslip'
name = fields.Char(string="Title", required=True)
description = 'Email Payslip'
EmailPayslip()
观看次数email_payslip.xml
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<act_window id="email_payslip" src_model="hr.payslip" res_model="hr.payslip.line" name="Email Payslip"/>
</odoo>
上面的代码在操作中显示了电子邮件工资单菜单,但是当我点击 link 它显示的是员工工资单记录。
有人可以帮我吗?实现这一目标的正确方法是什么?非常感谢任何帮助和建议。
这是我目前得到的:
我了解到您想在由模块 hr_payroll
.
hr.payslip
的表单的操作部分添加一个按钮
我看到您正在创建一个名为 email.payslip
的新模型。那不是达到你的目的所必需的,检查以下步骤:
修改模块的 __manifest__.py
使其依赖于 hr_payroll
和 mail
:
'depends': [
'hr_payroll',
'mail',
],
这样修改您的 XML 操作:
<record id="action_email_payslip" model="ir.actions.server">
<field name="name">Email Payslip</field>
<field name="model_id" ref="hr_payroll.model_hr_payslip"/>
<field name="binding_model_id" ref="hr_payroll.model_hr_payslip"/>
<field name="state">code</field>
<field name="code">
if records:
action = records.action_email_payslip_send()
</field>
</record>
这是在模型视图的操作部分创建一个按钮 hr.payslip
。该按钮会调用该模型的一个Python方法,该方法负责调用pop-up发送邮件。
现在让我们在 Python 中定义该方法:
class HrPayslip(models.Model):
_inherit = 'hr.payslip'
@api.multi
def action_email_payslip_send(self):
self.ensure_one()
template = self.env.ref(
'your_module.email_template_payslip',
False,
)
compose_form = self.env.ref(
'mail.email_compose_message_wizard_form',
False,
)
ctx = dict(
default_model='hr.payslip',
default_res_id=self.id,
default_use_template=bool(template),
default_template_id=template and template.id or False,
default_composition_mode='comment',
)
return {
'name': _('Compose Email'),
'type': 'ir.actions.act_window',
'view_type': 'form',
'view_mode': 'form',
'res_model': 'mail.compose.message',
'views': [(compose_form.id, 'form')],
'view_id': compose_form.id,
'target': 'new',
'context': ctx,
}
只需将 your_module
替换为您的模块的技术名称。此方法将打开表单以发送电子邮件,我们告诉它默认加载我们的自定义电子邮件模板,其 XML ID 为 email_template_payslip
.
现在,我们必须在 XML 中定义电子邮件模板。在你模块的根路径下新建一个文件夹,名字叫data
,放在XML文件里面,比如名字叫email_template_data.xml
。不要忘记在 __manifest__.py
的 data
键中添加行 'data/email_template_data.xml'
,以告诉您的模块它必须加载 XML 文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<odoo noupdate="0">
<record id="email_template_payslip" model="mail.template">
<field name="name">Payslip - Send by Email</field>
<field name="email_from">${(user.email or '')|safe}</field>
<field name="subject">${object.company_id.name|safe} Payslip (Ref ${object.name or 'n/a' })</field>
<field name="email_to">${(object.employee_id.work_email or '')|safe}</field>
<field name="model_id" ref="hr_payroll.model_hr_payslip"/>
<field name="auto_delete" eval="True"/>
<field name="lang">${(object.employee_id.user_id.lang or user.lang)}</field>
<field name="body_html"><![CDATA[
<div style="font-family: 'Lucida Grande', Ubuntu, Arial, Verdana, sans-serif; font-size: 12px; color: rgb(34, 34, 34); background-color: #FFF; ">
<p>Hello ${object.employee_id.name},</p>
<p>Here is your payslip from ${object.company_id.name}: </p>
<p style="border-left: 1px solid #8e0000; margin-left: 30px;">
Name: <strong>${object.name}</strong><br />
</p>
<p>If you have any question, do not hesitate to contact us.</p>
<p>Thank you for choosing ${object.company_id.name or 'us'}!</p>
<br/>
<br/>
</div>
]]></field>
</record>
</odoo>
在 ctx
变量中,您拥有在 Python 方法中添加的所有数据。在 object
变量中,当前 hr.payslip
记录的每个字段。您可以使用点符号来访问任何关系字段。查看其他电子邮件模板以了解有关 Mako 语言的更多信息。
如果您确定要使用您的模型 email.payslip
,您应该执行几乎相同的过程(具体取决于您想要什么)并将 hr.payslip
引用替换为 email.payslip
引用.
一旦您非常确定您不再对电子邮件模板进行任何修改,您可以将 noupdate
属性设置为 1,让 Odoo 用户从界面自定义电子邮件模板而不会丢失如果您的模块已更新,它们会发生变化:
<odoo noupdate="1">
...
</odoo>
一旦您看到电子邮件 pop-up 并且模板默认加载成功,请记住检查这三个步骤:
- 必须填写当前工资单记录的员工的工作电子邮件(因为它是电子邮件的目的地)。
- 您必须已经配置了发送邮件服务器。
- 检查 cron 任务 邮件:电子邮件队列管理器。它必须处于活动状态并且每分钟 运行(如果您想最多在一分钟内发送电子邮件),或者只需单击 运行 手动 。也可以在电子邮件中将参数
force_send
设置为 True,以便不依赖于 cron 作业。