[FIX] searches with filters using "empty" domain/context values (but not attributes)
authorXavier Morel <xmo@openerp.com>
Thu, 29 Nov 2012 11:24:13 +0000 (12:24 +0100)
committerXavier Morel <xmo@openerp.com>
Thu, 29 Nov 2012 11:24:13 +0000 (12:24 +0100)
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

addons/web/static/src/js/search.js
addons/web/static/test/search.js

index 5b59c7d..3917f34 100644 (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();
 
index 45f6d2c..db9e7aa 100644 (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'],