Как отправить электронное письмо с кнопки, расположенной в раскрывающемся списке действий формы Odoo 11? - PullRequest
1 голос
/ 02 мая 2019

Я просто новичок в Odoo.Я создаю пользовательский модуль для Odoo 11. Я хочу добавить новую ссылку в hr.payslip в hr_payroll модуле.Поэтому, когда администратор перейдет к отдельному листу оплаты, в действие я хочу добавить новую опцию под названием Email Payslip .Если щелкнуть по нему, он отправит электронное письмо сотруднику.

Поэтому, чтобы добиться этого, я сделал свой пользовательский модуль с именем e-mail 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>

Приведенный выше код показывает меню платежной ведомости электронной почты в действии, но когда я нажимаюпо ссылке он показывает отчет о зарплате сотрудника.

Так может кто-нибудь помочь мне здесь?Каков был бы правильный подход для достижения этого?Буду очень признателен за любую помощь и предложения.

Это то, что я получил до сих пор:

Preview

1 Ответ

2 голосов
/ 07 мая 2019

Я понял, что вы хотите добавить кнопку в раздел действий формы модели hr.payslip, созданной модулем hr_payroll.

Я вижу, что вы создаете новую модельназванный 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 этой модели, который будет отвечать за вызов всплывающего окна для отправки электронного письма.

Теперь давайте определим этот метод в 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-идентификатор которого email_template_payslip.

Теперь нам нужно определить этот шаблон электронной почты в XML,Создайте новую папку с именем data в корневом каталоге вашего модуля, поместите в файл XML, например, с именем email_template_data.xml.Не забудьте добавить data ключ вашей __manifest__.py строки '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>

После того, как вы увидите всплывающее окно электронной почты и шаблон по умолчанию загружен OK, не забудьте проверить эти три шага:

  1. Рабочий адрес электронной почты сотрудника текущей записи платежного листа должен быть заполнен (так как это адресат электронной почты).
  2. Вы должны настроить свой сервер исходящей почты.
  3. Проверьте задачу cron Почта: менеджер очередей электронной почты .Он должен быть активным и запущенным каждую минуту (если вы хотите отправить электронное письмо максимум за одну минуту), или просто нажмите Запустить вручную .Также параметр force_send может быть установлен на True в электронном письме, чтобы не зависеть от заданий cron.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...