diff --git a/addons/web/static/src/js/framework/pyeval.js b/addons/web/static/src/js/framework/pyeval.js index bcab0b0717f..ea24ac87ecc 100644 --- a/addons/web/static/src/js/framework/pyeval.js +++ b/addons/web/static/src/js/framework/pyeval.js @@ -627,13 +627,15 @@ var relativedelta = py.type('relativedelta', null, { this._fix(); }, _fix: function () { + var self = this; var months = asJS(this.ops.months); if (Math.abs(months) > 11) { var s = months > 0 ? 1 : -1; - var r = utils.divmod(months * s, 12); - this.ops.months = py.float.fromJSON(r.mod*s); - this.ops.years = py.float.fromJSON( - asJS(this.ops.years) + r.div*s); + utils.divmod(months * s, 12, function (years, months) { + self.ops.months = py.float.fromJSON(months*s); + self.ops.years = py.float.fromJSON( + asJS(self.ops.years) + years*s); + }); } this._has_time = 0; }, diff --git a/addons/web/static/test/evals.js b/addons/web/static/test/evals.js index b6a3b4177e8..1fbf6523bac 100644 --- a/addons/web/static/test/evals.js +++ b/addons/web/static/test/evals.js @@ -300,6 +300,14 @@ odoo.define_section('eval.types', ['web.pyeval'], function (test, mock) { py.eval("(datetime.date(2015,2,5)+relativedelta(days=-6,weekday=0)).strftime('%Y-%m-%d')", pyeval.context()), '2015-02-02'); + strictEqual( + py.eval("(datetime.date(2018, 2, 1) + relativedelta(years=7, months=42, days=42)).strftime('%Y-%m-%d')", + pyeval.context()), + '2028-09-12'); + strictEqual( + py.eval("(datetime.date(2018, 2, 1) + relativedelta(years=-7, months=-42, days=-42)).strftime('%Y-%m-%d')", + pyeval.context()), + '2007-06-20'); }); test('datetime.tojson', function (assert, pyeval) {