From 4850c0d4fe2f189ad447c42037bf5da5e8d0b9fa Mon Sep 17 00:00:00 2001 From: mmdanny89 <66078599+mmdanny89@users.noreply.github.com> Date: Tue, 7 Jun 2022 09:12:23 -0400 Subject: [PATCH 1/2] infinite loop graphic bar When Period is Yearly and Date Range is Last Year in Graphic Bar --- frappe/utils/dateutils.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frappe/utils/dateutils.py b/frappe/utils/dateutils.py index b8f22e7ed7..6815b60f02 100644 --- a/frappe/utils/dateutils.py +++ b/frappe/utils/dateutils.py @@ -106,6 +106,8 @@ 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)] From 59a9be4caf4ac20a715a510d8305975820436ea0 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Wed, 8 Jun 2022 11:50:59 +0530 Subject: [PATCH 2/2] refactor: simplify timegrain conditions All special handling for timegrains is same as general handling, no idea why it's done like this. --- frappe/tests/test_utils.py | 29 +++++++++++++++++++++++++++++ frappe/utils/dateutils.py | 27 ++++++++++----------------- 2 files changed, 39 insertions(+), 17 deletions(-) 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 6815b60f02..d7412a444f 100644 --- a/frappe/utils/dateutils.py +++ b/frappe/utils/dateutils.py @@ -109,10 +109,7 @@ def get_dates_from_timegrain(from_date, to_date, timegrain="Daily"): 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: @@ -165,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] + )