[IMP] compute domains in a single pass, add 'not' operator

bzr revid: xmo@openerp.com-20110411175025-trllxu05xt4ict84
This commit is contained in:
Xavier Morel 2011-04-11 19:50:25 +02:00
parent 215ee4fa5f
commit ae0a6c6cf1
2 changed files with 25 additions and 16 deletions

View File

@ -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({

View File

@ -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));
});
});