TIP: You can type at any time to perform a new search.
Automation Oca
automation_oca · OCA/automation
- Repository
- OCA/automation · module folder · Try on Runboat
- Module version
- 1.0.4
- Category
- Automation
- Folder size
- 0.73 MB
- License
- AGPL-3
- Application
- No
- Auto-installable
- No
- Website
- https://github.com/OCA/automation
- Last tracking update
- 2026-08-07 08:42:57
- Authors
- Odoo Community Association (OCA), Dixmit
- Maintainers
- Odoo Community Association (OCA), Dixmit
- Committers
- Enric Tobella, Víctor Martínez, pilarvargas-tecnativa, Weblate, Mathieu Benoit, OCA-git-bot, oca-ci
- Odoo dependencies
- Python dependencies
- None
- System dependencies
- None
- Required by
- None
- Description
This module allows to automate several process according to some rules. This is useful for creating automated actions on your database like: - Send a welcome email to all new partners (or filtered according to some rules) - Remember to online customers that they forgot their basket with some items - Send documents to sign to all new employees
Code Analysis ⓘ
Views touched (25)
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
automation_configuration_export_form_view |
automation.configuration.export | form | New | |
automation_configuration_form_view |
automation.configuration | form | New | |
automation_configuration_kanban_view |
automation.configuration | kanban | New | |
automation_configuration_search_view |
automation.configuration | search | New | |
automation_configuration_step_form_view |
automation.configuration.step | form | New | |
automation_configuration_step_search_view |
automation.configuration.step | search | New | |
automation_configuration_step_tree_view |
automation.configuration.step | list | New | |
automation_configuration_test_form_view |
automation.configuration.test | form | New | |
automation_configuration_tree_view |
automation.configuration | list | New | |
automation_filter_form_view |
automation.filter | form | New | |
automation_filter_search_view |
automation.filter | search | New | |
automation_filter_tree_view |
automation.filter | list | New | |
automation_record_form_view |
automation.record | form | New | |
automation_record_graph_view |
automation.record.graph | automation.record | graph | New |
automation_record_pivot_view |
automation.record.pivot | automation.record | pivot | New |
automation_record_search_view |
automation.record | search | New | |
automation_record_step_form_view |
automation.record.step | form | New | |
automation_record_step_graph_view |
automation.record.step.graph | automation.record.step | graph | New |
automation_record_step_pivot_view |
automation.record.step.pivot | automation.record.step | pivot | New |
automation_record_step_search_view |
automation.record.step.search | automation.record.step | search | New |
automation_record_step_tree_view |
automation.record.step | list | New | |
automation_record_tree_view |
automation.record | list | New | |
automation_tag_search_view |
automation.tag | search | New | |
automation_tag_tree_view |
automation.tag | list | New | |
link_tracker_click_search_view |
link.tracker.click.view.search.inherit.mass_mailing | link.tracker.click | search | Inherits link_tracker.link_tracker_click_view_search |
HTTP endpoints (2)
| Route(s) | Handler | Auth | Type | Methods | Flags |
|---|---|---|---|---|---|
/automation_oca/track/<int:record_id>/<string:token>/blank.gif |
AutomationOCAController.automation_oca_mail_open |
public | http | ALL | sudo |
/r/<string:code>/au/<int:record_id>/<string:token> |
AutomationOCAController.automation_oca_redirect |
public | http | ALL | sudo |
Models touched (13)
New fields (23)
-
activeBooleandefault=True -
activity_action_countIntegercompute='_compute_activity_count' -
activity_mail_countIntegercompute='_compute_activity_count' -
automation_direct_step_idsOne2many → automation.configuration.stepdomain=[('parent_id', '=', False)]inverse_name='configuration_id' args: 'automation.configuration.step' -
automation_step_idsOne2many → automation.configuration.stepinverse_name='configuration_id' args: 'automation.configuration.step' -
click_countIntegercompute='_compute_click_count' -
company_idMany2one → res.companyargs: 'res.company' -
domainCharcompute='_compute_domain'default='[]'help='\n Filter to apply\n Following special variable can be used in filter :\n * datetime\n * dateutil\n * time\n * user\n * ref 'required=True -
editable_domainChardefault='[]'help='Filter to apply\n Following special variable can be used in filter :\n * datetime\n * dateutil\n * time\n * user\n * ref 'required=True -
field_idMany2one → ir.model.fieldsdomain="[('model_id', '=', model_id), ('ttype', 'in', ['char', 'selection', 'integer', 'text', 'many2one'])]"help='Used to avoid duplicates' args: 'ir.model.fields' -
filter_domainBinarycompute='_compute_filter_domain' -
filter_idMany2one → automation.filterargs: 'automation.filter' -
is_periodicBooleanhelp='Mark it if you want to make the execution periodic' -
modelCharrelated='model_id.model'string='Model' -
model_idMany2one → ir.modeldomain=[('is_mail_thread', '=', True)]help='Model where the configuration is applied'ondelete='cascade'required=Truestring='Model ID' args: 'ir.model' -
nameCharrequired=True -
next_execution_dateDatetimecompute='_compute_next_execution_date' -
record_countIntegercompute='_compute_record_count' -
record_done_countIntegercompute='_compute_record_count' -
record_run_countIntegercompute='_compute_record_count' -
record_test_countIntegercompute='_compute_record_test_count' -
stateSelectiondefault='draft'group_expand='_group_expand_states'required=True args: [('draft', 'Draft'), ('periodic', 'Periodic'), ('ondemand', 'On demand'), ('done', 'Done')] -
tag_idsMany2many → automation.tagargs: 'automation.tag'
-
back_to_draft(self) -
create_document_from_attachment(self, b64_data) -
cron_automation(self) -
done_automation(self) -
export_configuration(self)Export the configuration to a JSON format. This method is used to export the configuration for external use. -
run_automation(self) -
save_filter(self) -
start_automation(self)
New fields (3)
-
configuration_idMany2one → automation.configurationcomodel_name='automation.configuration'required=True -
file_contentBinaryreadonly=True -
file_nameChar
No public methods.
New fields (43)
-
activity_date_deadline_rangeIntegercompute='_compute_activity_info'readonly=Falsestore=Truestring='Due Date In' -
activity_date_deadline_range_typeSelectioncompute='_compute_activity_info'default='days'readonly=Falsestore=Truestring='Due type' args: [('days', 'Day(s)'), ('weeks', 'Week(s)'), ('months', 'Month(s)')] -
activity_noteHtmlcompute='_compute_activity_info'readonly=Falsestore=True args: 'Note' -
activity_summaryCharcompute='_compute_activity_info'readonly=Falsestore=True args: 'Summary' -
activity_type_idMany2one → mail.activity.typecompute='_compute_activity_info'domain="['|', ('res_model', '=', False), ('res_model', '=', model)]"ondelete='restrict'readonly=Falsestore=Truestring='Activity' args: 'mail.activity.type' -
activity_user_field_idMany2one → ir.model.fieldscompute='_compute_activity_info'readonly=Falsestore=True args: 'ir.model.fields', 'User field name' -
activity_user_idMany2one → res.userscompute='_compute_activity_info'readonly=Falsestore=Truestring='Responsible' args: 'res.users' -
activity_user_typeSelectioncompute='_compute_activity_info'help="Use 'Specific User' to always assign the same user on the next activity.\n Use 'Generic User From Record' to specify the field name of the user\n to choose on the record."readonly=Falsestore=True args: [('specific', 'Specific User'), ('generic', 'Generic User From Record')] -
activity_verification_domainChardefault='[]'help='Filter to verify when the activity is done'required=True -
activity_verification_domain_errorTexthelp='Message to show when the activity domain is not as expected'translate=True -
allow_expiryBooleancompute='_compute_allow_expiry' -
applied_domainCharcompute='_compute_applied_domain'recursive=True -
apply_parent_domainBooleandefault=True -
child_idsOne2many → automation.configuration.stepinverse_name='parent_id' args: 'automation.configuration.step' -
configuration_idMany2one → automation.configurationauto_join=Truerequired=True args: 'automation.configuration' -
domainChardefault='[]'help='Filter to apply specifically'required=True -
expiryBooleancompute='_compute_expiry'readonly=Falsestore=True -
expiry_intervalInteger -
expiry_interval_typeSelectiondefault='hours'required=True args: [('hours', 'Hour(s)'), ('days', 'Day(s)')] -
graph_dataJsoncompute='_compute_graph_data' -
graph_doneIntegercompute='_compute_total_graph_data' -
graph_errorIntegercompute='_compute_total_graph_data' -
mail_author_idMany2one → res.partnerdefault=<expr>required=True args: 'res.partner' -
mail_template_idMany2one → mail.templatedomain="[('model_id', '=', model_id)]" args: 'mail.template' -
modelCharrelated='model_id.model'string='Model' -
model_idMany2onerelated='configuration_id.model_id'string='Model ID' -
nameCharrequired=True -
parent_idMany2one → automation.configuration.stepondelete='cascade' args: 'automation.configuration.step' -
parent_positionIntegercompute='_compute_parent_position'recursive=Truestore=True -
server_action_idMany2one → ir.actions.serverdomain="[('model_id', '=', model_id)]" args: 'ir.actions.server' -
server_contextTextdefault='{}' -
step_iconCharcompute='_compute_step_info' -
step_nameCharcompute='_compute_step_info' -
step_typeSelectiondefault='mail'required=True args: [('mail', 'Mail'), ('action', 'Server Action'), ('activity', 'Activity')] -
trigger_child_typesJsoncompute='_compute_trigger_child_types' -
trigger_date_fieldCharrelated='trigger_date_field_id.field_description' -
trigger_date_field_idMany2one → ir.model.fieldsdomain="[('model_id', '=', model_id), ('ttype', 'in', ['date', 'datetime'])]" args: 'ir.model.fields' -
trigger_date_kindSelectiondefault='offset'required=True args: [('offset', 'Offset'), ('date', 'Force on Record Date')] -
trigger_intervalIntegerhelp='Set a negative time trigger if you want the step to be executed\n immediately, in parallel with the previous step, without waiting for it to\n finish.' -
trigger_interval_hoursIntegercompute='_compute_trigger_interval_hours'store=True -
trigger_interval_typeSelectiondefault='hours'required=True args: [('hours', 'Hour(s)'), ('days', 'Day(s)')] -
trigger_typeSelectiondefault='start'required=Trueselection='_trigger_type_selection' -
trigger_type_dataJsoncompute='_compute_trigger_type_data'
No public methods.
New fields (3)
-
configuration_idMany2one → automation.configurationrequired=True args: 'automation.configuration' -
modelCharrelated='configuration_id.model' -
resource_refReferencecompute='_compute_resource_ref'readonly=Falserequired=Trueselection='_selection_target_model'store=True
-
test_record(self)
New fields (4)
-
domainChardefault='[]'help='Filter to apply'required=True -
modelCharrelated='model_id.model'string='Model' -
model_idMany2one → ir.modeldomain=[('is_mail_thread', '=', True)]help='Model where the configuration is applied'ondelete='cascade'required=Truestring='Model ID' args: 'ir.model' -
nameCharrequired=True
No public methods.
New fields (9)
-
automation_step_idsOne2many → automation.record.stepinverse_name='record_id'readonly=True args: 'automation.record.step' -
configuration_idMany2one → automation.configurationreadonly=Truerequired=True args: 'automation.configuration' -
is_orphan_recordBooleandefault=Falsehelp='Indicates if this record is a placeholder for a missing resource.'readonly=True -
is_testBoolean -
modelCharindex=Truereadonly=Truerequired=False -
nameCharcompute='_compute_name' -
res_idMany2oneReferencecopy=Falseindex=Truemodel_field='model'readonly=Truerequired=Falsestring='Record' -
resource_refReferencecompute='_compute_resource_ref'readonly=Trueselection='_selection_target_model' -
stateSelectioncompute='_compute_state'store=True args: [('run', 'Running'), ('done', 'Done')]
-
check_access(self, operation)In order to check if we can access a record, we are checking if we can access the related document -
read(self, fields=None, load='_classic_read')Override to explicitely call check_access_rule, that is not called by the ORM. It instead directly fetches ir.rules and apply them. -
write(self, vals)
New fields (27)
-
activity_cancel_onDatetimereadonly=True -
activity_done_onDatetimereadonly=True -
child_idsOne2many → automation.record.stepinverse_name='parent_id' args: 'automation.record.step' -
configuration_idMany2one → automation.configurationcompute='_compute_step_data'store=True args: 'automation.configuration' -
configuration_step_idMany2one → automation.configuration.stepargs: 'automation.configuration.step' -
do_not_waitBoolean -
error_traceTextreadonly=True -
expiry_dateDatetimereadonly=True -
is_testBooleanrelated='record_id.is_test'store=True -
mail_clicked_onDatetimereadonly=True -
mail_opened_onDatetimereadonly=True -
mail_replied_onDatetimereadonly=True -
mail_statusSelectionreadonly=True args: [('sent', 'Sent'), ('open', 'Opened'), ('bounce', 'Bounced'), ('reply', 'Replied')] -
message_idCharreadonly=True -
nameCharcompute='_compute_step_data'store=True -
parent_idMany2one → automation.record.stepreadonly=True args: 'automation.record.step' -
parent_positionIntegercompute='_compute_parent_position'recursive=Truestore=True -
processed_onDatetimereadonly=True -
record_idMany2one → automation.recordondelete='cascade'required=True args: 'automation.record' -
scheduled_dateDatetimereadonly=True -
stateSelectiondefault='scheduled'readonly=True args: [('scheduled', 'Scheduled'), ('done', 'Done'), ('expired', 'Expired'), ('rejected', 'Rejected'), ('error', 'Error'), ('cancel', 'Cancelled')] -
step_actionsJsoncompute='_compute_step_actions' -
step_iconCharcompute='_compute_step_info' -
step_nameCharcompute='_compute_step_info' -
step_typeSelectioncompute='_compute_step_data'selection=<expr>store=True -
trigger_typeSelectioncompute='_compute_step_data'selection=<expr>store=True -
trigger_type_dataJsoncompute='_compute_trigger_type_data'
-
cancel(self) -
retry(self)Retry the record step -
run(self, trigger_activity=True)
New fields (3)
-
activeBooleandefault=True -
colorIntegerdefault=<expr> -
nameCharrequired=True
No public methods.
New fields (3)
-
automation_configuration_idMany2onerelated='automation_record_step_id.configuration_id'store=True -
automation_configuration_step_idMany2onerelated='automation_record_step_id.configuration_step_id'store=True -
automation_record_step_idMany2one → automation.record.stepargs: 'automation.record.step'
-
add_click(self, code, automation_record_step_id=False, **route_values)@api.model
New fields (1)
-
automation_record_step_idMany2one → automation.record.stepargs: 'automation.record.step'
-
unlink(self)
New fields (1)
-
automation_record_step_idMany2one → automation.record.stepargs: 'automation.record.step'
No public methods.
New fields (1)
-
automation_record_step_idMany2one → automation.record.stepargs: 'automation.record.step'
-
create(self, values_list)@api.model_create_multi
New fields (0)
No new fields.
Public methods (1)-
get_automation_access(self, doc_ids, operation, model_name=False)@api.modelRetrieve access policy. The behavior is similar to `mail.thread` and `mail.message` and it relies on the access rules defines on the related record. The behavior can be customized on the related model by defining `_automation_record_access`. By default `write`, otherwise the custom permission is returned.
Loading…
Loading…
- Status
- Open migration PR — not merged yet for this version
- CI status
- green — ready to merge
- Open since
- 43 days ago
- Last activity
- 43 days ago
- Repository
- OCA/automation
- Pull request
- [19.0][MIG] automation_oca: Migration to 19.0 (#54)