Пользовательское действие сервера для отправки триггерного сообщения

Я пытаюсь понять действие сервера, в котором при изменении состояния с 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" />

2 ответа

Решение

Ключ к таким триггерам не столько в ir.actions.server (Действие сервера), кроме base.action.rule (Автоматизированное действие), который определяет триггер для конкретной модели (здесь notebook.server_action) за любое изменение записи, соответствующее условию (ам).

На самом деле существует 2 вида автоматических действий: те, которые основаны на предварительных / постусловиях, и те, которые основаны на временных условиях.

  1. Те, у которых нет условия синхронизации (trg_date_id поле не установлено) выполняются сразу после того, как происходит соответствующее событие создания или обновления, при условии, что выполнены предварительные / последующие условия. Автоматизированные действия с предварительным условием не учитываются при создании новой записи, так как нет "pre" состояние, чтобы проверить.

  2. Те основаны на условии времени (trg_date_id поле установлено) регулярно обрабатываются фоновым заданием и не должны иметь предварительных условий (filter_pre_id), поскольку "pre" состояние не известно в то время. Они будут выполнены для каждой записи, которая соответствует их постусловию (filter_id), при условии, что указанная задержка истекла с момента последнего выполнения автоматического действия.

Теперь, когда выполняется автоматическое действие, запускаются соответствующие действия сервера, и в вашем случае новое письмо должно быть отправлено немедленно. Это зависит от правильной конфигурации сервера исходящей почты в вашей базе данных. Если электронное письмо не может быть отправлено (например, если оно искажено или имеет недопустимые адреса), система выдаст ошибку, но вы можете ее не увидеть, поскольку это произойдет в фоновом режиме, когда планировщик обрабатывает автоматические действия на основе времени.

Вы дважды проверили настройки электронной почты (Настройки / Электронная почта / Серверы исходящей почты)?

Возможно, вы отключили запланированное задание для автоматических действий, которое называется "Проверка правил действий"?

Что говорят журналы OpenERP? Любая ошибка появляется?

Обновление: Остерегайтесь хитрых случаев, когда "временные условия" сочетаются с предварительными условиями: если предварительное условие не выполняется для записи R в момент времени T, когда работает планировщик, но задержка, указанная условием синхронизации для R, имеет переданный, тогда R не будет проверяться, когда планировщик работает в T+1, потому что он будет считать, что он уже был выполнен в последний раз (он не сохраняет состояния прошлых выполнений, ожидают дату последнего выполнения)

В вашем примере кажется, что вы хотите вызвать почту, как только заметка будет подтверждена и дата заметки пройдена, но вы не получите желаемого эффекта, если планировщик уже выполнен после даты.

Возможно, вы сможете заставить систему делать то, что вы хотите, перенеся проверку состояния в действие сервера, оставив только условие синхронизации в Автоматизированных действиях и заставив действие сервера переместить поле "дата" записи в будущем. если условие еще не выполнено Это должно гарантировать, что запись все еще будет учитываться при следующем запуске планировщика. Однако это немного запутанно, и вы можете пересмотреть свой вариант использования, чтобы сделать что-то попроще.

Для тестов вы можете изменить поле 'last_run' в таблице 'base_action_rule' на начало текущего дня или ранее. Тогда оно будет работать нормально.

Другие вопросы по тегам