From e3775ea1b95feef915008cdf91cc0d14bd80750a 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 --- proteus/pyson.py | 59 +++++++++++++++++++++--------------------------- setup.py | 3 +++ 2 files changed, 29 insertions(+), 33 deletions(-) diff --git a/proteus/pyson.py b/proteus/pyson.py index b89741bda2..830c057cfb 100644 --- a/proteus/pyson.py +++ b/proteus/pyson.py @@ -7,6 +7,7 @@ try: except ImportError: import json import datetime +from dateutil.relativedelta import relativedelta from functools import reduce @@ -455,23 +456,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): @@ -519,22 +511,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 9234e67e18..9daf0c6d58 100644 --- a/setup.py +++ b/setup.py @@ -36,6 +36,9 @@ setup(name='proteus', 'Topic :: Office/Business', ], license='LGPL-3', + install_requires=[ + "python-dateutil", + ], extras_require={ 'trytond': ['trytond >= %s.%s, < %s.%s' % (major_version, minor_version, major_version, minor_version + 1)],