From 37976ec5e1d4e503f70d3fe0542f1c9c48ce8dbc Mon Sep 17 00:00:00 2001 From: Damien Bouvy Date: Tue, 10 Oct 2023 18:14:30 +0200 Subject: [PATCH] [IMP] base,mail,sms,base_automation: auto-naming of server actions Commit b05e7e4da07 rightfully removed the _compute_name dependency on context keys (a bad idea for stored computed fields), but this change could lead to UX frustrations (Server Action names getting reset all the time despite what the user may have used as a name before) and UX issues (e.g. triggering a recompute by accident at module removal that could reset all 'code' action names to 'Execute Code'). This commit simply removes the automated naming feature from the base module and moves the logic to the base_automation module - and only computes automated names based on the link with an automation rule or not (so 'standalone' server actions need a name given by the user at all times). Task-3450200 Part-of: odoo/odoo#138804 --- .../models/ir_actions_server.py | 50 +++++++++++++++++++ addons/mail/models/ir_actions_server.py | 28 ----------- addons/sms/models/ir_actions_server.py | 10 ---- odoo/addons/base/models/ir_actions.py | 2 +- odoo/addons/base/tests/test_ir_actions.py | 11 ---- 5 files changed, 51 insertions(+), 50 deletions(-) diff --git a/addons/base_automation/models/ir_actions_server.py b/addons/base_automation/models/ir_actions_server.py index 782da84a3ed..e8c252af98d 100644 --- a/addons/base_automation/models/ir_actions_server.py +++ b/addons/base_automation/models/ir_actions_server.py @@ -7,6 +7,8 @@ from odoo import api, exceptions, fields, models, _ class ServerAction(models.Model): _inherit = "ir.actions.server" + name = fields.Char(compute='_compute_name', store=True, readonly=False) + usage = fields.Selection(selection_add=[ ('base_automation', 'Automation Rule') ], ondelete={'base_automation': 'cascade'}) @@ -31,3 +33,51 @@ class ServerAction(models.Model): for action in rule_based: rule_model = action.base_automation_id.model_id action.available_model_ids = rule_model.ids if rule_model in action.available_model_ids else [] + + @api.depends('state', 'update_field_id', 'crud_model_id', 'value', 'evaluation_type', 'template_id', 'partner_ids', 'activity_summary', 'sms_template_id', 'webhook_url') + def _compute_name(self): + ''' Only server actions linked to a base_automation get an automatic name. ''' + to_update = self.filtered('base_automation_id') + for action in to_update: + match action.state: + case 'object_write': + action_type = _("Update") if action.evaluation_type == 'value' else _("Compute") + action.name = f"{action_type} {action._stringify_path()}" + case 'object_create': + action.name = _( + "Create %(model_name)s with name %(value)s", + model_name=action.crud_model_id.name, + value=action.value + ) + case 'webhook': + action.name = _("Send Webhook Notification") + case 'sms': + action.name = _( + 'Send SMS: %(template_name)s', + template_name=action.sms_template_id.name + ) + case 'mail_post': + action.name = _( + 'Send email: %(template_name)s', + template_name=action.template_id.name + ) + case 'followers': + action.name = _( + 'Add followers: %(partner_names)s', + partner_names=', '.join(action.partner_ids.mapped('name')) + ) + case 'remove_followers': + action.name = _( + 'Remove followers: %(partner_names)s', + partner_names=', '.join(action.partner_ids.mapped('name')) + ) + case 'next_activity': + action.name = _( + 'Create activity: %(activity_name)s', + activity_name=action.activity_summary or action.activity_type_id.name + ) + case other: + action.name = dict(action._fields['state']._description_selection(self.env))[action.state] + # Not sure, but IIRC assignation is mandatory and I don't want the name to be reset by accident + for action in (self - to_update): + action.name = action.name or '' diff --git a/addons/mail/models/ir_actions_server.py b/addons/mail/models/ir_actions_server.py index 6d262c1d149..12e2865bdb5 100644 --- a/addons/mail/models/ir_actions_server.py +++ b/addons/mail/models/ir_actions_server.py @@ -80,34 +80,6 @@ class ServerActions(models.Model): 'User Field', compute='_compute_activity_info', readonly=False, store=True) - @api.depends('template_id', 'partner_ids', 'activity_summary') - def _compute_name(self): - to_update = self.filtered( - lambda action: action.state in {'mail_post', 'followers', 'remove_followers', 'next_activity'} - ) - for action in to_update: - if action.state == 'mail_post': - action.name = _( - 'Send email: %(template_name)s', - template_name=action.template_id.name - ) - elif action.state == 'followers': - action.name = _( - 'Add followers: %(partner_names)s', - partner_names=', '.join(action.partner_ids.mapped('name')) - ) - elif action.state == 'remove_followers': - action.name = _( - 'Remove followers: %(partner_names)s', - partner_names=', '.join(action.partner_ids.mapped('name')) - ) - elif action.state == 'next_activity': - action.name = _( - 'Next activity: %(activity_name)s', - activity_name=action.activity_summary or action.activity_type_id.name - ) - super(ServerActions, self - to_update)._compute_name() - @api.depends('state') def _compute_available_model_ids(self): mail_thread_based = self.filtered( diff --git a/addons/sms/models/ir_actions_server.py b/addons/sms/models/ir_actions_server.py index 85df13b880e..f4f7cc58bc9 100644 --- a/addons/sms/models/ir_actions_server.py +++ b/addons/sms/models/ir_actions_server.py @@ -26,16 +26,6 @@ class ServerActions(models.Model): compute='_compute_sms_method', readonly=False, store=True) - @api.depends('sms_template_id') - def _compute_name(self): - to_update = self.filtered(lambda action: action.state == 'sms') - for action in to_update: - action.name = _( - 'Send SMS: %(template_name)s', - template_name=action.sms_template_id.name - ) - super(ServerActions, self - to_update)._compute_name() - @api.depends('state') def _compute_available_model_ids(self): mail_thread_based = self.filtered(lambda action: action.state == 'sms') diff --git a/odoo/addons/base/models/ir_actions.py b/odoo/addons/base/models/ir_actions.py index cf4aa6dfb9a..bb65b0c14d2 100644 --- a/odoo/addons/base/models/ir_actions.py +++ b/odoo/addons/base/models/ir_actions.py @@ -472,7 +472,7 @@ class IrActionsServer(models.Model): return field_name return '' - name = fields.Char(compute='_compute_name', store=True, readonly=False, required=True) + name = fields.Char(required=True) type = fields.Char(default='ir.actions.server') usage = fields.Selection([ ('ir_actions_server', 'Server Action'), diff --git a/odoo/addons/base/tests/test_ir_actions.py b/odoo/addons/base/tests/test_ir_actions.py index 5c57433b485..4b3d364ebfb 100644 --- a/odoo/addons/base/tests/test_ir_actions.py +++ b/odoo/addons/base/tests/test_ir_actions.py @@ -309,17 +309,6 @@ ZeroDivisionError: division by zero""" % self.test_server_action.id }) self.action.flush_recordset(['update_path', 'update_field_id']) - def test_38_field_traversal_name_compute(self): - """ Test the automated computed name of an 'update record' action """ - # update the country's name via the partner - action_with_name = self.action.with_context(automatic_action_name=True) - action_with_name.write({ - 'state': 'object_write', - 'update_path': 'country_id.name', - 'value': 'TestUpdatedCountry', - }) - self.assertEqual(action_with_name.name, 'Update Country > Country Name', 'ir_actions_server: name should have been updated automatically') - @mute_logger('odoo.addons.base.models.ir_model', 'odoo.models') def test_40_multi(self): # Data: 2 server actions that will be nested