From b5514aea6033225f73fc15015326f184aa7c29a1 Mon Sep 17 00:00:00 2001 From: Javier Goizueta Date: Tue, 20 Dec 2016 12:48:36 +0100 Subject: [PATCH] Avoid invalid end of period dates Fixes #322 --- .../cartodb_services/metrics/user.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/server/lib/python/cartodb_services/cartodb_services/metrics/user.py b/server/lib/python/cartodb_services/cartodb_services/metrics/user.py index 4a65014..0411ee4 100644 --- a/server/lib/python/cartodb_services/cartodb_services/metrics/user.py +++ b/server/lib/python/cartodb_services/cartodb_services/metrics/user.py @@ -1,6 +1,15 @@ from datetime import date, timedelta from dateutil.relativedelta import relativedelta +from calendar import monthrange +def last_day_of_month(year, month): + """last valid day of a month""" + return monthrange(year, month)[1] + +def latest_valid_date(year, month, day): + """latest date not later than the day specified""" + valid_day = min(day, last_day_of_month(year, month)) + return date(year, month, valid_day) class UserMetricsService: """ Class to manage all the user info """ @@ -143,9 +152,9 @@ class UserMetricsService: today = date.today() if end_period_day > today.day: temp_date = today + relativedelta(months=-1) - date_from = date(temp_date.year, temp_date.month, end_period_day) + date_from = latest_valid_date(temp_date.year, temp_date.month, end_period_day) else: - date_from = date(today.year, today.month, end_period_day) + date_from = latest_valid_date(today.year, today.month, end_period_day) return date_from, today