如何从一个位于odoo11表单的操作下拉列表中的按钮发送电子邮件?

2024-04-29 09:45:36 发布

您现在位置:Python中文网/ 问答频道 /正文

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

为了实现这一点,我制作了一个名为电子邮件工资条的定制模块。在

代码是这样的:

初始化.py

from . import models

清单.py

^{pr2}$

模型init.py

from . import 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()

查看电子邮件_工资条.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


Tags: 模块namefrompyodooimport链接models
1条回答
网友
1楼 · 发布于 2024-04-29 09:45:36

我已经知道,您希望在模型hr.payslip的形式的actions部分添加一个按钮,该模型由模块hr_payroll创建。在

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

修改模块的__manifest__.py,使其依赖于hr_payroll和{}:

'depends': [
    'hr_payroll',
    'mail',
],

按如下方式修改XML操作:

^{pr2}$

这是在模型hr.payslip视图的actions部分创建一个按钮。该按钮将调用此模型的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。不要忘记在__manifest__.pydata键中添加'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;">
       &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>

ctx变量中,您拥有在Python方法中添加的所有数据。在object变量中,当前hr.payslip记录的每个字段。您可以使用点表示法来访问任何关系字段。查看其他电子邮件模板以了解更多有关Mako语言的信息。在

如果您确实想使用您的模型email.payslip,那么您应该执行几乎相同的过程(取决于您到底想要什么),并将hr.payslip引用替换为email.payslip引用。在

一旦您确定不再对电子邮件模板进行任何修改,可以将noupdate属性设置为1,以允许Odoo用户在更新模块时从界面自定义电子邮件模板,而不会丢失更改:

<odoo noupdate="1">
    ...
</odoo>

一旦您看到电子邮件弹出窗口和默认加载的模板“确定”,请记住选中以下三个步骤:

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

相关问题 更多 >