From 5d3837355b7f997103439db744aa16ca56d5d57b Mon Sep 17 00:00:00 2001 From: trisdoan Date: Tue, 24 Dec 2024 11:04:34 +0700 Subject: [PATCH 1/4] [ADD] server_action_mass_edit_onchange: extension to support playing onchange --- server_action_mass_edit_onchange/README.rst | 83 ++++ server_action_mass_edit_onchange/__init__.py | 2 + .../__manifest__.py | 15 + .../i18n/server_action_mass_edit_onchange.pot | 50 ++ .../models/__init__.py | 2 + .../models/ir_actions_server.py | 21 + .../ir_actions_server_mass_edit_line.py | 10 + .../pyproject.toml | 3 + .../readme/CONTRIBUTORS.md | 2 + .../readme/DESCRIPTION.md | 1 + .../static/description/icon.png | Bin 0 -> 10254 bytes .../static/description/index.html | 431 ++++++++++++++++++ .../tests/__init__.py | 1 + .../tests/test_mass_editing.py | 75 +++ .../views/ir_actions_server.xml | 15 + .../wizard/__init__.py | 1 + .../wizard/mass_editing_wizard.py | 98 ++++ 17 files changed, 810 insertions(+) create mode 100644 server_action_mass_edit_onchange/README.rst create mode 100644 server_action_mass_edit_onchange/__init__.py create mode 100644 server_action_mass_edit_onchange/__manifest__.py create mode 100644 server_action_mass_edit_onchange/i18n/server_action_mass_edit_onchange.pot create mode 100644 server_action_mass_edit_onchange/models/__init__.py create mode 100644 server_action_mass_edit_onchange/models/ir_actions_server.py create mode 100644 server_action_mass_edit_onchange/models/ir_actions_server_mass_edit_line.py create mode 100644 server_action_mass_edit_onchange/pyproject.toml create mode 100644 server_action_mass_edit_onchange/readme/CONTRIBUTORS.md create mode 100644 server_action_mass_edit_onchange/readme/DESCRIPTION.md create mode 100644 server_action_mass_edit_onchange/static/description/icon.png create mode 100644 server_action_mass_edit_onchange/static/description/index.html create mode 100644 server_action_mass_edit_onchange/tests/__init__.py create mode 100644 server_action_mass_edit_onchange/tests/test_mass_editing.py create mode 100644 server_action_mass_edit_onchange/views/ir_actions_server.xml create mode 100644 server_action_mass_edit_onchange/wizard/__init__.py create mode 100644 server_action_mass_edit_onchange/wizard/mass_editing_wizard.py diff --git a/server_action_mass_edit_onchange/README.rst b/server_action_mass_edit_onchange/README.rst new file mode 100644 index 0000000000..040259c7ed --- /dev/null +++ b/server_action_mass_edit_onchange/README.rst @@ -0,0 +1,83 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +================================ +Server Action Mass Edit Onchange +================================ + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:4ecb83298926e7e790173247738d18205a50ef65a90e98d405627251de3de3ad + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--ux-lightgray.png?logo=github + :target: https://github.com/OCA/server-ux/tree/18.0/server_action_mass_edit_onchange + :alt: OCA/server-ux +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/server-ux-18-0/server-ux-18-0-server_action_mass_edit_onchange + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/server-ux&target_branch=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module is an extension of module Mass Editing to support playing +onchange before writing. + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Camptocamp + +Contributors +------------ + +- Akim Juillerat akim.juillerat@camptocamp.com + +- Tris Doan + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/server-ux `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/server_action_mass_edit_onchange/__init__.py b/server_action_mass_edit_onchange/__init__.py new file mode 100644 index 0000000000..9b4296142f --- /dev/null +++ b/server_action_mass_edit_onchange/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import wizard diff --git a/server_action_mass_edit_onchange/__manifest__.py b/server_action_mass_edit_onchange/__manifest__.py new file mode 100644 index 0000000000..87f675fe86 --- /dev/null +++ b/server_action_mass_edit_onchange/__manifest__.py @@ -0,0 +1,15 @@ +# Copyright 2024 Camptocamp +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Server Action Mass Edit Onchange", + "summary": """Extension of server_action_mass_edit""", + "version": "18.0.1.1.0", + "license": "AGPL-3", + "author": "Camptocamp, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/server-ux", + "depends": ["server_action_mass_edit", "onchange_helper"], + "data": [ + "views/ir_actions_server.xml", + ], +} diff --git a/server_action_mass_edit_onchange/i18n/server_action_mass_edit_onchange.pot b/server_action_mass_edit_onchange/i18n/server_action_mass_edit_onchange.pot new file mode 100644 index 0000000000..1b2214e574 --- /dev/null +++ b/server_action_mass_edit_onchange/i18n/server_action_mass_edit_onchange.pot @@ -0,0 +1,50 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * server_action_mass_edit_onchange +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: server_action_mass_edit_onchange +#: model:ir.model.fields,field_description:server_action_mass_edit_onchange.field_ir_actions_server_mass_edit_line__apply_onchanges +msgid "Apply Onchanges" +msgstr "" + +#. module: server_action_mass_edit_onchange +#: model:ir.model.fields,field_description:server_action_mass_edit_onchange.field_mass_editing_wizard__play_onchanges +msgid "Play Onchanges" +msgstr "" + +#. module: server_action_mass_edit_onchange +#: model:ir.model.fields,help:server_action_mass_edit_onchange.field_ir_actions_server_mass_edit_line__apply_onchanges +msgid "Play field onchanges before writing value" +msgstr "" + +#. module: server_action_mass_edit_onchange +#: model:ir.model.fields,field_description:server_action_mass_edit_onchange.field_ir_actions_server__mass_edit_play_onchanges +#: model:ir.model.fields,field_description:server_action_mass_edit_onchange.field_ir_cron__mass_edit_play_onchanges +msgid "Play onchanges from lines" +msgstr "" + +#. module: server_action_mass_edit_onchange +#: model:ir.model,name:server_action_mass_edit_onchange.model_ir_actions_server +msgid "Server Action" +msgstr "" + +#. module: server_action_mass_edit_onchange +#: model:ir.model,name:server_action_mass_edit_onchange.model_ir_actions_server_mass_edit_line +msgid "Server Actions Mass Edit Lines" +msgstr "" + +#. module: server_action_mass_edit_onchange +#: model:ir.model,name:server_action_mass_edit_onchange.model_mass_editing_wizard +msgid "Wizard for mass edition" +msgstr "" diff --git a/server_action_mass_edit_onchange/models/__init__.py b/server_action_mass_edit_onchange/models/__init__.py new file mode 100644 index 0000000000..ba247e3c81 --- /dev/null +++ b/server_action_mass_edit_onchange/models/__init__.py @@ -0,0 +1,2 @@ +from . import ir_actions_server_mass_edit_line +from . import ir_actions_server diff --git a/server_action_mass_edit_onchange/models/ir_actions_server.py b/server_action_mass_edit_onchange/models/ir_actions_server.py new file mode 100644 index 0000000000..16133fba3f --- /dev/null +++ b/server_action_mass_edit_onchange/models/ir_actions_server.py @@ -0,0 +1,21 @@ +# Copyright 2024 Camptocamp +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class IrActionsServer(models.Model): + _inherit = "ir.actions.server" + + mass_edit_play_onchanges = fields.Json( + string="Play onchanges from lines", + compute="_compute_mass_edit_play_onchanges", + ) + + @api.depends("mass_edit_line_ids.apply_onchanges") + def _compute_mass_edit_play_onchanges(self): + for record in self: + record.mass_edit_play_onchanges = { + line.field_id.name: line.apply_onchanges + for line in record.mass_edit_line_ids + } diff --git a/server_action_mass_edit_onchange/models/ir_actions_server_mass_edit_line.py b/server_action_mass_edit_onchange/models/ir_actions_server_mass_edit_line.py new file mode 100644 index 0000000000..6911fd7437 --- /dev/null +++ b/server_action_mass_edit_onchange/models/ir_actions_server_mass_edit_line.py @@ -0,0 +1,10 @@ +# Copyright 2024 Camptocamp +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class IrActionsServerMassEditLine(models.Model): + _inherit = "ir.actions.server.mass.edit.line" + + apply_onchanges = fields.Boolean(help="Play field onchanges before writing value") diff --git a/server_action_mass_edit_onchange/pyproject.toml b/server_action_mass_edit_onchange/pyproject.toml new file mode 100644 index 0000000000..4231d0cccb --- /dev/null +++ b/server_action_mass_edit_onchange/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/server_action_mass_edit_onchange/readme/CONTRIBUTORS.md b/server_action_mass_edit_onchange/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..ae063262d8 --- /dev/null +++ b/server_action_mass_edit_onchange/readme/CONTRIBUTORS.md @@ -0,0 +1,2 @@ +* Akim Juillerat +- Tris Doan \<\> diff --git a/server_action_mass_edit_onchange/readme/DESCRIPTION.md b/server_action_mass_edit_onchange/readme/DESCRIPTION.md new file mode 100644 index 0000000000..2116de8fa9 --- /dev/null +++ b/server_action_mass_edit_onchange/readme/DESCRIPTION.md @@ -0,0 +1 @@ +This module is an extension of module Mass Editing to support playing onchange before writing. diff --git a/server_action_mass_edit_onchange/static/description/icon.png b/server_action_mass_edit_onchange/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1dcc49c24f364e9adf0afbc6fc0bac6dbecdeb11 GIT binary patch literal 10254 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 + + + + +README.rst + + + +
+ + + +Odoo Community Association + +
+

Server Action Mass Edit Onchange

+ +

Beta License: AGPL-3 OCA/server-ux Translate me on Weblate Try me on Runboat

+

This module is an extension of module Mass Editing to support playing +onchange before writing.

+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Camptocamp
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/server-ux project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+
+ + diff --git a/server_action_mass_edit_onchange/tests/__init__.py b/server_action_mass_edit_onchange/tests/__init__.py new file mode 100644 index 0000000000..4f51e8e6b1 --- /dev/null +++ b/server_action_mass_edit_onchange/tests/__init__.py @@ -0,0 +1 @@ +from . import test_mass_editing diff --git a/server_action_mass_edit_onchange/tests/test_mass_editing.py b/server_action_mass_edit_onchange/tests/test_mass_editing.py new file mode 100644 index 0000000000..d2dd4cf61b --- /dev/null +++ b/server_action_mass_edit_onchange/tests/test_mass_editing.py @@ -0,0 +1,75 @@ +# Copyright 2024 Camptocamp +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from unittest.mock import patch + +from odoo.addons.server_action_mass_edit.tests.test_mass_editing import ( + TestMassEditing, +) + + +class TestMassEditingWithOnChange(TestMassEditing): + @patch("odoo.addons.base.models.res_partner.Partner.onchange_email") + def test_wizard_field_onchange(self, patched): + server_action_partner = self.env["ir.actions.server"].create( + { + "name": "Mass Edit Partner", + "state": "mass_edit", + "model_id": self.env.ref("base.model_res_partner").id, + } + ) + self.env["ir.actions.server.mass.edit.line"].create( + [ + { + "server_action_id": server_action_partner.id, + "field_id": self.env.ref("base.field_res_partner__country_id").id, + "apply_onchanges": True, + }, + { + "server_action_id": server_action_partner.id, + "field_id": self.env.ref("base.field_res_partner__email").id, + "apply_onchanges": False, + }, + ] + ) + self.assertEqual( + server_action_partner.mass_edit_play_onchanges, + { + "country_id": True, + "email": False, + }, + ) + us_country = self.env.ref("base.us") + mx_country = self.env.ref("base.mx") + partners = self.env["res.partner"].create( + [ + { + "name": "ACME", + "country_id": us_country.id, + "state_id": self.env.ref("base.state_us_1").id, + }, + { + "name": "Example.com", + "country_id": us_country.id, + "state_id": self.env.ref("base.state_us_2").id, + }, + ] + ) + self.MassEditingWizard.with_context( + server_action_id=server_action_partner.id, + active_ids=partners.ids, + ).create( + { + "selection__country_id": "set", + "selection__email": "set", + "country_id": mx_country, + "email": "dummy@email.com", + } + ) + for partner in partners: + self.assertEqual(partner.country_id, mx_country) + # state_id is set to False by _onchange_country_id + self.assertFalse(partner.state_id) + self.assertEqual(partner.email, "dummy@email.com") + # onchange_email is not called + patched.assert_not_called() diff --git a/server_action_mass_edit_onchange/views/ir_actions_server.xml b/server_action_mass_edit_onchange/views/ir_actions_server.xml new file mode 100644 index 0000000000..3368be46f8 --- /dev/null +++ b/server_action_mass_edit_onchange/views/ir_actions_server.xml @@ -0,0 +1,15 @@ + + + + ir.actions.server + + + + + + + + diff --git a/server_action_mass_edit_onchange/wizard/__init__.py b/server_action_mass_edit_onchange/wizard/__init__.py new file mode 100644 index 0000000000..01affac4bd --- /dev/null +++ b/server_action_mass_edit_onchange/wizard/__init__.py @@ -0,0 +1 @@ +from . import mass_editing_wizard diff --git a/server_action_mass_edit_onchange/wizard/mass_editing_wizard.py b/server_action_mass_edit_onchange/wizard/mass_editing_wizard.py new file mode 100644 index 0000000000..f6e5065b76 --- /dev/null +++ b/server_action_mass_edit_onchange/wizard/mass_editing_wizard.py @@ -0,0 +1,98 @@ +# Copyright 2024 Camptocamp +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class MassEditingWizard(models.TransientModel): + _inherit = "mass.editing.wizard" + + play_onchanges = fields.Json(readonly=True) + + @api.model + def default_get(self, fields): + res = super().default_get(fields) + server_action_id = self.env.context.get("server_action_id") + server_action = self.env["ir.actions.server"].sudo().browse(server_action_id) + + if not server_action: + return res + res.update( + { + "play_onchanges": server_action.mass_edit_play_onchanges, + } + ) + return res + + def onchange(self, values, field_names, fields_spec): + first_call = not field_names + if first_call: + field_names = [fname for fname in values if fname != "id"] + missing_names = [fname for fname in fields_spec if fname not in values] + defaults = self.default_get(missing_names) + for field_name in missing_names: + values[field_name] = defaults.get(field_name, False) + if field_name in defaults: + field_names.append(field_name) + + server_action_id = self.env.context.get("server_action_id") + server_action = self.env["ir.actions.server"].sudo().browse(server_action_id) + if not server_action: + return super().onchange(values, field_names, fields_spec) + dynamic_fields = {} + + for line in server_action.mapped("mass_edit_line_ids"): + values["selection__" + line.field_id.name] = "ignore" + values[line.field_id.name] = False + + dynamic_fields["selection__" + line.field_id.name] = fields.Selection( + [], default="ignore" + ) + + dynamic_fields[line.field_id.name] = fields.Text([()], default=False) + + self._fields.update(dynamic_fields) + + res = super().onchange(values, field_names, fields_spec) + if not res["value"]: + value = {key: value for key, value in values.items() if value is not False} + res["value"] = value + + for field in dynamic_fields: + self._fields.pop(field) + + view_temp = ( + self.env["ir.ui.view"] + .sudo() + .search([("name", "=", "Temporary Mass Editing Wizard")], limit=1) + ) + if view_temp: + view_temp.unlink() + + return res + + def _exec_write(self, server_action, vals): + active_ids = self.env.context.get("active_ids", []) + model = self.env[server_action.model_id.model].with_context(mass_edit=True) + records = model.browse(active_ids) + # Check if a field in values is set to play onchanges, in which case + # each record is to be updated sequentially + onchanges_to_play = [ + fname + for fname, val in server_action.mass_edit_play_onchanges.items() + if val + ] + if onchanges_to_play: + onchange_values = {k: v for k, v in vals.items() if k in onchanges_to_play} + not_onchange_values = { + k: v for k, v in vals.items() if k not in onchanges_to_play + } + for rec in records: + rec_values = onchange_values.copy() + rec_values = rec.play_onchanges(rec_values, list(rec_values.keys())) + rec_values.update(not_onchange_values) + rec.write(rec_values) + else: + # If there is not any onchange to play we can write + # all the records at once + return super()._exec_write(server_action, vals) From 2606fe45ec586bc44ee04e1047e552acf08429b0 Mon Sep 17 00:00:00 2001 From: mymage Date: Wed, 18 Jun 2025 05:54:42 +0000 Subject: [PATCH 2/4] Added translation using Weblate (Italian) --- server_action_mass_edit_onchange/i18n/it.po | 53 +++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 server_action_mass_edit_onchange/i18n/it.po diff --git a/server_action_mass_edit_onchange/i18n/it.po b/server_action_mass_edit_onchange/i18n/it.po new file mode 100644 index 0000000000..0673dd232d --- /dev/null +++ b/server_action_mass_edit_onchange/i18n/it.po @@ -0,0 +1,53 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * server_action_mass_edit_onchange +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-07-01 11:40+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.10.4\n" + +#. module: server_action_mass_edit_onchange +#: model:ir.model.fields,field_description:server_action_mass_edit_onchange.field_ir_actions_server_mass_edit_line__apply_onchanges +msgid "Apply Onchanges" +msgstr "Applica su modifiche" + +#. module: server_action_mass_edit_onchange +#: model:ir.model.fields,field_description:server_action_mass_edit_onchange.field_mass_editing_wizard__play_onchanges +msgid "Play Onchanges" +msgstr "Esegui su modifiche" + +#. module: server_action_mass_edit_onchange +#: model:ir.model.fields,help:server_action_mass_edit_onchange.field_ir_actions_server_mass_edit_line__apply_onchanges +msgid "Play field onchanges before writing value" +msgstr "Esegui campo su modifiche prima di scrivere il valore" + +#. module: server_action_mass_edit_onchange +#: model:ir.model.fields,field_description:server_action_mass_edit_onchange.field_ir_actions_server__mass_edit_play_onchanges +#: model:ir.model.fields,field_description:server_action_mass_edit_onchange.field_ir_cron__mass_edit_play_onchanges +msgid "Play onchanges from lines" +msgstr "Esegui su modifiche dalle righe" + +#. module: server_action_mass_edit_onchange +#: model:ir.model,name:server_action_mass_edit_onchange.model_ir_actions_server +msgid "Server Action" +msgstr "Azione server" + +#. module: server_action_mass_edit_onchange +#: model:ir.model,name:server_action_mass_edit_onchange.model_ir_actions_server_mass_edit_line +msgid "Server Actions Mass Edit Lines" +msgstr "Righe azioni modifica di massa server" + +#. module: server_action_mass_edit_onchange +#: model:ir.model,name:server_action_mass_edit_onchange.model_mass_editing_wizard +msgid "Wizard for mass edition" +msgstr "Procedura guidata per le modifiche massive" From a425a97ac1a7aadba6c417a9aeaa248f6e0701e9 Mon Sep 17 00:00:00 2001 From: "A.David-TSC" Date: Wed, 25 Jun 2025 17:34:10 +0300 Subject: [PATCH 3/4] [FIX] server_action_mass_edit: add onchange method for selection__ temp fields removals --- server_action_mass_edit_onchange/README.rst | 2 +- .../__manifest__.py | 2 +- .../static/description/index.html | 2 +- .../wizard/mass_editing_wizard.py | 47 ------------------- 4 files changed, 3 insertions(+), 50 deletions(-) diff --git a/server_action_mass_edit_onchange/README.rst b/server_action_mass_edit_onchange/README.rst index 040259c7ed..c99291990a 100644 --- a/server_action_mass_edit_onchange/README.rst +++ b/server_action_mass_edit_onchange/README.rst @@ -11,7 +11,7 @@ Server Action Mass Edit Onchange !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:4ecb83298926e7e790173247738d18205a50ef65a90e98d405627251de3de3ad + !! source digest: sha256:2f70ce6aa21a25dfd9ed1741f2fea8469e77fe5d91d0fa4ed7df629fcc0d07a4 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/server_action_mass_edit_onchange/__manifest__.py b/server_action_mass_edit_onchange/__manifest__.py index 87f675fe86..875856a2fe 100644 --- a/server_action_mass_edit_onchange/__manifest__.py +++ b/server_action_mass_edit_onchange/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Server Action Mass Edit Onchange", "summary": """Extension of server_action_mass_edit""", - "version": "18.0.1.1.0", + "version": "18.0.1.1.1", "license": "AGPL-3", "author": "Camptocamp, Odoo Community Association (OCA)", "website": "https://github.com/OCA/server-ux", diff --git a/server_action_mass_edit_onchange/static/description/index.html b/server_action_mass_edit_onchange/static/description/index.html index 0874d6a26b..1bd6fb2545 100644 --- a/server_action_mass_edit_onchange/static/description/index.html +++ b/server_action_mass_edit_onchange/static/description/index.html @@ -372,7 +372,7 @@

Server Action Mass Edit Onchange

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:4ecb83298926e7e790173247738d18205a50ef65a90e98d405627251de3de3ad +!! source digest: sha256:2f70ce6aa21a25dfd9ed1741f2fea8469e77fe5d91d0fa4ed7df629fcc0d07a4 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: AGPL-3 OCA/server-ux Translate me on Weblate Try me on Runboat

This module is an extension of module Mass Editing to support playing diff --git a/server_action_mass_edit_onchange/wizard/mass_editing_wizard.py b/server_action_mass_edit_onchange/wizard/mass_editing_wizard.py index f6e5065b76..b72d4843ee 100644 --- a/server_action_mass_edit_onchange/wizard/mass_editing_wizard.py +++ b/server_action_mass_edit_onchange/wizard/mass_editing_wizard.py @@ -24,53 +24,6 @@ def default_get(self, fields): ) return res - def onchange(self, values, field_names, fields_spec): - first_call = not field_names - if first_call: - field_names = [fname for fname in values if fname != "id"] - missing_names = [fname for fname in fields_spec if fname not in values] - defaults = self.default_get(missing_names) - for field_name in missing_names: - values[field_name] = defaults.get(field_name, False) - if field_name in defaults: - field_names.append(field_name) - - server_action_id = self.env.context.get("server_action_id") - server_action = self.env["ir.actions.server"].sudo().browse(server_action_id) - if not server_action: - return super().onchange(values, field_names, fields_spec) - dynamic_fields = {} - - for line in server_action.mapped("mass_edit_line_ids"): - values["selection__" + line.field_id.name] = "ignore" - values[line.field_id.name] = False - - dynamic_fields["selection__" + line.field_id.name] = fields.Selection( - [], default="ignore" - ) - - dynamic_fields[line.field_id.name] = fields.Text([()], default=False) - - self._fields.update(dynamic_fields) - - res = super().onchange(values, field_names, fields_spec) - if not res["value"]: - value = {key: value for key, value in values.items() if value is not False} - res["value"] = value - - for field in dynamic_fields: - self._fields.pop(field) - - view_temp = ( - self.env["ir.ui.view"] - .sudo() - .search([("name", "=", "Temporary Mass Editing Wizard")], limit=1) - ) - if view_temp: - view_temp.unlink() - - return res - def _exec_write(self, server_action, vals): active_ids = self.env.context.get("active_ids", []) model = self.env[server_action.model_id.model].with_context(mass_edit=True) From 9890c9ce1137dd63ef3755d16f9eeef0dd1810a5 Mon Sep 17 00:00:00 2001 From: MohamedOsman7 Date: Mon, 6 Jul 2026 14:35:49 +0000 Subject: [PATCH 4/4] [MIG] server_action_mass_edit_onchange: Migration to 19.0 --- server_action_mass_edit_onchange/README.rst | 14 +++++++------- server_action_mass_edit_onchange/__manifest__.py | 2 +- .../static/description/index.html | 6 +++--- .../tests/test_mass_editing.py | 15 ++++++++------- 4 files changed, 19 insertions(+), 18 deletions(-) diff --git a/server_action_mass_edit_onchange/README.rst b/server_action_mass_edit_onchange/README.rst index c99291990a..f25963f970 100644 --- a/server_action_mass_edit_onchange/README.rst +++ b/server_action_mass_edit_onchange/README.rst @@ -21,13 +21,13 @@ Server Action Mass Edit Onchange :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--ux-lightgray.png?logo=github - :target: https://github.com/OCA/server-ux/tree/18.0/server_action_mass_edit_onchange + :target: https://github.com/OCA/server-ux/tree/19.0/server_action_mass_edit_onchange :alt: OCA/server-ux .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/server-ux-18-0/server-ux-18-0-server_action_mass_edit_onchange + :target: https://translation.odoo-community.org/projects/server-ux-19-0/server-ux-19-0-server_action_mass_edit_onchange :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/server-ux&target_branch=18.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/server-ux&target_branch=19.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -46,7 +46,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -61,9 +61,9 @@ Authors Contributors ------------ -- Akim Juillerat akim.juillerat@camptocamp.com +- Akim Juillerat akim.juillerat@camptocamp.com -- Tris Doan +- Tris Doan Maintainers ----------- @@ -78,6 +78,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/server-ux `_ project on GitHub. +This module is part of the `OCA/server-ux `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/server_action_mass_edit_onchange/__manifest__.py b/server_action_mass_edit_onchange/__manifest__.py index 875856a2fe..fe25e1cdbb 100644 --- a/server_action_mass_edit_onchange/__manifest__.py +++ b/server_action_mass_edit_onchange/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Server Action Mass Edit Onchange", "summary": """Extension of server_action_mass_edit""", - "version": "18.0.1.1.1", + "version": "19.0.1.0.0", "license": "AGPL-3", "author": "Camptocamp, Odoo Community Association (OCA)", "website": "https://github.com/OCA/server-ux", diff --git a/server_action_mass_edit_onchange/static/description/index.html b/server_action_mass_edit_onchange/static/description/index.html index 1bd6fb2545..6401986b50 100644 --- a/server_action_mass_edit_onchange/static/description/index.html +++ b/server_action_mass_edit_onchange/static/description/index.html @@ -374,7 +374,7 @@

Server Action Mass Edit Onchange

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:2f70ce6aa21a25dfd9ed1741f2fea8469e77fe5d91d0fa4ed7df629fcc0d07a4 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/server-ux Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/server-ux Translate me on Weblate Try me on Runboat

This module is an extension of module Mass Editing to support playing onchange before writing.

Table of contents

@@ -394,7 +394,7 @@

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -feedback.

+feedback.

Do not contact contributors directly about support or help with technical issues.

@@ -421,7 +421,7 @@

Maintainers

OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

-

This module is part of the OCA/server-ux project on GitHub.

+

This module is part of the OCA/server-ux project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

diff --git a/server_action_mass_edit_onchange/tests/test_mass_editing.py b/server_action_mass_edit_onchange/tests/test_mass_editing.py index d2dd4cf61b..e08ee2c580 100644 --- a/server_action_mass_edit_onchange/tests/test_mass_editing.py +++ b/server_action_mass_edit_onchange/tests/test_mass_editing.py @@ -9,7 +9,7 @@ class TestMassEditingWithOnChange(TestMassEditing): - @patch("odoo.addons.base.models.res_partner.Partner.onchange_email") + @patch("odoo.addons.base.models.res_partner.ResPartner.onchange_company_type") def test_wizard_field_onchange(self, patched): server_action_partner = self.env["ir.actions.server"].create( { @@ -27,7 +27,7 @@ def test_wizard_field_onchange(self, patched): }, { "server_action_id": server_action_partner.id, - "field_id": self.env.ref("base.field_res_partner__email").id, + "field_id": self.env.ref("base.field_res_partner__company_type").id, "apply_onchanges": False, }, ] @@ -36,7 +36,7 @@ def test_wizard_field_onchange(self, patched): server_action_partner.mass_edit_play_onchanges, { "country_id": True, - "email": False, + "company_type": False, }, ) us_country = self.env.ref("base.us") @@ -61,15 +61,16 @@ def test_wizard_field_onchange(self, patched): ).create( { "selection__country_id": "set", - "selection__email": "set", + "selection__company_type": "set", "country_id": mx_country, - "email": "dummy@email.com", + "company_type": "company", } ) for partner in partners: self.assertEqual(partner.country_id, mx_country) # state_id is set to False by _onchange_country_id self.assertFalse(partner.state_id) - self.assertEqual(partner.email, "dummy@email.com") - # onchange_email is not called + # company_type is written directly, without playing its onchange + self.assertEqual(partner.company_type, "company") + # onchange_company_type is not called because apply_onchanges is False patched.assert_not_called()