1

我试图了解服务器操作,其中当状态从 更改为draftconfirm,会向提供的电子邮件发送一条消息。

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

代码如下:

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>

笔记本.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" />
4

2 回答 2

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,因为它会认为上次已经执行过(它没有保留过去执行的状态,期望最后执行日期)

在您的示例中,您似乎希望在确认便笺并且通过便笺日期后立即触发邮件,但是如果调度程序已经在该日期之后执行,您将无法获得预期的效果。

您可以通过将条件检查移动到服务器操作中来欺骗系统执行您想要的操作,在自动操作中仅保留时间条件,并让服务器操作在将来移动记录的“日期”字段如果条件尚未满足。这应该确保下次调度程序运行时仍然考虑记录。但是,这有点令人费解,您可能需要重新考虑您的用例来做一些更简单的事情。

于 2013-08-20T14:07:03.083 回答
0

对于测试,您可以将表“base_action_rule”中的字段“last_run”更改为当天或更早的开始,然后它将运行良好。

于 2017-05-09T17:43:41.707 回答