如何通过Odoo 8中的代码使用电子邮件模板?

时间:2015-09-28 14:30:16

标签: python python-2.7 odoo-8 odoo email-templates

我创建了一个名为event的模型和另一个名为event.participant的模型。模型event包含字段participants,该字段是指向One2many的{​​{1}}字段(事件1:N event.participant )。< / p>

event.participant的形式我有一个按钮确认事件,下一个代码:

event

方法@api.multi def confirm_event(self): for event in self: return event.participants.notify(composition_mode='mass_mail') 是我在模型notify中创建的。它的作用是打开每次要从Odoo发送邮件时看到的event.participant向导表单(字段主题正文 template_id 等)。以下是方法mail.compose.message

的代码
notify

现在,我将展示一下我使用此代码获得的行为示例:

我有一个ID为16的活动。该活动有两个参与者,ID为21和22.我转到活动表格,然后点击按钮确认活动。正确打开发送电子邮件的向导表单。但是,然后,我选择了一个电子邮件模板(此电子邮件模板适用于@api.multi def notify(self, composition_mode=False): form_view_id = self.env.ref( 'mail.email_compose_message_wizard_form').id ctx = self.env.context.copy() if composition_mode: ctx.update({ 'default_composition_mode': composition_mode, }) result = { 'name': 'Send Mail', 'view_type': 'form', 'view_mode': 'form', 'views': [(form_view_id, 'form'), ], 'res_model': 'mail.compose.message', 'context': ctx, 'type': 'ir.actions.act_window', 'target': 'new', } return result 模型),然后单击发送邮件

我收到模板渲染错误。我想我知道为什么我会收到这个错误:

向导表单中的event.participant事件active_model [16] ,而它们应为事件。参与者 [21,22] 。因此,由于所选的电子邮件模板适用于active_ids,因此其中的变量会失败。例如,电子邮件模板的event.participant${object.email|safe}变量被object的记录 16 取代。模型event没有名为event的字段,因此会生成渲染错误。

我无法创建适用于email的模板,因为它是一个nosense(如何在模板的 中指明参与者的所有电子邮件地址?)

我必须使用适用于event的模板,但我需要在渲染时获得正确的event.participantactive_model。我试图直接在上下文中修改这些变量,但是我给出了另一个错误。

我如何实现目标?有没有更简单的模式呢?任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:4)

您可以尝试以下代码:

@api.multi
def confirm_event(self):
    for event in self:
        return event.participants.notify()


@api.multi
def notify(self):
    self.ensure_one()
    form_view_id = self.env.ref('mail.email_compose_message_wizard_form')
    ctx = dict(default_model='event.participants',
               default_res_id=self.id,
               default_composition_mode='mass_mail',
               )
    return {
        'name': 'Send Mail',
        'type': 'ir.actions.act_window',
        'view_type': 'form',
        'view_mode': 'form',
        'res_model': 'mail.compose.message',
        'views': [(form_view_id.id, 'form'), ],
        'view_id': form_view_id.id,
        'context': ctx,
        'target': 'new',
    }

答案 1 :(得分:2)

我找到了解决方案,但我认为这很疯狂。最后我修改了上下文中的active_modelactive_ids,我告诉它发出错误,所以我也修改了active_id变量。现在它有效。所以我已将这些行添加到ctx方法的notify更新中:

ctx.update({
    'default_composition_mode': composition_mode,
    'active_model': self._name,
    'active_ids': self._ids,
    'active_id': self._ids[0],
})

尽管按照我的意愿工作,但我认为这是一个糟糕的解决方法,而且我非常确定它必须是解决我问题的更好解决方案。

如果有人知道,请在这里发布答案!

答案 2 :(得分:2)

如果您向其发送 view_id ,则会以给定的表单视图打开/重定向。

您可以尝试这个解决方案:

@api.multi
def notify(self, composition_mode=False):
    form_view_id = self.env.ref('mail.email_compose_message_wizard_form', False)
    ctx = self.env.context.copy()
    if composition_mode:
        ctx.update({
            'default_composition_mode': composition_mode,
        })
    result = {
        'name': _('Send Mail'),
        'view_type': 'form',
        'view_mode': 'form',
        'views': [(form_view_id, 'form')],
        'res_model': 'mail.compose.message',
        'view_id': form_view_id and form_view_id.id,
        'context': ctx,
        'type': 'ir.actions.act_window',
        'target': 'new',
    }
    return result