From 99fc5dc13c12d874ffc1c8f47a6421494e720b31 Mon Sep 17 00:00:00 2001 From: Seunghun Lee Date: Sat, 16 Feb 2019 16:43:42 +0900 Subject: [PATCH] Fixed #30141 -- Fixed parse_duration() for some negative durations. --- django/utils/dateparse.py | 7 ++++--- tests/utils_tests/test_dateparse.py | 7 +++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/django/utils/dateparse.py b/django/utils/dateparse.py index 8d08b7d1d3..f90d952581 100644 --- a/django/utils/dateparse.py +++ b/django/utils/dateparse.py @@ -29,9 +29,10 @@ datetime_re = re.compile( standard_duration_re = re.compile( r'^' r'(?:(?P-?\d+) (days?, )?)?' - r'((?:(?P-?\d+):)(?=\d+:\d+))?' - r'(?:(?P-?\d+):)?' - r'(?P-?\d+)' + r'(?P-?)' + r'((?:(?P\d+):)(?=\d+:\d+))?' + r'(?:(?P\d+):)?' + r'(?P\d+)' r'(?:\.(?P\d{1,6})\d{0,6})?' r'$' ) diff --git a/tests/utils_tests/test_dateparse.py b/tests/utils_tests/test_dateparse.py index 8d464278ce..535815c7e2 100644 --- a/tests/utils_tests/test_dateparse.py +++ b/tests/utils_tests/test_dateparse.py @@ -113,9 +113,12 @@ class DurationParseTests(unittest.TestCase): test_values = ( ('-4 15:30', timedelta(days=-4, minutes=15, seconds=30)), ('-172800', timedelta(days=-2)), - ('-15:30', timedelta(minutes=-15, seconds=30)), - ('-1:15:30', timedelta(hours=-1, minutes=15, seconds=30)), + ('-15:30', timedelta(minutes=-15, seconds=-30)), + ('-1:15:30', timedelta(hours=-1, minutes=-15, seconds=-30)), ('-30.1', timedelta(seconds=-30, milliseconds=-100)), + ('-00:01:01', timedelta(minutes=-1, seconds=-1)), + ('-01:01', timedelta(seconds=-61)), + ('-01:-01', None), ) for source, expected in test_values: with self.subTest(source=source):