Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[18.0][ADD] server_action_mass_edit_onchange: extension to support playing onchange #985

Open
wants to merge 1 commit into
base: 18.0
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
79 changes: 79 additions & 0 deletions server_action_mass_edit_onchange/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
================================
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:

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 [email protected]

- Tris Doan <[email protected]>

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 <[email protected]>
- Tris Doan \<<[email protected]>\>
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.
Loading