Commit 2321a47f authored by Xiaowu Zhang's avatar Xiaowu Zhang

erp5_core: handle correctly addToDate when add/remove month

parent a07118b2
...@@ -74,6 +74,10 @@ class TestDateUtils(unittest.TestCase): ...@@ -74,6 +74,10 @@ class TestDateUtils(unittest.TestCase):
addToDate(march_31, month=1).toZone('UTC').ISO()) addToDate(march_31, month=1).toZone('UTC').ISO())
self.assertEqual(DateTime('2001/05/1 %s' % self.timezone).toZone('UTC').ISO(), self.assertEqual(DateTime('2001/05/1 %s' % self.timezone).toZone('UTC').ISO(),
addToDate(march_31, month=1, day=1).toZone('UTC').ISO()) addToDate(march_31, month=1, day=1).toZone('UTC').ISO())
self.assertEqual(DateTime('2001/05/1 %s' % self.timezone).toZone('UTC').ISO(),
addToDate(march_31, month=1, hour=24).toZone('UTC').ISO())
self.assertEqual(DateTime('2001/05/1 %s' % self.timezone).toZone('UTC').ISO(),
addToDate(march_31, hour=24*31).toZone('UTC').ISO())
def test_negative_add_to_date(self): def test_negative_add_to_date(self):
date = DateTime('2000/01/01 %s' % self.timezone) date = DateTime('2000/01/01 %s' % self.timezone)
...@@ -97,6 +101,10 @@ class TestDateUtils(unittest.TestCase): ...@@ -97,6 +101,10 @@ class TestDateUtils(unittest.TestCase):
may_31 = DateTime('2000/05/31 %s' % self.timezone) may_31 = DateTime('2000/05/31 %s' % self.timezone)
self.assertEqual(DateTime('2000/04/30 %s' % self.timezone).toZone('UTC').ISO(), self.assertEqual(DateTime('2000/04/30 %s' % self.timezone).toZone('UTC').ISO(),
addToDate(may_31, month=-1).toZone('UTC').ISO()) addToDate(may_31, month=-1).toZone('UTC').ISO())
self.assertEqual(DateTime('2001/02/27 %s' % self.timezone).toZone('UTC').ISO(),
addToDate(march_31, month=-1, hour=-24).toZone('UTC').ISO())
self.assertEqual(DateTime('2001/02/27 %s' % self.timezone).toZone('UTC').ISO(),
addToDate(march_31, hour=-24*32).toZone('UTC').ISO())
def test_float_add_to_date(self): def test_float_add_to_date(self):
date = DateTime('2000/01/01 %s' % self.timezone) date = DateTime('2000/01/01 %s' % self.timezone)
......
...@@ -109,9 +109,8 @@ def addToDate(date, to_add=None, **kw): ...@@ -109,9 +109,8 @@ def addToDate(date, to_add=None, **kw):
return_value[key] = return_value[key] - number_of_in_dict[key] return_value[key] = return_value[key] - number_of_in_dict[key]
return_value[larger_key_dict[key]] = return_value[larger_key_dict[key]] + 1 return_value[larger_key_dict[key]] = return_value[larger_key_dict[key]] + 1
month_in_to_add = to_add.get('month', None)
for key in key_list: for key in key_list:
if key == 'day':
continue
if to_add.get(key, None) is not None: if to_add.get(key, None) is not None:
return_value[key] = return_value[key] + to_add[key] return_value[key] = return_value[key] + to_add[key]
del to_add[key] del to_add[key]
...@@ -126,13 +125,7 @@ def addToDate(date, to_add=None, **kw): ...@@ -126,13 +125,7 @@ def addToDate(date, to_add=None, **kw):
for local_key in return_value.keys(): for local_key in return_value.keys():
if local_key not in ('day', 'year'): if local_key not in ('day', 'year'):
treatPositiveValues(return_value, local_key) treatPositiveValues(return_value, local_key)
day_to_add = return_value['day'] - 1
day_to_add = min(
return_value['day'],
getNumberOfDayInMonth(
DateTime(return_value['year'], int(return_value['month']), 1)
)
) - 1
if to_add.get('day', None) is not None: if to_add.get('day', None) is not None:
day_to_add += to_add['day'] day_to_add += to_add['day']
return_value['day'] = 1 return_value['day'] = 1
...@@ -143,6 +136,9 @@ def addToDate(date, to_add=None, **kw): ...@@ -143,6 +136,9 @@ def addToDate(date, to_add=None, **kw):
return_value['minute'], return_value['minute'],
return_value['second'], return_value['second'],
date.timezone())) date.timezone()))
overflow_day = date.day() - getNumberOfDayInMonth(return_date)
if (month_in_to_add is not None) and (overflow_day > 0):
day_to_add -= overflow_day
return_date += day_to_add return_date += day_to_add
return return_date return return_date
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment