Merge pull request #15847 from gavindsouza/timeutils-fixes

This commit is contained in:
Suraj Shetty 2022-02-03 16:31:32 +05:30 committed by GitHub
commit ed048b97ea
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 40 additions and 7 deletions

View file

@ -17,7 +17,7 @@ import frappe
from frappe.utils import ceil, evaluate_filters, floor, format_timedelta
from frappe.utils import get_url, money_in_words, parse_timedelta, scrub_urls
from frappe.utils import validate_email_address, validate_url
from frappe.utils.data import cast, validate_python_code
from frappe.utils.data import cast, get_time, get_timedelta, nowtime, now_datetime, validate_python_code
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
@ -334,6 +334,32 @@ class TestDateUtils(unittest.TestCase):
self.assertEqual(frappe.utils.get_last_day_of_week("2020-12-28"),
frappe.utils.getdate("2021-01-02"))
def test_get_time(self):
datetime_input = now_datetime()
timedelta_input = get_timedelta()
time_input = nowtime()
self.assertIsInstance(get_time(datetime_input), time)
self.assertIsInstance(get_time(timedelta_input), time)
self.assertIsInstance(get_time(time_input), time)
self.assertIsInstance(get_time("100:2:12"), time)
self.assertIsInstance(get_time(str(datetime_input)), time)
self.assertIsInstance(get_time(str(timedelta_input)), time)
self.assertIsInstance(get_time(str(time_input)), time)
def test_get_timedelta(self):
datetime_input = now_datetime()
timedelta_input = get_timedelta()
time_input = nowtime()
self.assertIsInstance(get_timedelta(), timedelta)
self.assertIsInstance(get_timedelta("100:2:12"), timedelta)
self.assertIsInstance(get_timedelta("17:21:00"), timedelta)
self.assertIsInstance(get_timedelta("2012-01-19 17:21:00"), timedelta)
self.assertIsInstance(get_timedelta(str(datetime_input)), timedelta)
self.assertIsInstance(get_timedelta(str(timedelta_input)), timedelta)
self.assertIsInstance(get_timedelta(str(time_input)), timedelta)
class TestResponse(unittest.TestCase):
def test_json_handler(self):
class TEST(Enum):

View file

@ -112,9 +112,9 @@ def get_timedelta(time: Optional[str] = None) -> Optional[datetime.timedelta]:
try:
t = parser.parse(time)
except ParserError as e:
if "day" in e.args[1]:
from frappe.utils import parse_timedelta
if "day" in e.args[1] or "hour must be in" in e.args[0]:
return parse_timedelta(time)
raise e
return datetime.timedelta(
hours=t.hour, minutes=t.minute, seconds=t.second, microseconds=t.microsecond
)
@ -329,17 +329,24 @@ def get_year_ending(date):
# last day of this month
return add_to_date(date, days=-1)
def get_time(time_str):
def get_time(time_str: str) -> datetime.time:
from dateutil import parser
from dateutil.parser import ParserError
if isinstance(time_str, datetime.datetime):
return time_str.time()
elif isinstance(time_str, datetime.time):
return time_str
else:
if isinstance(time_str, datetime.timedelta):
return format_timedelta(time_str)
elif isinstance(time_str, datetime.timedelta):
return (datetime.datetime.min + time_str).time()
try:
return parser.parse(time_str).time()
except ParserError as e:
if "day" in e.args[1] or "hour must be in" in e.args[0]:
return (
datetime.datetime.min + parse_timedelta(time_str)
).time()
raise e
def get_datetime_str(datetime_obj):
if isinstance(datetime_obj, str):