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