我创建了一个名为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.participant
和active_model
。我试图直接在上下文中修改这些变量,但是我给出了另一个错误。
我如何实现目标?有没有更简单的模式呢?任何帮助将不胜感激!
答案 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_model
和active_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