diff --git a/addons/base_automation/tests/test_automation.py b/addons/base_automation/tests/test_automation.py
index 71ec7c04113..b707ca0a8b0 100644
--- a/addons/base_automation/tests/test_automation.py
+++ b/addons/base_automation/tests/test_automation.py
@@ -23,7 +23,7 @@ class TestAutomation(TransactionCase):
"base_automation_id": automation.id,
"state": "object_write",
"update_path": "active",
- "value": False,
+ "update_boolean_value": "false",
"model_id": model.id,
})
automation.write({"action_server_ids": [Command.link(action.id)]})
@@ -52,7 +52,7 @@ class TestAutomation(TransactionCase):
"model_id": model.id,
"state": "object_write",
"update_path": "active",
- "value": False
+ "update_boolean_value": "false",
})
action.flush_recordset()
automation.write({"action_server_ids": [Command.link(action.id)]})
diff --git a/addons/base_automation/views/base_automation_views.xml b/addons/base_automation/views/base_automation_views.xml
index c3d71deb809..89c38b58e5e 100644
--- a/addons/base_automation/views/base_automation_views.xml
+++ b/addons/base_automation/views/base_automation_views.xml
@@ -179,6 +179,7 @@
as
+
diff --git a/addons/test_base_automation/static/tests/tour/base_automation_tour.js b/addons/test_base_automation/static/tests/tour/base_automation_tour.js
index 87c2c7590a7..e27985c7fb1 100644
--- a/addons/test_base_automation/static/tests/tour/base_automation_tour.js
+++ b/addons/test_base_automation/static/tests/tour/base_automation_tour.js
@@ -76,19 +76,24 @@ registry.category("web_tour.tours").add("test_base_automation", {
},
{
content: "Set new action to update the record",
- trigger: " .modal-content .o_form_renderer [name='state'] select",
- run: 'text "object_write"',
+ trigger: ".modal-content .o_form_renderer [name='state'] span[value*='object_write']",
},
{
- content: "Open update select",
+ content: "Focus on the 'update_path' field",
+ trigger: ".modal-content .o_form_renderer [name='update_path'] .o_model_field_selector",
+ },
+ {
+ content: "Input field name",
trigger:
- '.modal-content .o_form_renderer .o_field_widget[name="update_field_id"] input',
+ '.o_model_field_selector_popover .o_model_field_selector_popover_search input',
run: "text Job Position",
+ in_modal: false,
},
{
- content: "Open update select",
+ content: "Select field",
+ in_modal: false,
trigger:
- '.modal-content .o_form_renderer div[name="update_field_id"] .dropdown-menu li a:contains(Job Position):not(:has(.fa-spin))',
+ '.o_model_field_selector_popover .o_model_field_selector_popover_page li[data-name="function"] button',
},
{
content: "Open update select",
@@ -147,7 +152,7 @@ registry.category("web_tour.tours").add("test_base_automation_on_tag_added", {
on_time_updated: "After last update",
on_create_or_write: "On save",
on_unlink: "On deletion",
- on_change: "On live update",
+ on_change: "On UI change",
on_webhook: "On webhook",
})
);
@@ -157,21 +162,36 @@ registry.category("web_tour.tours").add("test_base_automation_on_tag_added", {
trigger: ".o_form_renderer #trigger_0",
run: 'text "on_tag_set"',
},
+ {
+ trigger: '.o_form_renderer div[name="trg_field_ref"] input',
+ run: "text test",
+ },
+ {
+ trigger:
+ '.o_form_renderer div[name="trg_field_ref"] .dropdown-menu li a:contains(test):not(:has(.fa-spin))',
+ },
{
trigger: '.o_form_renderer div[name="action_server_ids"] button',
},
{
- trigger: " .modal-content .o_form_renderer [name='state'] select",
- run: 'text "object_write"',
+ trigger: " .modal-content .o_form_renderer [name='state'] span[value*='object_write']",
},
{
+ content: "Focus on the 'update_path' field",
+ trigger: ".modal-content .o_form_renderer [name='update_path'] .o_model_field_selector",
+ },
+ {
+ content: "Input field name",
trigger:
- '.modal-content .o_form_renderer .o_field_widget[name="update_field_id"] input',
+ '.o_model_field_selector_popover .o_model_field_selector_popover_search input',
run: "text Name",
+ in_modal: false,
},
{
+ content: "Select field",
+ in_modal: false,
trigger:
- '.modal-content .o_form_renderer div[name="update_field_id"] .dropdown-menu li a:contains(Name):not(:has(.fa-spin))',
+ '.o_model_field_selector_popover .o_model_field_selector_popover_page li[data-name="name"] button',
},
{
trigger: '.modal-content .o_form_renderer div[name="value"] textarea',
@@ -184,17 +204,24 @@ registry.category("web_tour.tours").add("test_base_automation_on_tag_added", {
trigger: '.o_form_renderer div[name="action_server_ids"] button',
},
{
- trigger: " .modal-content .o_form_renderer [name='state'] select",
- run: 'text "object_write"',
+ trigger: " .modal-content .o_form_renderer [name='state'] span[value*='object_write']",
},
{
+ content: "Focus on the 'update_path' field",
+ trigger: ".modal-content .o_form_renderer [name='update_path'] .o_model_field_selector",
+ },
+ {
+ content: "Input field name",
trigger:
- '.modal-content .o_form_renderer .o_field_widget[name="update_field_id"] input',
+ '.o_model_field_selector_popover .o_model_field_selector_popover_search input',
run: "text Priority",
+ in_modal: false,
},
{
+ content: "Select field",
+ in_modal: false,
trigger:
- '.modal-content .o_form_renderer div[name="update_field_id"] .dropdown-menu li a:contains(Priority):not(:has(.fa-spin))',
+ '.o_model_field_selector_popover .o_model_field_selector_popover_page li[data-name="priority"] button',
},
{
trigger: '.modal-content .o_form_renderer div[name="selection_value"] input',
@@ -221,7 +248,7 @@ registry.category("web_tour.tours").add("test_base_automation_on_tag_added", {
);
assertEqual(
card.querySelector(".o_automation_actions").textContent,
- "Update Display NameUpdate Priority"
+ "Update NameUpdate Priority"
);
},
},
@@ -335,7 +362,7 @@ registry.category("web_tour.tours").add("test_kanban_automation_view_create_acti
async run() {
assertEqual(
document.querySelector("div[name='action_server_ids']").innerText,
- "Create User with name NameX"
+ "Create Contact with name NameX"
);
assertEqual(document.querySelectorAll(".fa.fa-edit").length, 1);
},
@@ -375,7 +402,7 @@ registry.category("web_tour.tours").add("test_form_view_resequence_actions", {
async run() {
assertEqual(
this.$anchor[0].innerText,
- "Set Active To False 0\nSet Active To False 1\nSet Active To False 2"
+ "Update Active 0\nto\nNo (False)\nUpdate Active 1\nto\nNo (False)\nUpdate Active 2\nto\nNo (False)"
);
},
},
@@ -391,7 +418,7 @@ registry.category("web_tour.tours").add("test_form_view_resequence_actions", {
async run() {
assertEqual(
this.$anchor[0].innerText,
- "Set Active To False 2\nSet Active To False 0\nSet Active To False 1"
+ "Update Active 2\nto\nNo (False)\nUpdate Active 0\nto\nNo (False)\nUpdate Active 1\nto\nNo (False)"
);
},
},
@@ -412,16 +439,14 @@ registry.category("web_tour.tours").add("test_form_view_resequence_actions", {
},
},
{
- trigger: ".modal-content .o_form_renderer [name='state'] select",
- run: 'text "object_write"',
+ trigger: ".modal-content .o_form_renderer [name='state'] span[value*='object_write']",
},
{
- trigger: ".modal-content .o_form_renderer [name='state'] select",
- run: 'text "followers"',
+ trigger: ".modal-content .o_form_renderer [name='state'] span[value*='followers']",
},
{
extra_trigger:
- ".modal-content .o_form_renderer [name='state'] select:contains(Add Followers)",
+ ".modal-content .o_form_renderer [name='state'] span.active[value*='followers']",
trigger: ".modal-content .o_form_button_cancel",
},
{
@@ -454,7 +479,7 @@ registry.category("web_tour.tours").add("test_form_view_model_id", {
);
assertEqual(
triggerGroups.map((el) => el.innerText).join(" // "),
- "User is set // Based on date fieldAfter creationAfter last update // On saveOn deletionOn live update // On webhook"
+ "User is set // Based on date fieldAfter creationAfter last update // On saveOn deletionOn UI change // On webhook"
);
},
},
@@ -488,7 +513,7 @@ registry.category("web_tour.tours").add("test_form_view_model_id", {
);
assertEqual(
triggerGroups.map((el) => el.innerText).join(" // "),
- "Stage is set toUser is setTag is addedPriority is set to // Based on date fieldAfter creationAfter last update // On saveOn deletionOn live update // On webhook"
+ "Stage is set toUser is setTag is addedPriority is set to // Based on date fieldAfter creationAfter last update // On saveOn deletionOn UI change // On webhook"
);
},
},
@@ -603,4 +628,4 @@ registry.category("web_tour.tours").add("test_form_view_mail_triggers", {
run() {}
}
],
-});
+});
\ No newline at end of file
diff --git a/addons/test_base_automation/tests/test_flow.py b/addons/test_base_automation/tests/test_flow.py
index b1f10e0aa33..d53338ebfe9 100644
--- a/addons/test_base_automation/tests/test_flow.py
+++ b/addons/test_base_automation/tests/test_flow.py
@@ -801,7 +801,7 @@ if env.context.get('old_values', None): # on write
trigger='on_unarchive',
trigger_field_ids=[active_field.id],
filter_domain="[('active', '=', True)]",
- _actions={'state': 'code', 'code': "record.write({'name': record.name + '!'})"},
+ _actions={'state': 'object_write', 'evaluation_type': 'equation', 'update_path': 'name', 'value': "record.name + '!'"},
)
lead = self.create_lead()
self.assertEqual(lead.name, 'Lead Test')
@@ -969,8 +969,8 @@ class TestCompute(common.TransactionCase):
lead_thread_model = self.env["ir.model"]._get("base.automation.lead.thread.test")
automation = create_automation(self, trigger="on_message_sent", model_id=lead_thread_model.id, _actions={
"state": "object_write",
- "update_field_id": self.env["ir.model.fields"]._get("base.automation.lead.thread.test", "active").id,
- "value": False
+ "update_path": "active",
+ "update_boolean_value": "false"
})
ext_partner = self.env["res.partner"].create({"name": "ext", "email": "email@server.com"})
@@ -1013,12 +1013,11 @@ class TestCompute(common.TransactionCase):
@common.tagged("post_install", "-at_install")
class TestHttp(common.HttpCase):
def test_webhook_trigger(self):
- self.authenticate(None, None)
model = self.env["ir.model"]._get("base.automation.linked.test")
record_getter = "model.search([('name', '=', payload['name'])]) if payload.get('name') else None"
- automation = create_automation(self, trigger="on_webhook", model_id=model.id, record_getter=record_getter, log_webhook_calls=True, _actions={
+ automation = create_automation(self, trigger="on_webhook", model_id=model.id, record_getter=record_getter, _actions={
"state": "object_write",
- "update_field_id": self.env["ir.model.fields"]._get(model.model, "another_field").id,
+ "update_path": "another_field",
"value": "written"
})
diff --git a/addons/test_base_automation/tests/test_tour.py b/addons/test_base_automation/tests/test_tour.py
index ad65598249e..35ff86102b3 100644
--- a/addons/test_base_automation/tests/test_tour.py
+++ b/addons/test_base_automation/tests/test_tour.py
@@ -87,20 +87,21 @@ class BaseAutomationTestUi(HttpCase):
('model_id', '=', project_model.id),
('name', '=', 'stage_id'),
])
- self.env['test_base_automation.stage'].create({'name': 'Stage value'})
+ test_stage = self.env['test_base_automation.stage'].create({'name': 'Stage value'})
automation = self.env["base.automation"].create({
"name": "Test Stage",
"trigger": "on_stage_set",
"model_id": project_model.id,
"trigger_field_ids": [stage_field.id],
+ "trg_field_ref": test_stage,
})
action = {
"name": "Set Active To False",
"base_automation_id": automation.id,
"state": "object_write",
- "update_field_id": self.env.ref("base.field_res_partner__active").id,
+ "update_path": "user_ids.active",
"value": False,
"model_id": project_model.id
}
@@ -162,7 +163,7 @@ class BaseAutomationTestUi(HttpCase):
})
action = {
- "name": "Create User with name NameX",
+ "name": "This name should not survive :)",
"base_automation_id": automation.id,
"state": "object_create",
"value": "NameX",
@@ -192,7 +193,7 @@ class BaseAutomationTestUi(HttpCase):
"name": "Set Active To False",
"base_automation_id": automation.id,
"state": "object_write",
- "update_field_id": self.env.ref("base.field_res_partner__active").id,
+ "update_path": "active",
"value": False,
"model_id": model.id,
}
@@ -214,11 +215,11 @@ class BaseAutomationTestUi(HttpCase):
}
)
action = {
- "name": "Set Active To False",
+ "name": "Update Active",
"base_automation_id": automation.id,
"state": "object_write",
- "update_field_id": self.env.ref("base.field_res_partner__active").id,
- "value": False,
+ "update_path": "active",
+ "update_boolean_value": "false",
"model_id": model.id,
}
automation.write(
@@ -226,7 +227,7 @@ class BaseAutomationTestUi(HttpCase):
)
self.assertEqual(
automation.action_server_ids.mapped("name"),
- ["Set Active To False 0", "Set Active To False 1", "Set Active To False 2"],
+ ["Update Active 0", "Update Active 1", "Update Active 2"],
)
onchange_link_passes = 0
@@ -240,10 +241,10 @@ class BaseAutomationTestUi(HttpCase):
default_keys = {k: v for k, v in self_model._context.items() if k.startswith("default_")}
self.assertEqual(
default_keys,
- {"default_model_id": model.id, "default_state": False, "default_usage": "base_automation"},
+ {"default_model_id": model.id, "default_usage": "base_automation"},
)
if onchange_link_passes == 2:
- self.assertEqual(res["value"]["name"], "Update False")
+ self.assertFalse(res["value"], "No change should be triggered here")
if onchange_link_passes == 3:
self.assertEqual(res["value"]["name"], "Add followers: ")
@@ -261,7 +262,7 @@ class BaseAutomationTestUi(HttpCase):
self.assertEqual(onchange_link_passes, 3)
self.assertEqual(
automation.action_server_ids.mapped("name"),
- ["Set Active To False 2", "Set Active To False 0", "Set Active To False 1"],
+ ["Update Active 2", "Update Active 0", "Update Active 1"],
)
def test_form_view_model_id(self):