如何通过Odoo 11表单的操作下拉菜单中的按钮发送电子邮件?

时间:2019-05-02 09:50:06

标签: python odoo odoo-11 odoo-view

我只是Odoo的新手。我正在为Odoo 11创建一个自定义模块。我想在hr.payslip模块的hr_payroll中添加一个新链接。因此,当管理员将导航至单个薪资单时,在操作中我想添加一个名为 Email Payslip 的新选项。单击此按钮后,它将向员工发送电子邮件。

为此,我将自定义模块命名为电子邮件工资单。

代码如下:

初始化 .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>

上面的代码显示了操作中的电子邮件工资单菜单,但是当我单击链接时,它显示了员工工资单记录。

那么有人可以在这里帮助我吗?什么是实现这一目标的正确方法?任何帮助和建议将不胜感激。

这是我到目前为止所得到的:

Preview

1 个答案:

答案 0 :(得分:2)

我了解到您想在模块hr.payslip创建的模型hr_payroll形式的动作部分中添加按钮。

我看到您正在创建一个名为email.payslip的新模型。不必达到目的,请检查以下步骤:

修改模块的__manifest__.py,使其依赖于hr_payrollmail

'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方法,该方法负责调用弹出窗口以发送电子邮件。

现在让我们在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。不要忘记在data的{​​{1}}键中添加行__manifest__.py,以告诉您的模块它必须加载该XML文件内容:

'data/email_template_data.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;"> &nbsp;&nbsp;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> 变量中,您具有在Python方法中添加的每个数据。在ctx变量中,当前object记录的每个字段。您可以使用点表示法来到达任何关系字段。查看其他电子邮件模板,以了解有关Mako语言的更多信息。

如果您确实要使用模型hr.payslip,则应该执行几乎相同的过程(具体取决于您要的是什么),并将email.payslip引用替换为hr.payslip。 / p>

一旦确定您将不再对电子邮件模板进行任何修改,就可以将email.payslip属性设置为1,以使Odoo用户可以从界面自定义电子邮件模板而不会丢失其更改如果您的模块已更新:

noupdate

一旦您看到电子邮件弹出窗口,并且默认情况下模板加载成功,请记住检查以下三个步骤:

  1. 当前工资单记录的员工的工作电子邮件必须填写(因为它是电子邮件的目的地)。
  2. 您必须已经配置了外发邮件服务器。
  3. 检查cron任务 Mail:Email Queue Manager 。它必须处于活动状态并且每分钟运行一次(如果您最多希望在一分钟内发送电子邮件),或者只需单击手动运行。另外,可以将电子邮件中的参数<odoo noupdate="1"> ... </odoo> 设置为 True ,以便不依赖于cron作业。