diff --git a/frappe/tests/test_utils.py b/frappe/tests/test_utils.py index 4f4fca8bbf..2a8d27cd19 100644 --- a/frappe/tests/test_utils.py +++ b/frappe/tests/test_utils.py @@ -30,13 +30,17 @@ from frappe.utils import ( validate_url, ) from frappe.utils.data import ( + add_to_date, cast, + get_first_day_of_week, get_time, get_timedelta, + getdate, now_datetime, nowtime, validate_python_code, ) +from frappe.utils.dateutils import get_dates_from_timegrain from frappe.utils.diff import _get_value_from_version, get_version_diff, version_query from frappe.utils.image import optimize_image, strip_exif_data from frappe.utils.response import json_handler @@ -445,6 +449,31 @@ class TestDateUtils(unittest.TestCase): self.assertIsInstance(get_timedelta(str(timedelta_input)), timedelta) self.assertIsInstance(get_timedelta(str(time_input)), timedelta) + def test_date_from_timegrain(self): + start_date = getdate("2021-01-01") + + daily = get_dates_from_timegrain(start_date, add_to_date(start_date, days=6), "Daily") + self.assertEqual(len(daily), 7) + for idx, d in enumerate(daily): + self.assertEqual(d, add_to_date(start_date, days=idx)) + + start = get_first_day_of_week(start_date) + end = add_to_date(add_to_date(start, weeks=52), days=-1) + weekly = get_dates_from_timegrain(start, end, "Weekly") + self.assertEqual(len(weekly), 52) + for idx, d in enumerate(weekly, start=1): + self.assertEqual(d, add_to_date(start, days=7 * idx - 1)) + + quarterly = get_dates_from_timegrain(start_date, add_to_date(start_date, months=5), "Quarterly") + self.assertEqual(len(quarterly), 2) + for idx, d in enumerate(quarterly, start=1): + self.assertEqual(d, add_to_date(start_date, months=idx * 3, days=-1)) + + yearly = get_dates_from_timegrain(start_date, add_to_date(start_date, years=2), "Yearly") + self.assertEqual(len(yearly), 3) + for idx, d in enumerate(yearly, start=1): + self.assertEqual(d, add_to_date(start_date, years=idx, days=-1)) + class TestResponse(unittest.TestCase): def test_json_handler(self): diff --git a/frappe/utils/dateutils.py b/frappe/utils/dateutils.py index b8f22e7ed7..d7412a444f 100644 --- a/frappe/utils/dateutils.py +++ b/frappe/utils/dateutils.py @@ -106,11 +106,10 @@ def get_dates_from_timegrain(from_date, to_date, timegrain="Daily"): months = 1 elif "Quarterly" == timegrain: months = 3 + elif "Yearly" == timegrain: + months = 1 - if "Weekly" == timegrain: - dates = [get_last_day_of_week(from_date)] - else: - dates = [get_period_ending(from_date, timegrain)] + dates = [get_period_ending(from_date, timegrain)] while getdate(dates[-1]) < getdate(to_date): if "Weekly" == timegrain: @@ -163,16 +162,12 @@ def get_period_beginning(date, timegrain, as_str=True): def get_period_ending(date, timegrain): - date = getdate(date) - if timegrain == "Daily": - return date - else: - return getdate( - { - "Daily": date, - "Weekly": get_last_day_of_week(date), - "Monthly": get_last_day(date), - "Quarterly": get_quarter_ending(date), - "Yearly": get_year_ending(date), - }[timegrain] - ) + return getdate( + { + "Daily": date, + "Weekly": get_last_day_of_week(date), + "Monthly": get_last_day(date), + "Quarterly": get_quarter_ending(date), + "Yearly": get_year_ending(date), + }[timegrain] + )