AgentSkillsCN

Automated Actions

在 Odoo 中创建自动化操作(base.automation)与服务器端操作。

SKILL.md
--- frontmatter
name: Automated Actions
description: Create automated actions (base.automation) and server actions in Odoo.
globs: ["data/**/*.xml", "__manifest__.py"]

Creating Automated Actions

Steps

1. Server Action (data/server_actions.xml)

xml
<odoo>
    <data noupdate="1">
        <!-- Server action that runs Python code -->
        <record id="action_auto_confirm_order" model="ir.actions.server">
            <field name="name">Auto Confirm Order</field>
            <field name="model_id" ref="model_my_model"/>
            <field name="state">code</field>
            <field name="code">
for record in records:
    if record.state == 'draft' and record.total > 0:
        record.action_confirm()
            </field>
        </record>

        <!-- Server action that sends email -->
        <record id="action_send_notification" model="ir.actions.server">
            <field name="name">Send Notification Email</field>
            <field name="model_id" ref="model_my_model"/>
            <field name="state">email</field>
            <field name="template_id" ref="email_template_my_model"/>
        </record>

        <!-- Server action that creates a record -->
        <record id="action_create_task" model="ir.actions.server">
            <field name="name">Create Follow-up Task</field>
            <field name="model_id" ref="model_my_model"/>
            <field name="state">object_create</field>
            <field name="crud_model_id" ref="project.model_project_task"/>
            <field name="value">My follow-up for {{object.name}}</field>
        </record>
    </data>
</odoo>

2. Automated Action / Base Automation (data/automated_actions.xml)

xml
<odoo>
    <data noupdate="1">
        <!-- Trigger on record creation -->
        <record id="auto_action_on_create" model="base.automation">
            <field name="name">Auto-assign on Create</field>
            <field name="model_id" ref="model_my_model"/>
            <field name="trigger">on_create</field>
            <field name="action_server_ids" eval="[(4, ref('action_auto_confirm_order'))]"/>
        </record>

        <!-- Trigger on field change -->
        <record id="auto_action_on_state_change" model="base.automation">
            <field name="name">Notify on Confirmation</field>
            <field name="model_id" ref="model_my_model"/>
            <field name="trigger">on_write</field>
            <field name="trigger_field_ids" eval="[(4, ref('field_my_model__state'))]"/>
            <field name="filter_domain">[('state', '=', 'confirmed')]</field>
            <field name="action_server_ids" eval="[(4, ref('action_send_notification'))]"/>
        </record>

        <!-- Trigger on time condition -->
        <record id="auto_action_timed" model="base.automation">
            <field name="name">Auto-close after 30 days</field>
            <field name="model_id" ref="model_my_model"/>
            <field name="trigger">on_time</field>
            <field name="trg_date_id" ref="field_my_model__create_date"/>
            <field name="trg_date_range">30</field>
            <field name="trg_date_range_type">day</field>
            <field name="filter_domain">[('state', '=', 'confirmed')]</field>
            <field name="action_server_ids" eval="[(4, ref('action_auto_confirm_order'))]"/>
        </record>
    </data>
</odoo>

3. Add Dependency

Ensure base_automation is in your module's depends:

python
'depends': ['base_automation', ...],

4. Update Manifest

python
'data': [
    'data/server_actions.xml',
    'data/automated_actions.xml',
],

Trigger Types Reference

TriggerDescription
on_createWhen a record is created
on_writeWhen specified fields are updated
on_create_or_writeOn both creation and update
on_unlinkWhen a record is deleted
on_timeTime-based condition

Checklist

  • base_automation in module dependencies
  • noupdate="1" for customizable automation records
  • Server action code references records (the triggered recordset)
  • Time-based triggers have trg_date_id and range configured
  • Filter domains validated
  • Data files listed in manifest