From 42958e2f5eb7bf9e921445af0786dac9ba7203e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 29 Sep 2023 16:54:52 +0200 Subject: [PATCH] [IMP] base, mail, sms: directly limit available models depending on usage Add a computed m2m field giving allowed models for the action. It allows to avoid choosing the wrong models when designing server actions. Remove a test that has no use: it checks a model_id field is available on server action view while we don't want to display it as it is imposed by the rule itself. Task-3527758 (Base Automation Refactor Fiximp) Part of Task-3527752 (Mail: The Pre-Major Freeze FixImpLint) Part-of: odoo/odoo#137133 --- .../models/ir_actions_server.py | 9 ++++++++ addons/mail/models/ir_actions_server.py | 11 ++++++++++ addons/sms/models/ir_actions_server.py | 9 ++++++++ .../static/tests/tour/base_automation_tour.js | 22 ------------------- .../test_base_automation/tests/test_tour.py | 17 -------------- odoo/addons/base/models/ir_actions.py | 8 +++++++ odoo/addons/base/views/ir_actions_views.xml | 8 ++++--- 7 files changed, 42 insertions(+), 42 deletions(-) diff --git a/addons/base_automation/models/ir_actions_server.py b/addons/base_automation/models/ir_actions_server.py index 7e5b74c1a3c..782da84a3ed 100644 --- a/addons/base_automation/models/ir_actions_server.py +++ b/addons/base_automation/models/ir_actions_server.py @@ -22,3 +22,12 @@ class ServerAction(models.Model): rule_name=action.base_automation_id.name ) ) + + @api.depends('usage') + def _compute_available_model_ids(self): + """ Stricter model limit: based on automation rule """ + super()._compute_available_model_ids() + rule_based = self.filtered(lambda action: action.usage == 'base_automation') + 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 [] diff --git a/addons/mail/models/ir_actions_server.py b/addons/mail/models/ir_actions_server.py index 465071f6032..a60a7fe0803 100644 --- a/addons/mail/models/ir_actions_server.py +++ b/addons/mail/models/ir_actions_server.py @@ -106,6 +106,17 @@ class ServerActions(models.Model): ) 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 in {'mail_post', 'followers', 'remove_followers', 'next_activity'} + ) + if mail_thread_based: + mail_models = self.env['ir.model'].search([('is_mail_thread', '=', True), ('transient', '=', False)]) + for action in mail_thread_based: + action.available_model_ids = mail_models.ids + super(ServerActions, self - mail_thread_based)._compute_available_model_ids() + @api.depends('model_id', 'state') def _compute_template_id(self): to_reset = self.filtered( diff --git a/addons/sms/models/ir_actions_server.py b/addons/sms/models/ir_actions_server.py index 20d978378b0..c2a4a8e1162 100644 --- a/addons/sms/models/ir_actions_server.py +++ b/addons/sms/models/ir_actions_server.py @@ -36,6 +36,15 @@ class ServerActions(models.Model): ) 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') + if mail_thread_based: + mail_models = self.env['ir.model'].search([('is_mail_thread', '=', True), ('transient', '=', False)]) + for action in mail_thread_based: + action.available_model_ids = mail_models.ids + super(ServerActions, self - mail_thread_based)._compute_available_model_ids() + @api.depends('model_id', 'state') def _compute_sms_template_id(self): to_reset = self.filtered( 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 c771f50e748..d93a6589af1 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 @@ -431,28 +431,6 @@ registry.category("web_tour.tours").add("test_form_view_resequence_actions", { ], }); -registry.category("web_tour.tours").add("test_form_view_debug", { - test: true, - steps: () => [ - { - trigger: - ".o_form_renderer .o_field_widget[name='action_server_ids'] .o_kanban_view .o_cp_buttons button", - }, - { - trigger: ".modal-content .o_form_renderer", - run() { - const allFields = this.$anchor[0].querySelectorAll(".o_field_widget[name]"); - assertEqual( - Array.from(allFields) - .map((el) => el.getAttribute("name")) - .includes("model_id"), - true - ); - }, - }, - ], -}); - let waitOrmCalls; registry.category("web_tour.tours").add("test_form_view_model_id", { test: true, diff --git a/addons/test_base_automation/tests/test_tour.py b/addons/test_base_automation/tests/test_tour.py index e47d77da1b2..ed3e0028e31 100644 --- a/addons/test_base_automation/tests/test_tour.py +++ b/addons/test_base_automation/tests/test_tour.py @@ -265,23 +265,6 @@ class BaseAutomationTestUi(HttpCase): ["Set Active To False 2", "Set Active To False 0", "Set Active To False 1"], ) - def test_form_view_debug(self): - model = self.env.ref("base.model_res_partner") - automation = self.env["base.automation"].create( - { - "name": "Test", - "trigger": "on_create_or_write", - "model_id": model.id, - } - ) - self.start_tour( - ( - f"/web?debug=1#{_urlencode_kwargs(action=self.env.ref('base_automation.base_automation_act').id, id=automation.id, view_type='form')}" - ), - "test_form_view_debug", - login="admin", - ) - def test_form_view_model_id(self): self.start_tour( ( diff --git a/odoo/addons/base/models/ir_actions.py b/odoo/addons/base/models/ir_actions.py index f5cb8e308be..1f67f6693c2 100644 --- a/odoo/addons/base/models/ir_actions.py +++ b/odoo/addons/base/models/ir_actions.py @@ -485,6 +485,7 @@ class IrActionsServer(models.Model): "based on the sequence. Low number means high priority.") model_id = fields.Many2one('ir.model', string='Model', required=True, ondelete='cascade', index=True, help="Model on which the server action runs.") + available_model_ids = fields.Many2many('ir.model', string='Available Models', compute='_compute_available_model_ids', store=False) model_name = fields.Char(related='model_id.model', string='Model Name', readonly=True, store=True) # Python code code = fields.Text(string='Python Code', groups='base.group_system', @@ -548,6 +549,13 @@ class IrActionsServer(models.Model): else: action.name = dict(action._fields['state']._description_selection(self.env))[action.state] + @api.depends('state') + def _compute_available_model_ids(self): + allowed_models = self.env['ir.model'].search( + [('model', 'in', list(self.env['ir.model.access']._get_allowed_models()))] + ) + self.available_model_ids = allowed_models.ids + @api.onchange('model_id') def _compute_crud_model_id(self): invalid = self.filtered(lambda act: act.crud_model_id != act.model_id) diff --git a/odoo/addons/base/views/ir_actions_views.xml b/odoo/addons/base/views/ir_actions_views.xml index eca3223fda1..fa9fce9728e 100644 --- a/odoo/addons/base/views/ir_actions_views.xml +++ b/odoo/addons/base/views/ir_actions_views.xml @@ -332,9 +332,11 @@ - - - + + +