Skip to content

Commit e01ea95

Browse files
Merge pull request #1151 from frankrousseau/allow-future-day-offs
[persons] Let datetime validate interval helper inputs
2 parents da68247 + c270531 commit e01ea95

2 files changed

Lines changed: 34 additions & 39 deletions

File tree

tests/utils/test_utils.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,24 @@ def test_date(self):
118118
self.assertEqual(start.strftime("%Y-%m-%d"), "2021-02-10")
119119
self.assertEqual(end.strftime("%Y-%m-%d"), "2021-02-11")
120120

121+
def test_interval_allows_future_years(self):
122+
from zou.app.services.exception import WrongDateFormatException
123+
124+
next_year = date_helpers.get_utc_now_datetime().year + 1
125+
start, _ = date_helpers.get_month_interval(next_year, 1)
126+
self.assertEqual(start.year, next_year)
127+
start, _ = date_helpers.get_month_interval(2500, 12)
128+
self.assertEqual(start.year, 2500)
129+
130+
with pytest.raises(WrongDateFormatException):
131+
date_helpers.get_month_interval(2026, 13)
132+
with pytest.raises(WrongDateFormatException):
133+
date_helpers.get_day_interval(2026, 2, 30)
134+
with pytest.raises(WrongDateFormatException):
135+
date_helpers.get_week_interval(2026, 60)
136+
with pytest.raises(WrongDateFormatException):
137+
date_helpers.get_month_interval("abc", 1)
138+
121139
def test_get_redis_url(self):
122140
db_index = 0
123141
self.assertEqual(

zou/app/utils/date_helpers.py

Lines changed: 16 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -80,70 +80,47 @@ def get_year_interval(year):
8080
"""
8181
Get a tuple containing start date and end date for given year.
8282
"""
83-
year = int(year)
84-
if year > get_utc_now_datetime().year or year < 2010:
83+
try:
84+
start = datetime.datetime(int(year), 1, 1)
85+
end = start + relativedelta.relativedelta(years=1)
86+
except (ValueError, OverflowError):
8587
raise WrongDateFormatException
86-
87-
start = datetime.datetime(year, 1, 1)
88-
end = start + relativedelta.relativedelta(years=1)
8988
return start, end
9089

9190

9291
def get_month_interval(year, month):
9392
"""
9493
Get a tuple containing start date and end date for given year and month.
9594
"""
96-
year = int(year)
97-
month = int(month)
98-
if (
99-
year > get_utc_now_datetime().year
100-
or year < 2010
101-
or month < 1
102-
or month > 12
103-
):
95+
try:
96+
start = datetime.datetime(int(year), int(month), 1)
97+
end = start + relativedelta.relativedelta(months=1)
98+
except (ValueError, OverflowError):
10499
raise WrongDateFormatException
105-
106-
start = datetime.datetime(year, month, 1)
107-
end = start + relativedelta.relativedelta(months=1)
108100
return start, end
109101

110102

111103
def get_week_interval(year, week):
112104
"""
113105
Get a tuple containing start date and end date for given year and week.
114106
"""
115-
year = int(year)
116-
week = int(week)
117-
if (
118-
year > get_utc_now_datetime().year
119-
or year < 2010
120-
or week < 1
121-
or week > 52
122-
):
107+
try:
108+
start = datetime.date.fromisocalendar(int(year), int(week), 1)
109+
end = start + relativedelta.relativedelta(days=7)
110+
except (ValueError, OverflowError):
123111
raise WrongDateFormatException
124-
start = datetime.date.fromisocalendar(year, week, 1)
125-
end = start + relativedelta.relativedelta(days=7)
126112
return start, end
127113

128114

129115
def get_day_interval(year, month, day):
130116
"""
131117
Get a tuple containing start date and end date for given day.
132118
"""
133-
year = int(year)
134-
month = int(month)
135-
day = int(day)
136-
if (
137-
year > get_utc_now_datetime().year
138-
or year < 2010
139-
or month < 1
140-
or month > 12
141-
or day < 1
142-
or day > 31
143-
):
119+
try:
120+
start = datetime.datetime(int(year), int(month), int(day))
121+
end = start + relativedelta.relativedelta(days=1)
122+
except (ValueError, OverflowError):
144123
raise WrongDateFormatException
145-
start = datetime.datetime(year, month, day)
146-
end = start + relativedelta.relativedelta(days=1)
147124
return start, end
148125

149126

0 commit comments

Comments
 (0)