diff --git a/server_action_mass_edit/models/__init__.py b/server_action_mass_edit/models/__init__.py index bdb0d08d85..d0d97388f5 100644 --- a/server_action_mass_edit/models/__init__.py +++ b/server_action_mass_edit/models/__init__.py @@ -1,3 +1,2 @@ from . import ir_actions_server from . import ir_actions_server_mass_edit_line -from . import ir_ui_view diff --git a/server_action_mass_edit/models/ir_actions_server.py b/server_action_mass_edit/models/ir_actions_server.py index fc42c98ddd..1d1613a4b9 100644 --- a/server_action_mass_edit/models/ir_actions_server.py +++ b/server_action_mass_edit/models/ir_actions_server.py @@ -46,27 +46,34 @@ def _compute_mass_edit_apply_domain_in_lines(self): record.mass_edit_line_ids.mapped("apply_domain") ) + def _add_mass_edit_server_action_to_context(self, context): + """Force webclient to fetch updated view by adding a specific cache value in + context, take a look on cache key mechanism in `viewService.loadViews` from + `odoo/addons/web/static/src/views/view_service.js` + Also note that the same cache mechanism is used in server View class but only + when xml "dev_mode" is not active: `['ir.ui.view']._get_view_cache_key` from + `odoo/odoo/addons/base/models/ir_ui_view.py` + """ + self.ensure_one() + value = { + "write_date": fields.Datetime.to_string(self.write_date), + "server_action_id": self.id, + } + # convert dict to string to avoid problems with unhashable types in context + context["nocache_server_action_mass_edit_view_ref"] = str(value) + def _run_action_mass_edit_multi(self, eval_context=None): - """Show report label wizard""" + self.ensure_one() context = dict(self.env.context) context.update({"server_action_id": self.id}) view_id = self.env.ref("server_action_mass_edit.view_mass_editing_wizard_form") - view_id.mass_server_action_id = self.id - if view_id: - view_temp = view_id.copy( - { - "name": "Temporary Mass Editing Wizard", - "type": "form", - "model": "mass.editing.wizard", - } - ) - + self._add_mass_edit_server_action_to_context(context) return { "name": self.name, "type": "ir.actions.act_window", "res_model": "mass.editing.wizard", "context": str(context), "view_mode": "form", - "views": [[view_temp.id, "form"]], + "views": [[view_id.id, "form"]], "target": "new", } diff --git a/server_action_mass_edit/models/ir_ui_view.py b/server_action_mass_edit/models/ir_ui_view.py deleted file mode 100644 index abc7a8b18e..0000000000 --- a/server_action_mass_edit/models/ir_ui_view.py +++ /dev/null @@ -1,7 +0,0 @@ -from odoo import fields, models - - -class View(models.Model): - _inherit = "ir.ui.view" - - mass_server_action_id = fields.Many2one("ir.actions.server") diff --git a/server_action_mass_edit/tests/test_mass_editing.py b/server_action_mass_edit/tests/test_mass_editing.py index e152df8a75..732806a352 100644 --- a/server_action_mass_edit/tests/test_mass_editing.py +++ b/server_action_mass_edit/tests/test_mass_editing.py @@ -134,7 +134,6 @@ def test_wiz_fields_view_get(self): with dynamic fields. """ view_id = self.env.ref("server_action_mass_edit.view_mass_editing_wizard_form") - view_id.mass_server_action_id = False result = self.MassEditingWizard.with_context( active_ids=[], ).get_view(view_id=view_id.id) @@ -143,11 +142,9 @@ def test_wiz_fields_view_get(self): "selection__email" not in arch, "Fields view get must return architecture w/o fields" "created dynamicaly", ) - view_id.mass_server_action_id = self.mass_editing_user - result = self.MassEditingWizard.with_context( - server_action_id=self.mass_editing_user.id, - active_ids=[], - ).get_view(view_id=view_id.id) + ctx = {"active_ids": []} + self.mass_editing_user._add_mass_edit_server_action_to_context(ctx) + result = self.MassEditingWizard.with_context(**ctx).get_view(view_id=view_id.id) arch = result.get("arch", "") self.assertTrue( "selection__email" in arch, @@ -162,10 +159,7 @@ def test_wiz_fields_view_get(self): ] ).unlink() self.env.ref("base.res_partner_view_form_private").model = "res.users" - result = self.MassEditingWizard.with_context( - server_action_id=self.mass_editing_user.id, - active_ids=[], - ).get_view(view_id=view_id.id) + result = self.MassEditingWizard.with_context(**ctx).get_view(view_id=view_id.id) arch = result.get("arch", "") self.assertIn( "