[FIX] searches with filters using "empty" domain/context values (but not attributes)

e.g. @domain="[]" would be seen as non-empty by the search view, and
if multiple domains the search view would generate a nonliteral
``['|', '[]', '[]]`` which would just yield ``['|']`` after evaluation
and concatenation, which is an invalid domain and would blow up the
server.

Specifically filter out the values ``[]`` and ``{}`` from filters

bzr revid: xmo@openerp.com-20121129112413-yrgncnesqs093jwf
This commit is contained in:
Xavier Morel 2012-11-29 12:24:13 +01:00
parent a2b23a1ca7
commit fe3d493cc8
2 changed files with 39 additions and 0 deletions

View File

@ -1009,6 +1009,7 @@ instance.web.search.FilterGroup = instance.web.search.Input.extend(/** @lends in
get_context: function (facet) {
var contexts = facet.values.chain()
.map(function (f) { return f.get('value').attrs.context; })
.without('{}')
.reject(_.isEmpty)
.value();
@ -1027,6 +1028,7 @@ instance.web.search.FilterGroup = instance.web.search.Input.extend(/** @lends in
get_groupby: function (facet) {
return facet.values.chain()
.map(function (f) { return f.get('value').attrs.context; })
.without('{}')
.reject(_.isEmpty)
.value();
},
@ -1039,6 +1041,7 @@ instance.web.search.FilterGroup = instance.web.search.Input.extend(/** @lends in
get_domain: function (facet) {
var domains = facet.values.chain()
.map(function (f) { return f.get('value').attrs.domain; })
.without('[]')
.reject(_.isEmpty)
.value();

View File

@ -845,6 +845,42 @@ openerp.testing.section('search-serialization', {
ok(!context.get_eval_context(), "context should have no evaluation context");
});
});
test('Empty filter domains', {asserts: 4}, function (instance) {
var view = {inputs: [], query: {on: function () {}}};
var filter_a = new instance.web.search.Filter(
{attrs: {name: 'a', context: '{}', domain: '[]'}}, view);
var filter_b = new instance.web.search.Filter(
{attrs: {name: 'b', context: '{}', domain: '[]'}}, view);
var filter_c = new instance.web.search.Filter(
{attrs: {name: 'c', context: '{b: 42}', domain: '[["a", "=", 3]]'}}, view);
var group = new instance.web.search.FilterGroup(
[filter_a, filter_b, filter_c], view);
var t1 = group.facet_for_defaults({a: true, c: true})
.done(function (facet) {
var model = facet;
if (!(model instanceof instance.web.search.Facet)) {
model = new instance.web.search.Facet(facet);
}
var domain = group.get_domain(model);
deepEqual(domain, '[["a", "=", 3]]', "domain should ignore empties");
var context = group.get_context(model);
deepEqual(context, '{b: 42}', "context should ignore empties");
});
var t2 = group.facet_for_defaults({a: true, b: true})
.done(function (facet) {
var model = facet;
if (!(model instanceof instance.web.search.Facet)) {
model = new instance.web.search.Facet(facet);
}
var domain = group.get_domain(model);
equal(domain, null, "domain should ignore empties");
var context = group.get_context(model);
equal(context, null, "context should ignore empties");
});
return $.when(t1, t2);
});
});
openerp.testing.section('removal', {
dependencies: ['web.search'],