From 7465798ccda4ff28c04283d295aae3fc49f2a46a Mon Sep 17 00:00:00 2001 From: Christophe Matthieu Date: Tue, 28 Feb 2017 08:47:05 +0100 Subject: [PATCH] [FIX] web: field_utils date * list view must use stringtify value for py eval comparaison * use utc to parse database value (avoid timezone error) --- .../web/static/src/js/fields/field_utils.js | 18 +++++++------- .../static/src/js/views/list/list_renderer.js | 3 ++- addons/web/static/test/views/list_tests.js | 24 +++++++++++++++++++ 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/addons/web/static/src/js/fields/field_utils.js b/addons/web/static/src/js/fields/field_utils.js index 8fbf24917b1..0d1e70815d5 100644 --- a/addons/web/static/src/js/fields/field_utils.js +++ b/addons/web/static/src/js/fields/field_utils.js @@ -239,18 +239,18 @@ function parseDate (value) { } var date_pattern = time.strftime_to_moment_format(core._t.database.parameters.date_format); var date_pattern_wo_zero = date_pattern.replace('MM','M').replace('DD','D'); - var date = moment(value, [date_pattern, date_pattern_wo_zero, moment.ISO_8601], true); + var date = moment.utc(value, [date_pattern, date_pattern_wo_zero, moment.ISO_8601], true); if (date.isValid() && date.year() >= 1900) { - date.toJSON = time.date_to_str.bind(time, date.toDate()); + date.toJSON = function () {return this.utc().format('YYYY-MM-DD');}; return date; } - date = moment(value, [date_pattern, date_pattern_wo_zero, moment.ISO_8601]); + date = moment.utc(value, [date_pattern, date_pattern_wo_zero, moment.ISO_8601]); if (date.isValid()) { if (date.year() === 0) { date.year(moment.utc().year()); } if (date.year() >= 1900) { - date.toJSON = time.date_to_str.bind(time, date.toDate()); + date.toJSON = function () {return this.utc().format('YYYY-MM-DD');}; return date; } } @@ -274,18 +274,20 @@ function parseDateTime (value) { time_pattern_wo_zero = time_pattern.replace('HH','H').replace('mm','m').replace('ss','s'); var pattern1 = date_pattern + ' ' + time_pattern; var pattern2 = date_pattern_wo_zero + ' ' + time_pattern_wo_zero; - var datetime = moment(value, [pattern1, pattern2, moment.ISO_8601], true); + var datetime = moment.utc(value, [pattern1, pattern2, moment.ISO_8601], true); if (datetime.isValid() && datetime.year() >= 1900) { - datetime.toJSON = time.datetime_to_str.bind(time, datetime.toDate()); + datetime.toJSON = function () { + return this.utc().format('YYYY-MM-DD HH:mm:ss'); + }; return datetime; } - datetime = moment(value, [pattern1, pattern2, moment.ISO_8601]); + datetime = moment.utc(value, [pattern1, pattern2, moment.ISO_8601]); if (datetime.isValid()) { if (datetime.year() === 0) { datetime.year(moment.utc().year()); } if (datetime.year() >= 1900) { - datetime.toJSON = time.datetime_to_str.bind(time, datetime.toDate()); + datetime.toJSON = function () {return this.utc().format('YYYY-MM-DD HH:mm:ss');}; return datetime; } } diff --git a/addons/web/static/src/js/views/list/list_renderer.js b/addons/web/static/src/js/views/list/list_renderer.js index 30b9d23b865..40897f6454d 100644 --- a/addons/web/static/src/js/views/list/list_renderer.js +++ b/addons/web/static/src/js/views/list/list_renderer.js @@ -168,7 +168,8 @@ var ListRenderer = BasicRenderer.extend({ * @returns {string[]} a list of css classes */ _computeDecorationClassNames: function (record) { - var context = _.extend({}, record.data, { + var data = JSON.parse(JSON.stringify(record.data)); + var context = _.extend({}, data, { uid: session.uid, current_date: moment().format('YYYY-MM-DD') // TODO: time, datetime, relativedelta diff --git a/addons/web/static/test/views/list_tests.js b/addons/web/static/test/views/list_tests.js index 0401f555573..e88361b5e38 100644 --- a/addons/web/static/test/views/list_tests.js +++ b/addons/web/static/test/views/list_tests.js @@ -675,6 +675,30 @@ QUnit.module('Views', { list.destroy(); }); + QUnit.test('support row decoration with date', function (assert) { + assert.expect(3); + + this.data.foo.records[0].datetime = '2017-02-27 12:51:35'; + + var list = createView({ + View: ListView, + model: 'foo', + data: this.data, + arch: '' + + '' + + '', + }); + + assert.strictEqual(list.$('tbody tr.text-info').length, 1, + "should have 1 columns with text-info class with good datetime"); + + assert.strictEqual(list.$('tbody tr.text-danger').length, 0, + "should have 0 columns with text-danger class with wrong timezone datetime"); + + assert.strictEqual(list.$('tbody tr').length, 4, "should have 4 rows"); + list.destroy(); + }); + QUnit.test('no content helper when no data', function (assert) { assert.expect(5);