diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index a5aa2364d97..d33c9f2ee7e 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -260,11 +260,23 @@ openerp.base.form = {}; openerp.base.form.compute_domain = function(expr, fields) { var stack = []; - for (var i = 0; i < expr.length; i++) { + for (var i = expr.length - 1; i >= 0; i--) { var ex = expr[i]; if (ex.length == 1) { - stack.push(ex[0]); - continue; + var top = stack.pop(); + switch (ex[0]) { + case '|': + stack.push(stack.pop() || top); + continue; + case '&': + stack.push(stack.pop() && top); + continue; + case '!': + stack.push(!top); + continue; + default: + throw new Error('Unknown domain operator ' + ex[0]); + } } var field = fields[ex[0]].value; @@ -302,19 +314,6 @@ openerp.base.form.compute_domain = function(expr, fields) { this.log("Unsupported operator in attrs :", op); } } - - for (var j = stack.length-1; j >- 1; j--) { - switch (stack[j]) { - case '|': - var result = stack[j + 1] || stack[j + 2]; - stack.splice(j, 3, result); - break; - case '&': - var result = stack[j + 1] && stack[j + 2]; - stack.splice(j, 3, result); - break; - } - } return _.indexOf(stack, false) == -1; }, openerp.base.form.Widget = openerp.base.Controller.extend({ diff --git a/addons/base/static/test/form.js b/addons/base/static/test/form.js index 0cad536bc73..6ae1719f620 100644 --- a/addons/base/static/test/form.js +++ b/addons/base/static/test/form.js @@ -43,4 +43,14 @@ $(document).ready(function () { ok(openerp.base.form.compute_domain(domain, _.extend( {}, base, {'member_ids': {value: 3}}))); }); + test("compute_domain not", function () { + var fields = { + 'a': {value: 5}, + 'group_method': {value: 'line'} + }; + ok(openerp.base.form.compute_domain( + ['!', ['a', '=', 3]], fields)); + ok(openerp.base.form.compute_domain( + ['!', ['group_method','=','count']], fields)); + }); });