From 64538c181e2eff7ab5dde0c4b01fcc4b204bf52f Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 3 May 2012 18:37:09 +0200 Subject: [PATCH] [FIX] domain and context generation on m2o fields by default, an m2o field should behave like a charfield (== use its textual value), but if the domain is fully default (no filter_domain and no custom operator) and the user explicitly selected an object (which is the only thing he can do at this point in the new search view), then we can generate a domain matching exactly the stored id. bzr revid: xmo@openerp.com-20120503163709-odlnib513h3f84v6 --- addons/web/static/src/js/search.js | 10 +++++++ addons/web/static/test/search.js | 47 ++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/addons/web/static/src/js/search.js b/addons/web/static/src/js/search.js index 196fdcac0cd..c0542585f40 100644 --- a/addons/web/static/src/js/search.js +++ b/addons/web/static/src/js/search.js @@ -1270,6 +1270,7 @@ instance.web.search.DateTimeField = instance.web.search.DateField.extend(/** @le } }); instance.web.search.ManyToOneField = instance.web.search.CharField.extend({ + default_operator: {}, init: function (view_section, field, view) { this._super(view_section, field, view); this.model = new instance.web.Model(this.attrs.relation); @@ -1302,6 +1303,15 @@ instance.web.search.ManyToOneField = instance.web.search.CharField.extend({ if (_(names).isEmpty()) { return null; } return facet_from(self, names[0]); }) + }, + value_from: function (facetValue) { + return facetValue.get('label'); + }, + make_domain: function (name, operator, facetValue) { + if (operator === this.default_operator) { + return [[name, '=', facetValue.get('value')]]; + } + return this._super(name, operator, facetValue); } }); diff --git a/addons/web/static/test/search.js b/addons/web/static/test/search.js index 682cf27a7ab..9b0205c462a 100644 --- a/addons/web/static/test/search.js +++ b/addons/web/static/test/search.js @@ -833,6 +833,53 @@ $(document).ready(function () { self: "great" }, "evaluation context should hold facet value as self"); }); + test("M2O default", function () { + var f = new instance.web.search.ManyToOneField( + {}, {name: 'foo'}, {inputs: []}); + var facet = new instance.web.search.Facet({ + field: f, + values: [{label: "Foo", value: 42}] + }); + + deepEqual(f.get_domain(facet), [['foo', '=', 42]], + "m2o should use identity if default domain"); + }); + test("M2O custom operator", function () { + var f = new instance.web.search.ManyToOneField( + {attrs: {operator: 'boos'}}, {name: 'foo'}, {inputs: []}); + var facet = new instance.web.search.Facet({ + field: f, + values: [{label: "Foo", value: 42}] + }); + + deepEqual(f.get_domain(facet), [['foo', 'boos', 'Foo']], + "m2o should use label with custom operators"); + }); + test("M2O custom domain & context", function () { + var f = new instance.web.search.ManyToOneField({attrs: { + context: "{'whee': self}", + filter_domain: "[['filter', 'is', self]]" + }}, {name: 'foo'}, {inputs: []}); + var facet = new instance.web.search.Facet({ + field: f, + values: [{label: "Foo", value: 42}] + }); + + var domain = f.get_domain(facet); + deepEqual(domain.__domains, [ + "[['filter', 'is', self]]" + ]); + deepEqual(domain.get_eval_context(), { + self: "Foo" + }, "custom domain's self should be label"); + var context = f.get_context(facet); + deepEqual(context.__contexts, [ + "{'whee': self}" + ]); + deepEqual(context.get_eval_context(), { + self: "Foo" + }, "custom context's self should be label"); + }); module('drawer', { setup: function () {