【问题标题】:How to use an email template through code in Odoo 8?如何通过 Odoo 8 中的代码使用电子邮件模板?
【发布时间】:2015-09-28 14:30:16
【问题描述】:

我创建了一个名为 event 的模型和另一个名为 event.participant 的模型。模型event 有字段participants,这是一个指向event.participantOne2many 字段(event 1:N event.participant)。

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

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

方法notify 是我在模型event.participant 中创建的。它的作用是打开您每次想要从 Odoo 发送邮件时看到的 mail.compose.message 向导表单(带有 fromtosubject 字段bodytemplate_id 等)。这是notify方法的代码:

@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

现在我将展示我使用此代码得到的行为示例:

我有一个 ID 为 16 的活动。该活动有两个 ID 为 21 和 22 的参与者。我转到活动表单并单击按钮确认活动。发送电子邮件的向导表单已正确打开。但是,然后,我选择了一个电子邮件模板(此电子邮件模板适用于event.participant 模型),然后单击发送邮件

我收到模板呈现错误。我想我知道为什么会出现这个错误:

向导表单中的active_modeleventactive_ids[16],而它们应该是event.participant > 和 [21, 22]。 So, as the email template selected applies to event.participant, the variables inside it fail.例如,电子邮件模板的 to${object.email|safe}object 变量被 event 的记录 16 替换。模型event 没有名为email 的字段,因此会生成渲染错误。

我无法创建一个适用于event 的模板,因为这将是无稽之谈(我如何在模板的to 中指明所有参与者的电子邮件地址?)。

我必须使用适用于event.participant 的模板,但我需要在渲染时拥有正确的active_modelactive_ids。我尝试直接在上下文中修改这些变量,但又报错了。

我怎样才能达到我的目的?有没有更简单的模式可以做到这一点?任何帮助将不胜感激!

【问题讨论】:

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


    【解决方案1】:

    你可以试试这个代码:

    @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',
        }
    

    【讨论】:

    • 非常感谢您的回答@Jainik!但是我不能在这里使用self.ensure_one()self.id,因为notify 通常是从几个参与者的记录集中调用的(这就是我需要使用群发邮件组合模型的原因)。 confirm_event 方法内部的循环确保在notify 中会有一个记录的记录集,但是这个方法notify 也被其他不能在内部循环的方法调用。
    【解决方案2】:

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

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

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

    如果有人知道,请在此处发布答案!

    【讨论】:

      【解决方案3】:

      如果您将 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
      

      【讨论】:

      • 谢谢@Odedra!但是使用这段代码,当我点击confirm_event 时,mail.compose.message 向导表单中的活动模型仍然是event,而不是participant(我需要成为活动模型)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多