2013-08-20 147 views
1

我想了解服务器动作,其中状态从draft更改为confirm时,将向所提供的电子邮件发送一条消息。自定义服务器动作发送触发器消息

在程序中没有这样的错误,但邮件不会发送到自定义电子邮件。

的代码如下:

notebook_server_action.xml

<!-- demo automated actions sending message after state transition --> 
<record id="filter_draft_lead" model="ir.filters"> 
    <field name="name">Draft Leads notebook</field> 
    <field name="model_id">notebook.server_action</field> 
    <field name="domain">[('state','=','confirm')]</field> 
    <field name="user_id" eval="False" /> 
</record> 
<record id="action_email_reminder_lead" model="ir.actions.server"> 
    <field name="name">Message @ confirm state</field> 
    <field name="model_id" ref="model_notebook_server_action" /> 
    <field name="condition">True</field> 
    <field name="type">ir.actions.server</field> 
    <field name="state">email</field> 
    <field name="email">object.email</field> 
    <field name="subject">Check 1 2 3</field> 
    <field name="message">11111111111111</field> 
</record> 
<record id="rule_set_reminder_lead" model="base.action.rule"> 
    <field name="name">Send mail when status changed to confirm</field> 
    <field name="model_id" ref="model_notebook_server_action" /> 
    <field name="sequence">1</field> 
    <field name="filter_id" ref="filter_draft_lead" /> 
    <field name="trg_date_id" ref="field_notebook_server_action_note_date" /> 
    <field name="trg_date_range">0</field> 
    <field name="trg_date_range_type">minutes</field> 
    <field name="server_action_ids" eval="[(6,0,[ref('action_email_reminder_lead')])]" /> 
</record> 

notebook.py

class notebook(osv.osv): 
    _name = "notebook.server_action" 
    _description = "Simple Notebook" 
    _columns = { 
     'name' : fields.char('Title', size=30, required=True), 
     'note' : fields.text('Note'), 
      'email': fields.char('Email', size=120, required=True), 
     'note_date' : fields.datetime('Date'), 
     'state': fields.selection([('draft', 'Draft'), ('confirm', 'Confirmed')], 
      'Status', required=True, readonly=True), 
      } 
    _defaults = { 
     'state': 'draft', 
     'note_date' : lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'), 
    } 
    def button_confirm(self, cr, uid, ids, context=None): 
     return self.write(cr, uid, ids, {'state': 'confirm'}) 

notebook_view.xml

<record model="ir.ui.view" id="notebook_server_actiontree_view"> 
    <field name="name">notebook.server_action.tree</field> 
    <field name="model">notebook.server_action</field> 
    <field name="arch" type="xml"> 
     <tree string="Notebook"> 
      <field name="name" /> 
      <field name="note" /> 
      <field name="note_date" /> 
     </tree> 
    </field> 
</record> 
<record model="ir.ui.view" id="notebook_server_actionform_view"> 
    <field name="name">notebook.server_action.form</field> 
    <field name="model">notebook.server_action</field> 
    <field name="arch" type="xml"> 
     <form string="Notebook" version="7.0"> 
      <header> 
       <button name="button_confirm" states="draft" string="Confirm" 
        type="object" /> 
       <field name="state" widget="statusbar" /> 
      </header> 
      <sheet> 
       <group> 
        <field name="name" /> 
        <field name="note" /> 
        <field name="note_date" /> 
       </group> 
      </sheet> 
     </form> 
    </field> 
</record> 
<record model="ir.actions.act_window" id="action_notebook_server_actionform"> 
    <field name="name">notebook.server_action</field> 
    <field name="res_model">notebook.server_action</field> 
</record> 
<menuitem name="NotebookParent" icon="terp-project" id="NotebookParent_menu" /> 
<menuitem name="NotesChild" parent="NotebookParent_menu" id="NotesChild_menu" /> 
<menuitem name="Header" parent="NotesChild_menu" id="Header_menu_mainform" 
    action="action_notebook_server_actionform" /> 

回答

3

这些触发器的关键是没有那么多的ir.actions.server(服务器操作)条目,但base.action.rule(自动操作),指定在上一个记录的任何变化的特定型号(这里notebook.server_action)的触发器相匹配的条件)。

实际上有两种自动操作,基于前置/后置条件以及基于时序条件的。

  1. 那些没有定时条件(trg_date_id字段未设置)执行相应的创建或更新事件发生之后,所提供的前/后的条件被满足。由于没有"pre"状态可供检查,因此在创建新记录时不考虑带有前置条件的自动操作。

  2. 那些基于定时条件(trg_date_id字段设置)由后台作业定期处理,并且不能有一个先决条件(filter_pre_id),因为"pre"状态不当时已知的。如果自上次执行自动操作后指定的延迟时间已过,它们将针对与其后条件(filter_id)相匹配的每条记录执行。

现在,当执行自动操作时,将运行相应的服务器操作,并且在您的情况下应立即发送新电子邮件。这取决于您的数据库中传出邮件服务器的正确配置。 如果无法发送电子邮件(例如,如果格式不正确或地址无效),系统会提示错误,但您可能不会看到该错误,因为调度程序在处理基于时间的自动操作时会在后台发生。

你有没有仔细检查电子邮件配置(设置/电子邮件/发送邮件服务器)?

您是否可能已禁用自动操作的预定作业,称为“检查操作规则”

OpenERP日志说什么?出现任何错误?

更新:当心棘手情况下,当“定时条件”加上前置条件:如果预条件没有在时间T满足一个记录R中的调度程序运行时,但通过指定的延迟R的定时条件已经过去,那么当调度程序在T + 1运行时,R将不会被检查,因为它会认为上一次已经执行了(它不会保留过去执行的状态,期望最后的执行日期)

在您的示例中,似乎您希望在确认注释并通过注释日期后立即触发邮件,但如果日程表已在日期之后执行,您将无法获得预期的效果。

您可以通过将条件检查移至服务器操作中,只保留自动操作中的时间条件,并让服务器操作移动“日期”字段如果条件尚未满足,将来记录。这应该确保该记录在下次调度程序运行时仍被考虑。然而,这有点复杂,你可能想重新考虑你的用例来做一些简单的事情。

+0

'1.'一切OK了发邮件配置 '2.'状态中使用' 'note_date' 启用自动@行动 '3.'无错误/信息@追踪 – atchuthan

+0

time.strftime( '%Y-%m-%d%H:%M:%S'),' 我给出了当前的时间,即触发日期,当状态变为'confirm'时,服务器动作应该发生。并且在'LOG FILE'上没有任何效果或行动** ** – atchuthan

+0

感谢您的反馈,我认为这可能是一个棘手的情况,将时序条件与前提条件相结合。我已经更新了答案来解释我的意思。 – odony

0

对于测试,您可以将表'base_action_rule'中的字段'last_run'更改为当前日期或更早的日期 然后它将正常运行。拉姆达* A: