diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 261d77caa24..df3163d4e6c 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -837,6 +837,18 @@ class DataSet(openerpweb.Controller): return getattr(req.session.model(model), method)(*args, **kwargs) + @openerpweb.jsonrequest + def onchange(self, req, model, method, args, context_id=None): + result = self.call_common(req, model, method, args, context_id=context_id) + if 'domain' not in result: + return result + + result['domain'] = dict( + (k, parse_domain(v, req.session)) + for k, v in result['domain'].iteritems()) + + return result + @openerpweb.jsonrequest def call(self, req, model, method, args, domain_id=None, context_id=None): return self.call_common(req, model, method, args, domain_id, context_id) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 17e46f6085c..2172ae103b8 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -316,7 +316,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# var change_spec = self.parse_on_change(on_change, widget); if (change_spec) { var ajax = { - url: '/web/dataset/call', + url: '/web/dataset/onchange', async: false }; return self.rpc(ajax, { @@ -342,6 +342,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# var result = response; if (result.value) { for (var f in result.value) { + if (!result.value.hasOwnProperty(f)) { continue; } var field = this.fields[f]; // If field is not defined in the view, just ignore it if (field) { @@ -367,7 +368,14 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# }); } if (result.domain) { - // TODO: + function edit_domain(node) { + var new_domain = result.domain[node.attrs.name]; + if (new_domain) { + node.attrs.domain = new_domain; + } + _(node.children).each(edit_domain); + } + edit_domain(this.fields_view.arch); } return $.Deferred().resolve(); } catch(e) {