base_automation/views/base_automation_views.xml

322 lines
24 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Automation Form View -->
<record id="view_base_automation_form" model="ir.ui.view">
<field name="name">Automations</field>
<field name="model">base.automation</field>
<field name="arch" type="xml">
<form string="Automation Rule">
<sheet>
<div class="oe_button_box" name="button_box">
<button name="action_view_webhook_logs" type="object" string="Logs" class="oe_stat_button" icon="fa-list" invisible="trigger != 'on_webhook'">
</button>
</div>
<field name="active" invisible="1" />
<field name="model_name" invisible="1" force_save="True" />
<widget name="web_ribbon" title="Archived" bg_color="bg-danger" invisible="active"/>
<div class="oe_title">
<h1><field name="name" placeholder="e.g. Support flow"/></h1>
</div>
<group groups="!base.group_no_one" invisible="context.get('default_model_id')">
<group>
<field name="model_id" options="{'no_create': True}" />
</group>
</group>
<group groups="base.group_no_one">
<group>
<field name="model_id" options="{'no_create': True}" />
</group>
</group>
<group invisible="not model_id">
<group>
<label for="trigger"/>
<div>
<div class="d-flex flex-row">
<field name="trigger" widget="base_automation_trigger_selection" class="oe_inline me-3"/>
<field name="trg_selection_field_id" placeholder="Select a value..." class="oe_inline"
options="{'no_open': True, 'no_create': True}"
invisible="trigger not in ['on_state_set', 'on_priority_set']"
required="trigger in ['on_state_set', 'on_priority_set']"
/>
<field name="trg_field_ref" placeholder="Select a value..." class="oe_inline"
widget="base_automation_trigger_reference"
invisible="trigger not in ['on_stage_set', 'on_tag_set']"
required="trigger in ['on_stage_set', 'on_tag_set']"
/>
<field name="trg_field_ref_model_name" invisible="1" />
<field name="trg_field_ref_display_name" invisible="1" />
<field name="trg_date_id" class="oe_inline" string="Date Field"
options="{'no_open': True, 'no_create': True}"
invisible="trigger != 'on_time'"
required="trigger in ['on_time', 'on_time_created', 'on_time_updated']"
/>
</div>
<div class="text-muted" invisible="trigger != 'on_change'"><i class="fa fa-warning"/> Automation rules triggered by UI changes will be executed <em>every time</em> the watched fields change, <em>whether you save or not</em>.</div>
</div>
<label for="url" string="URL" invisible="trigger != 'on_webhook'"/>
<div invisible="trigger != 'on_webhook'">
<field name="url" widget="CopyClipboardURL" placeholder="URL will be created once the rule is saved."/>
<div class="alert alert-warning" role="status">
<strong><i class="fa fa-lock"/> Keep it secret, keep it safe.</strong>
<p>Your webhook URL contains a secret. Don't share it online or carelessly.</p>
<button class="btn btn-seconadry" type="object" name="action_rotate_webhook_uuid" string="Rotate Secret" icon="fa-refresh" help="Change the URL's secret if you think the URL is no longer secure. You will have to update any automated system that calls this webhook to the new URL."/>
</div>
</div>
<label for="trg_date_range" string="Delay" invisible="trigger not in ['on_time', 'on_time_created', 'on_time_updated']"/>
<div class="d-flex flex-row gap-2" invisible="trigger not in ['on_time', 'on_time_created', 'on_time_updated']">
<field name="trg_date_range" class="oe_inline" required="trigger in ['on_time', 'on_time_created', 'on_time_updated']" />
<field name="trg_date_range_type" class="oe_inline" required="trigger in ['on_time', 'on_time_created', 'on_time_updated']" />
<span invisible="trigger != 'on_time_created'">after creation</span>
<span invisible="trigger != 'on_time_updated'">after last update</span>
<span invisible="trigger != 'on_time'">after</span>
<field name="trg_date_id" class="oe_inline" string="Date Field" placeholder="Select a date field..."
options="{'no_open': True, 'no_create': True}"
context="{'hide_model': 1}"
invisible="trigger != 'on_time'"
required="trigger in ['on_time', 'on_time_created', 'on_time_updated']"/>
</div>
<field name="log_webhook_calls" widget="boolean_toggle" invisible="trigger != 'on_webhook'"/>
<field name="trg_date_calendar_id" class="oe_inline"
options="{'no_open': True, 'no_create': True}"
invisible="not trg_date_id or trg_date_range_type != 'day'"/>
<label for="least_delay_msg" invisible="trigger not in ['on_time', 'on_time_created', 'on_time_updated'] or not least_delay_msg" string="" />
<div class="alert alert-info" role="alert" invisible="trigger not in ['on_time', 'on_time_created', 'on_time_updated'] or not least_delay_msg">
<field name="least_delay_msg"/>
</div>
<field name="filter_pre_domain" widget="domain" groups="base.group_no_one"
options="{'model': 'model_name', 'in_dialog': True}"
invisible="trigger == 'on_webhook'"
/>
<label for="filter_domain" invisible="trigger not in ['on_create_or_write', 'on_change', 'on_unlink']"/>
<label for="filter_domain" string="Extra Conditions" invisible="trigger not in ['on_time', 'on_time_created', 'on_time_updated']"/>
<field name="filter_domain" nolabel="1" widget="domain"
options="{'model': 'model_name', 'in_dialog': False, 'foldable': True}"
invisible="trigger not in ['on_create_or_write', 'on_change', 'on_unlink', 'on_time', 'on_time_created', 'on_time_updated']"
/>
<field name="trigger_field_ids" string="When updating" placeholder="Select fields..."
options="{'no_open': True, 'no_create': True}"
domain="[('model_id', '=', model_id)]"
context="{'hide_model': 1}"
invisible="trigger != 'on_create_or_write'" widget="many2many_tags" />
<field name="on_change_field_ids" string="When updating" placeholder="Select fields..."
options="{'no_open': True, 'no_create': True}"
domain="[('model_id', '=', model_id)]"
context="{'hide_model': 1}"
invisible="trigger != 'on_change'" widget="many2many_tags" />
</group>
<group>
<label for="record_getter" string="Target Record" invisible="trigger != 'on_webhook'" />
<div invisible="trigger != 'on_webhook'">
<field name="record_getter" string="Target Record"/>
<div>
<div class="text-muted"><i class="fa fa-info-circle"/> The default target record getter will work out-of-the-box for any webhook coming from another Odoo instance.</div>
<span class="text-muted"> Available variables: </span>
<ul class="text-muted">
<li><code>env</code>: environment on which the action is triggered</li>
<li><code>model</code>: model of the record on which the action is triggered; is a void recordset</li>
<li><code>time</code>, <code>datetime</code>, <code>dateutil</code>, <code>timezone</code>: useful Python libraries</li>
<li><code>payload</code>: the payload of the call (GET parameters, JSON body), as a dict.</li>
</ul>
</div>
</div>
</group>
</group>
<notebook invisible="not model_id">
<page string="Actions To Do" name="actions">
<field
name="action_server_ids"
widget="one2many"
class="o_base_automation_actions_field"
context="{'default_model_id': model_id, 'form_view_ref': 'base_automation.ir_actions_server_view_form_automation'}"
>
<kanban>
<control>
<create string="Add an action" />
</control>
<templates>
<t t-name="kanban-box">
<div class="oe_kanban_global_click row g-0 align-items-center">
<div class="d-flex align-items-center gap-1">
<field name="sequence" widget="handle" class="px-1" />
<field name="state" invisible="1" />
<field name="evaluation_type" invisible="1" />
<field name="value" invisible="1" />
<field name="selection_value" invisible="1" />
<field name="value_field_to_show" invisible="1"/>
<field name="update_field_type" invisible="1"/>
<field name="update_m2m_operation" invisible="1"/>
<!-- Icon section -->
<i
data-name="server_action_icon"
t-att-title="record.state.value"
class="fa fa-fw"
t-att-class="{
'code': 'fa-file-code-o',
'object_create': 'fa-edit',
'object_write': 'fa-refresh',
'multi': 'fa-list-ul',
'mail_post': 'fa-envelope',
'followers': 'fa-user-o',
'remove_followers': 'fa-user-times',
'next_activity': 'fa-clock-o',
'sms': 'fa-comments-o',
'webhook': 'fa-paper-plane',
}[record.state.raw_value]"
/>
<field name="name" class="text-truncate" />
<t invisible="state != 'object_write'">
<t invisible="not (update_field_type == 'many2many' and update_m2m_operation == 'clear') or evaluation_type != 'value'">
<span>by clearing it</span>
</t>
<t invisible="not (update_field_type == 'many2many' and update_m2m_operation == 'add') or evaluation_type != 'value'">
<span>by adding</span><field name="resource_ref"/>
</t>
<t invisible="not (update_field_type == 'many2many' and update_m2m_operation == 'remove') or evaluation_type != 'value'">
<span>by removing</span><field name="resource_ref"/>
</t>
<t invisible="not (update_field_type == 'many2many' and update_m2m_operation == 'set') or evaluation_type != 'value'">
<span>by setting it to</span><field name="resource_ref"/>
</t>
<t invisible="update_field_type == 'many2many' and evaluation_type == 'value'">
<span invisible="evaluation_type != 'value'">to</span>
<span invisible="evaluation_type != 'equation'">as</span>
<field name="resource_ref" invisible="not (value_field_to_show == 'resource_ref' and evaluation_type == 'value')" />
<field name="selection_value" invisible="not (value_field_to_show == 'selection_value' and evaluation_type == 'value')" class="d-inline"/>
<field name="update_boolean_value" invisible="not (value_field_to_show == 'update_boolean_value' and evaluation_type == 'value')" class="d-inline"/>
<em invisible="not (value_field_to_show == 'value' and evaluation_type == 'value')" t-out="record.value.raw_value" class="d-inline"/>
<code invisible="not (evaluation_type == 'equation')" t-out="record.value.raw_value"/>
</t>
</t>
<button type="delete" name="delete" class="btn fa fa-trash fa-xl px-3 ms-auto" title="Delete Action" />
</div>
</div>
</t>
</templates>
</kanban>
</field>
</page>
<page string="Notes" name="notes">
<field name="description" placeholder="Keep track of what this automation does and why it exists..."/>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<!-- automation Tree View -->
<record id="view_base_automation_tree" model="ir.ui.view">
<field name="name">base.automation.tree</field>
<field name="model">base.automation</field>
<field name="arch" type="xml">
<tree string="Automation Rules">
<field name="name"/>
<field name="trigger"/>
<field name="model_id"/>
</tree>
</field>
</record>
<!-- automation Kanban View -->
<record id="view_base_automation_kanban" model="ir.ui.view">
<field name="name">base.automation.kanban</field>
<field name="model">base.automation</field>
<field name="arch" type="xml">
<kanban
string="Automation Rules"
class="o_base_automation_kanban_view"
records_draggable="false"
groups_draggable="false"
quick_create="false"
group_create="false"
group_edit="false"
group_delete="false"
>
<templates>
<t t-name="kanban-box">
<div class="oe_kanban_global_click">
<field name="active" invisible="1" />
<field name="model_name" invisible="1" />
<widget name="web_ribbon" title="Archived" bg_color="text-bg-danger" invisible="active" />
<div class="d-flex flex-column flex-md-row gap-3 flex-grow-1">
<div class="d-flex align-items-center o_automation_base_info">
<div class="d-flex flex-column">
<field name="name" class="fs-2 fw-bold"/>
<field name="model_id" invisible="context.get('default_model_id')"/>
<div class="d-flex align-items-center gap-1" invisible="trigger in ['on_time', 'on_time_created', 'on_time_updated']">
<field name="trigger" />
<field name="on_change_field_ids" invisible="trigger != 'on_change'" class="my-1" />
<field name="trg_selection_field_id" invisible="trigger not in ['on_state_set', 'on_priority_set']" class="o_tag o_tag_color_0 rounded-pill p-1 px-2" />
<field name="trg_field_ref_display_name" invisible="trigger not in ['on_stage_set', 'on_tag_set']" class="o_tag o_tag_color_0 rounded-pill p-1 px-2" />
<field name="trigger_field_ids" invisible="trigger not in ['on_create_or_write']" class="my-1" />
</div>
<div class="d-flex align-items-center gap-1" invisible="trigger != 'on_time'">
<field name="trg_date_range"/>
<field name="trg_date_range_type" class="text-lowercase" />
<span class="flex-shrink-0">
based on <field name="trg_date_id" invisible="trigger != 'on_time'" class="o_tag o_tag_color_0 rounded-pill p-1 px-2" />
</span>
</div>
<div class="d-flex align-items-center gap-1" invisible="trigger not in ['on_time_created', 'on_time_updated']">
<field name="trg_date_range"/>
<field name="trg_date_range_type" class="text-lowercase" />
<field name="trigger" class="text-lowercase" />
<field name="trg_date_id" invisible="trigger != 'on_time'" class="o_tag o_tag_color_0 rounded-pill p-1 px-2" />
</div>
<field name="trg_date_calendar_id" invisible="not trg_date_id or trg_date_range_type != 'day'" />
</div>
</div>
<div class="d-none flex-grow-1 align-items-center gap-3 o_automation_actions" data-name="more-info">
<i class="fa fa-2x fa-arrow-right text-primary" title="Actions" />
<field name="action_server_ids" widget="base_automation_actions_one2many" class="align-self-center w-100 me-md-3" />
</div>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<record id="view_base_automation_search" model="ir.ui.view">
<field name="name">base.automation.search</field>
<field name="model">base.automation</field>
<field name="arch" type="xml">
<search>
<field name="name"/>
<field name="model_id"/>
<separator/>
<filter string="Archived" name="inactive" domain="[('active', '=', False)]"/>
</search>
</field>
</record>
<!-- automation Action -->
<record id="base_automation_act" model="ir.actions.act_window">
<field name="name">Automation Rules</field>
<field name="res_model">base.automation</field>
<field name="view_mode">kanban,tree,form</field>
<field name="view_id" ref="view_base_automation_kanban"/>
<field name="context">{'active_test': False}</field>
<field name="help" type="html">
<img class="w-100 w-md-75"
src="/base_automation/static/img/automation.svg" />
<p>
Automate <em>everything</em> with Automation Rules
</p><p>
Send an email when an object changes state, archive records
after a month of inactivity or remind yourself to follow-up on
tasks when a specific tag is added.
</p><p>With Automation Rules, you can automate
<em>any</em> workflow.
</p>
</field>
</record>
<menuitem id="menu_base_automation_form"
parent="base.menu_automation" action="base_automation_act" sequence="1"/>
</odoo>