From b68838465a1660860ccf0bd54bef06f68f2afa90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Mon, 5 Mar 2012 10:19:20 +0100 Subject: [PATCH] Use relativedelta to make all the datetime computation issue2469 (transplanted from f1810a191577acc2712515fbb16b1c036422958b) --- proteus/pyson.py | 59 +++++++++++++++++++++--------------------------- setup.py | 4 +++- 2 files changed, 29 insertions(+), 34 deletions(-) diff --git a/proteus/pyson.py b/proteus/pyson.py index 5eca3cb6a6..45bcbaa8e7 100644 --- a/proteus/pyson.py +++ b/proteus/pyson.py @@ -8,6 +8,7 @@ if sys.version_info < (2, 6): else: import json import datetime +from dateutil.relativedelta import relativedelta class PYSON(object): @@ -396,23 +397,14 @@ class Date(PYSON): @staticmethod def eval(dct, context): - date = datetime.date.today() - replace = {} - for i, j in (('y', 'year'), ('M', 'month'), ('d', 'day')): - if dct[i] is not None: - replace[j] = dct[i] - date = date.replace(**replace) - if dct['dy']: - year = date.year + dct['dy'] - date = date.replace(year=year) - if dct['dM']: - month = date.month + dct['dM'] - year = date.year + month / 12 - month = month % 12 - date = date.replace(year=year, month=month) - if dct['dd']: - date += datetime.timedelta(days=dct['dd']) - return date + return datetime.date.today() + relativedelta( + year=dct['y'], + month=dct['M'], + day=dct['d'], + years=dct['dy'], + months=dct['dM'], + days=dct['dd'], + ) class DateTime(Date): @@ -460,22 +452,23 @@ class DateTime(Date): @staticmethod def eval(dct, context): - date = Date.eval(dct, context) - datetime_ = datetime.datetime.combine(date, - datetime.datetime.now().time()) - replace = {} - for i, j in (('h', 'hour'), ('m', 'minute'), ('s', 'second'), - ('ms', 'microsecond')): - if dct[i] is not None: - replace[j] = dct[i] - datetime_ = datetime_.replace(**replace) - delta = {} - for i, j in (('dh', 'hours'), ('dm', 'minutes'), ('ds', 'seconds'), - ('dms', 'microseconds')): - if dct[i]: - delta[j] = dct[i] - datetime_ += datetime.timedelta(**delta) - return datetime_ + return datetime.datetime.now() + relativedelta( + year=dct['y'], + month=dct['M'], + day=dct['d'], + hour=dct['h'], + minute=dct['m'], + second=dct['s'], + microsecond=dct['ms'], + years=dct['dy'], + months=dct['dM'], + days=dct['dd'], + hours=dct['dh'], + minutes=dct['dm'], + seconds=dct['ds'], + microseconds=dct['dms'], + ) + CONTEXT = { 'Eval': Eval, diff --git a/setup.py b/setup.py index 6ed5377e56..5077eee712 100644 --- a/setup.py +++ b/setup.py @@ -39,7 +39,9 @@ setup(name='proteus', 'Topic :: Office/Business', ], license='GPL-3', - install_requires=SIMPLEJSON, + install_requires=SIMPLEJSON + [ + "python-dateutil", + ], extras_require={ 'trytond': ['trytond >= %s.%s, < %s.%s' % (major_version, minor_version, major_version, minor_version + 1)],