Skip to content

Commit

Permalink
[ADD] server_action_mass_edit_onchange: extension to support playing …
Browse files Browse the repository at this point in the history
…onchange
  • Loading branch information
trisdoan committed Dec 25, 2024
1 parent c22320c commit 46b3a93
Show file tree
Hide file tree
Showing 17 changed files with 767 additions and 55 deletions.
63 changes: 8 additions & 55 deletions server_action_mass_edit/wizard/mass_editing_wizard.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,53 +69,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

@api.model
def _prepare_fields(self, line, field, field_info):
result = {}
Expand Down Expand Up @@ -276,8 +229,7 @@ def _clean_check_company_field_domain(self, TargetModel, field, field_info):
def create(self, vals_list):
server_action_id = self.env.context.get("server_action_id")
server_action = self.env["ir.actions.server"].sudo().browse(server_action_id)
active_ids = self.env.context.get("active_ids", [])
if server_action and active_ids:
if server_action:
for vals in vals_list:
values = {}
for key, val in vals.items():
Expand Down Expand Up @@ -308,14 +260,15 @@ def create(self, vals_list):
values.update({split_key: vals.get(split_key, False)})

if values:
for active_id in active_ids:
self.env[server_action.model_id.model].browse(
active_id
).with_context(
mass_edit=True,
).write(values)
self._exec_write(server_action, values)
return super().create([{}])

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)
records.write(vals)

def _prepare_create_values(self, vals_list):
return vals_list

Expand Down
84 changes: 84 additions & 0 deletions server_action_mass_edit_onchange/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
================================
Server Action Mass Edit Onchange
================================

..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:d4e832e364fe018a3d6bc0ea28ee7e5436ba8799a7741c7e68c4b26ed875c3db
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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/licence-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:

Usage
=====



Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/OCA/server-ux/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 <https://github.com/OCA/server-ux/issues/new?body=module:%20server_action_mass_edit_onchange%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

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

Credits
=======

Authors
-------

* Camptocamp

Contributors
------------

- Akim Juillerat akim.juillerat@camptocamp.com

- Tris Doan <tridm@trobz.com>

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 <https://github.com/OCA/server-ux/tree/18.0/server_action_mass_edit_onchange>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
2 changes: 2 additions & 0 deletions server_action_mass_edit_onchange/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from . import models
from . import wizard
15 changes: 15 additions & 0 deletions server_action_mass_edit_onchange/__manifest__.py
Original file line number Diff line number Diff line change
@@ -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.0.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",
],
}
2 changes: 2 additions & 0 deletions server_action_mass_edit_onchange/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from . import ir_actions_server_mass_edit_line
from . import ir_actions_server
21 changes: 21 additions & 0 deletions server_action_mass_edit_onchange/models/ir_actions_server.py
Original file line number Diff line number Diff line change
@@ -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
}
Original file line number Diff line number Diff line change
@@ -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")
3 changes: 3 additions & 0 deletions server_action_mass_edit_onchange/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"
2 changes: 2 additions & 0 deletions server_action_mass_edit_onchange/readme/CONTRIBUTORS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
* Akim Juillerat <akim.juillerat@camptocamp.com>
- Tris Doan \<<tridm@trobz.com>\>
1 change: 1 addition & 0 deletions server_action_mass_edit_onchange/readme/DESCRIPTION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This module is an extension of module Mass Editing to support playing onchange before writing.
Empty file.
Loading

0 comments on commit 46b3a93

Please sign in to comment.