From 3858e95e80073fde1e88e2cc21b71bf6ca02b4f6 Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Tue, 31 Aug 2021 12:57:05 +0530 Subject: [PATCH] feat(utils): Add util get_timedelta get_timedelta returns None in case of invalid or imparsable inputs. This behaviour is consistent wrt other utils. The util, to_timedelta tries to convert to timedelta objects only if str object is passed. It returns the same object if not string, which is absurd...given its called `to_timedelta`. --- frappe/utils/data.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/frappe/utils/data.py b/frappe/utils/data.py index 4e972c0189..9ff8deb517 100644 --- a/frappe/utils/data.py +++ b/frappe/utils/data.py @@ -1,6 +1,7 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # MIT License. See license.txt +from typing import Optional import frappe import operator import json @@ -68,6 +69,31 @@ def get_datetime(datetime_str=None): except ValueError: return parser.parse(datetime_str) +def get_timedelta(time: str = None) -> Optional[datetime.timedelta]: + """Return `datetime.timedelta` object from string value of a + valid time format. Returns None if `time` is not a valid format + + Args: + time (str): A valid time representation. This string is parsed + using `dateutil.parser.parse`. Examples of valid inputs are: + '0:0:0', '17:21:00', '2012-01-19 17:21:00'. Checkout + https://dateutil.readthedocs.io/en/stable/parser.html#dateutil.parser.parse + + Returns: + datetime.timedelta: Timedelta object equivalent of the passed `time` string + """ + from dateutil import parser + + time = time or "0:0:0" + + try: + t = parser.parse(time) + return datetime.timedelta( + hours=t.hour, minutes=t.minute, seconds=t.second, microseconds=t.microsecond + ) + except Exception: + return None + def to_timedelta(time_str): from dateutil import parser