Merge lp:~openerp-dev/openerp-web/7.0-integer-fields-search-odo into lp:openerp-web/7.0

Proposed by Olivier Dony (Odoo)
Status: Merged
Merged at revision: 3901
Proposed branch: lp:~openerp-dev/openerp-web/7.0-integer-fields-search-odo
Merge into: lp:openerp-web/7.0
Diff against target: 104 lines (+69/-14)
2 files modified
addons/web/static/src/js/search.js (+16/-14)
addons/web/static/test/search.js (+53/-0)
To merge this branch: bzr merge lp:~openerp-dev/openerp-web/7.0-integer-fields-search-odo
Reviewer Review Type Date Requested Status
Xavier (Open ERP) (community) Needs Fixing
Review via email: mp+155942@code.launchpad.net

Description of the change

integer/float fields were not offering auto-completion in search views, making them unsearchable except via advanced search.

I added the missing complete() function and removed the incorrect value_from() function that did not conform to the 7.0 search view API. It seemed to be a leftover of the 6.1 search field implementation of get_value(), wrongly renamed for 7.0.

To post a comment you must log in.
Revision history for this message
Xavier (Open ERP) (xmo-deactivatedaccount) wrote :

* probably no need to escape the value: after parse() has run, we've got either an actual number or a NaN which gets filtered out, numbers shouldn't be able to contain HTML.
* not completing on !val means we can't complete on a 0, is that normal?
* could benefit from a new test or two in search.completions, they seem to be missing.

review: Needs Fixing
3870. By Olivier Dony (Odoo)

[FIX] web search: correct previous fix to properly handle searching for 0 on number fields

Also removed useless HTML escaping and added basic tests.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'addons/web/static/src/js/search.js'
--- addons/web/static/src/js/search.js 2013-03-28 06:33:46 +0000
+++ addons/web/static/src/js/search.js 2013-03-28 15:37:24 +0000
@@ -1346,20 +1346,22 @@
1346 }1346 }
1347});1347});
1348instance.web.search.NumberField = instance.web.search.Field.extend(/** @lends instance.web.search.NumberField# */{1348instance.web.search.NumberField = instance.web.search.Field.extend(/** @lends instance.web.search.NumberField# */{
1349 value_from: function () {1349 complete: function (value) {
1350 if (!this.$el.val()) {1350 var val = this.parse(value);
1351 return null;1351 if (isNaN(val)) { return $.when(); }
1352 }1352 var label = _.str.sprintf(
1353 var val = this.parse(this.$el.val()),1353 _t("Search %(field)s for: %(value)s"), {
1354 check = Number(this.$el.val());1354 field: '<em>' + this.attrs.string + '</em>',
1355 if (isNaN(val) || val !== check) {1355 value: '<strong>' + _.str.escapeHTML(value) + '</strong>'});
1356 this.$el.addClass('error');1356 return $.when([{
1357 throw new instance.web.search.Invalid(1357 label: label,
1358 this.attrs.name, this.$el.val(), this.error_message);1358 facet: {
1359 }1359 category: this.attrs.string,
1360 this.$el.removeClass('error');1360 field: this,
1361 return val;1361 values: [{label: value, value: val}]
1362 }1362 }
1363 }]);
1364 },
1363});1365});
1364/**1366/**
1365 * @class1367 * @class
13661368
=== modified file 'addons/web/static/test/search.js'
--- addons/web/static/test/search.js 2013-03-21 15:51:23 +0000
+++ addons/web/static/test/search.js 2013-03-28 15:37:24 +0000
@@ -614,6 +614,59 @@
614 {relation: 'dummy.model'}, view);614 {relation: 'dummy.model'}, view);
615 return f.complete("bob");615 return f.complete("bob");
616 });616 });
617 test('Integer: invalid', {asserts: 1}, function (instance) {
618 var view = {inputs: []};
619 var f = new instance.web.search.IntegerField(
620 {attrs: {string: "Dummy"}}, {}, view);
621 return f.complete("qux")
622 .done(function (completions) {
623 ok(!completions, "non-number => no completion");
624 });
625 });
626 test('Integer: non-zero', {asserts: 5}, function (instance) {
627 var view = {inputs: []};
628 var f = new instance.web.search.IntegerField(
629 {attrs: {string: "Dummy"}}, {}, view);
630 return f.complete("-2")
631 .done(function (completions) {
632 equal(completions.length, 1, "number fields provide 1 completion only");
633 var facet = new instance.web.search.Facet(completions[0].facet);
634 equal(facet.get('category'), f.attrs.string);
635 equal(facet.get('field'), f);
636 var value = facet.values.at(0);
637 equal(value.get('label'), "-2");
638 equal(value.get('value'), -2);
639 });
640 });
641 test('Integer: zero', {asserts: 3}, function (instance) {
642 var view = {inputs: []};
643 var f = new instance.web.search.IntegerField(
644 {attrs: {string: "Dummy"}}, {}, view);
645 return f.complete("0")
646 .done(function (completions) {
647 equal(completions.length, 1, "number fields provide 1 completion only");
648 var facet = new instance.web.search.Facet(completions[0].facet);
649 var value = facet.values.at(0);
650 equal(value.get('label'), "0");
651 equal(value.get('value'), 0);
652 });
653 });
654 test('Float: non-zero', {asserts: 5}, function (instance) {
655 var view = {inputs: []};
656 var f = new instance.web.search.FloatField(
657 {attrs: {string: "Dummy"}}, {}, view);
658 return f.complete("42.37")
659 .done(function (completions) {
660 equal(completions.length, 1, "float fields provide 1 completion only");
661 var facet = new instance.web.search.Facet(completions[0].facet);
662 equal(facet.get('category'), f.attrs.string);
663 equal(facet.get('field'), f);
664 var value = facet.values.at(0);
665 equal(value.get('label'), "42.37");
666 equal(value.get('value'), 42.37);
667 });
668 });
669
617});670});
618openerp.testing.section('search.serialization', {671openerp.testing.section('search.serialization', {
619 dependencies: ['web.search'],672 dependencies: ['web.search'],