Browse Source
Merge pull request #750 from akretion/10-mig-onchange_helper
Merge pull request #750 from akretion/10-mig-onchange_helper
[10.0] Port onchange_helper to v10pull/851/head
Jordi Ballester Alomar
8 years ago
committed by
GitHub
5 changed files with 135 additions and 0 deletions
-
63onchange_helper/README.rst
-
3onchange_helper/__init__.py
-
14onchange_helper/__manifest__.py
-
3onchange_helper/models/__init__.py
-
52onchange_helper/models/ir_rule.py
@ -0,0 +1,63 @@ |
|||
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg |
|||
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html |
|||
:alt: License: AGPL-3 |
|||
|
|||
=============== |
|||
Onchange Helper |
|||
=============== |
|||
|
|||
This is a technical module. Its goal is to ease the play of onchange method directly called from Python code. |
|||
|
|||
Usage |
|||
===== |
|||
|
|||
To use this module, you need to: |
|||
|
|||
* depend on this module |
|||
* call `yourmodel.play_onchanges(values, ['field'])` |
|||
|
|||
Example if you want to create a sale order and you want to get the values relative to partner_id field (as if you fill the field from UI) |
|||
|
|||
`vals = {'partner_id: 1'}` |
|||
|
|||
`vals = self.env['sale.order'].play_onchanges(vals, ['partner_id'])` |
|||
|
|||
Then, `vals` will be updated with partner_invoice_id, partner_shipping_id, pricelist_id, etc... |
|||
|
|||
Bug Tracker |
|||
=========== |
|||
|
|||
Bugs are tracked on `GitHub Issues |
|||
<https://github.com/OCA/server-tools/issues>`_. In case of trouble, please |
|||
check there if your issue has already been reported. If you spotted it first, |
|||
help us smashing it by providing a detailed and welcomed feedback. |
|||
|
|||
Credits |
|||
======= |
|||
|
|||
Images |
|||
------ |
|||
|
|||
* Odoo Community Association: `Icon <https://github.com/OCA/maintainer-tools/blob/master/template/module/static/description/icon.svg>`_. |
|||
|
|||
Contributors |
|||
------------ |
|||
|
|||
* Guewen Baconnier <guewen.baconnier@camptocamp.com> |
|||
* Florian da Costa <florian.dacosta@akretion.com> |
|||
|
|||
Maintainer |
|||
---------- |
|||
|
|||
.. image:: https://odoo-community.org/logo.png |
|||
:alt: Odoo Community Association |
|||
:target: https://odoo-community.org |
|||
|
|||
This module is maintained by the OCA. |
|||
|
|||
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. |
|||
|
|||
To contribute to this module, please visit https://odoo-community.org. |
|||
|
@ -0,0 +1,3 @@ |
|||
# -*- coding: utf-8 -*- |
|||
|
|||
from . import models |
@ -0,0 +1,14 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016-2017 Akretion (http://www.akretion.com) |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
|
|||
{'name': 'Onchange Helper', |
|||
'version': '10.0.1.0.0', |
|||
'summary': 'Technical module that ease execution of onchange in Python code', |
|||
'author': 'Akretion,Camptocamp,Odoo Community Association (OCA)', |
|||
'website': 'http://www.akretion.com', |
|||
'license': 'AGPL-3', |
|||
'category': 'Generic Modules', |
|||
'depends': ['base'], |
|||
'installable': True, |
|||
} |
@ -0,0 +1,3 @@ |
|||
# -*- coding: utf-8 -*- |
|||
|
|||
from . import ir_rule |
@ -0,0 +1,52 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016-2017 Akretion (http://www.akretion.com) |
|||
# © 2016-2017 Camptocamp (http://www.camptocamp.com/) |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
|
|||
from odoo import api, models |
|||
|
|||
|
|||
def get_new_values(model, record, on_change_result): |
|||
vals = on_change_result.get('value', {}) |
|||
new_values = {} |
|||
for fieldname, value in vals.iteritems(): |
|||
if fieldname not in record: |
|||
column = model._fields[fieldname] |
|||
if value and column.type == 'many2one': |
|||
value = value[0] # many2one are tuple (id, name) |
|||
new_values[fieldname] = value |
|||
return new_values |
|||
|
|||
|
|||
@api.model |
|||
def play_onchanges(self, values, onchange_fields): |
|||
onchange_specs = self._onchange_spec() |
|||
# we need all fields in the dict even the empty ones |
|||
# otherwise 'onchange()' will not apply changes to them |
|||
all_values = values.copy() |
|||
for field in self._fields: |
|||
if field not in all_values: |
|||
all_values[field] = False |
|||
|
|||
# we work on a temporary record |
|||
new_record = self.new(all_values) |
|||
|
|||
new_values = {} |
|||
for field in onchange_fields: |
|||
onchange_values = new_record.onchange(all_values, |
|||
field, onchange_specs) |
|||
new_values.update(get_new_values(self, values, onchange_values)) |
|||
all_values.update(new_values) |
|||
|
|||
res = {f: v for f, v in all_values.iteritems() |
|||
if f in values or f in new_values} |
|||
return res |
|||
|
|||
|
|||
class IrRule(models.Model): |
|||
_inherit = 'ir.rule' |
|||
|
|||
def _setup_complete(self): |
|||
if not hasattr(models.BaseModel, 'play_onchanges'): |
|||
setattr(models.BaseModel, 'play_onchanges', play_onchanges) |
|||
return super(IrRule, self)._setup_complete() |
Write
Preview
Loading…
Cancel
Save
Reference in new issue