[REF] move compute_domain outside of openep.base.form.Widget

bzr revid: xmo@openerp.com-20110411173643-84eqb3vc0drd9ge7
This commit is contained in:
Xavier Morel 2011-04-11 19:36:43 +02:00
parent 25bbc891cf
commit 215ee4fa5f
2 changed files with 76 additions and 83 deletions

View File

@ -258,6 +258,65 @@ openerp.base.FormView = openerp.base.Controller.extend( /** @lends openerp.base
/** @namespace */
openerp.base.form = {};
openerp.base.form.compute_domain = function(expr, fields) {
var stack = [];
for (var i = 0; i < expr.length; i++) {
var ex = expr[i];
if (ex.length == 1) {
stack.push(ex[0]);
continue;
}
var field = fields[ex[0]].value;
var op = ex[1];
var val = ex[2];
switch (op.toLowerCase()) {
case '=':
case '==':
stack.push(field == val);
break;
case '!=':
case '<>':
stack.push(field != val);
break;
case '<':
stack.push(field < val);
break;
case '>':
stack.push(field > val);
break;
case '<=':
stack.push(field <= val);
break;
case '>=':
stack.push(field >= val);
break;
case 'in':
stack.push(_.indexOf(val, field) > -1);
break;
case 'not in':
stack.push(_.indexOf(val, field) == -1);
break;
default:
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({
init: function(view, node) {
this.view = view;
@ -282,69 +341,11 @@ openerp.base.form.Widget = openerp.base.Controller.extend({
this.$element = $('#' + this.element_id);
},
process_attrs: function() {
var compute_domain = openerp.base.form.compute_domain;
for (var a in this.attrs) {
this[a] = this.compute_domain(this.attrs[a]);
this[a] = compute_domain(this.attrs[a], this.view.fields);
}
},
compute_domain: function(expr) {
var stack = [];
for (var i = 0; i < expr.length; i++) {
var ex = expr[i];
if (ex.length == 1) {
stack.push(ex[0]);
continue;
}
var field = this.view.fields[ex[0]].value;
var op = ex[1];
var val = ex[2];
switch (op.toLowerCase()) {
case '=':
case '==':
stack.push(field == val);
break;
case '!=':
case '<>':
stack.push(field != val);
break;
case '<':
stack.push(field < val);
break;
case '>':
stack.push(field > val);
break;
case '<=':
stack.push(field <= val);
break;
case '>=':
stack.push(field >= val);
break;
case 'in':
stack.push(_.indexOf(val, field) > -1);
break;
case 'not in':
stack.push(_.indexOf(val, field) == -1);
break;
default:
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;
},
update_dom: function() {
this.$element.toggle(!this.invisible);
},

View File

@ -1,32 +1,28 @@
$(document).ready(function () {
var widget;
var openerp;
module("form.widget", {
setup: function () {
var openerp = window.openerp.init(true);
openerp = window.openerp.init(true);
window.openerp.base.chrome(openerp);
// views loader stuff
window.openerp.base.data(openerp);
window.openerp.base.views(openerp);
window.openerp.base.form(openerp);
widget = new openerp.base.form.Widget({
'widgets': {},
'fields': {}
}, {
'attrs': {}
});
}
});
test("compute_domain", function () {
widget.view.fields = {
var fields = {
'a': {value: 3},
'group_method': {value: 'line'},
'select1': {value: 'day'},
'rrule_type': {value: 'monthly'}
};
ok(widget.compute_domain([['a', '=', 3]]));
ok(widget.compute_domain([['group_method','!=','count']]));
ok(widget.compute_domain([['select1','=','day'],
['rrule_type','=','monthly']]));
ok(openerp.base.form.compute_domain(
[['a', '=', 3]], fields));
ok(openerp.base.form.compute_domain(
[['group_method','!=','count']], fields));
ok(openerp.base.form.compute_domain(
[['select1','=','day'], ['rrule_type','=','monthly']], fields));
});
test("compute_domain or", function () {
var base = {
@ -39,16 +35,12 @@ $(document).ready(function () {
'|', ['user_id','=',3],
['member_ids', 'in', [3]]];
widget.view.fields = _.extend(
{}, base, {'section_id': {value: 42}});
ok(widget.compute_domain(domain));
ok(openerp.base.form.compute_domain(domain, _.extend(
{}, base, {'section_id': {value: 42}})));
ok(openerp.base.form.compute_domain(domain, _.extend(
{}, base, {'user_id': {value: 3}})));
widget.view.fields = _.extend(
{}, base, {'user_id': {value: 3}});
ok(widget.compute_domain(domain));
widget.view.fields = _.extend(
{}, base, {'member_ids': {value: 3}});
ok(widget.compute_domain(domain));
ok(openerp.base.form.compute_domain(domain, _.extend(
{}, base, {'member_ids': {value: 3}})));
});
});