diff --git a/django/utils/dateparse.py b/django/utils/dateparse.py index a3c760e8fb..30a96f818e 100644 --- a/django/utils/dateparse.py +++ b/django/utils/dateparse.py @@ -29,7 +29,7 @@ datetime_re = re.compile( standard_duration_re = re.compile( r'^' - r'(?:(?P-?\d+) )?' + r'(?:(?P-?\d+) (days?, )?)?' r'((?:(?P\d+):)(?=\d+:\d+))?' r'(?:(?P\d+):)?' r'(?P\d+)' diff --git a/docs/releases/1.8.3.txt b/docs/releases/1.8.3.txt index 78e6766872..2761f06271 100644 --- a/docs/releases/1.8.3.txt +++ b/docs/releases/1.8.3.txt @@ -40,3 +40,6 @@ Bugfixes * Fixed queryset pickling when using ``prefetch_related()`` after deleting objects (:ticket:`24831`). + +* Allowed using ``choices`` longer than 1 day with ``DurationField`` + (:ticket:`24897`). diff --git a/tests/utils_tests/test_dateparse.py b/tests/utils_tests/test_dateparse.py index 7d4767feb7..1a1111df21 100644 --- a/tests/utils_tests/test_dateparse.py +++ b/tests/utils_tests/test_dateparse.py @@ -51,6 +51,20 @@ class DateParseTests(unittest.TestCase): class DurationParseTests(unittest.TestCase): + + def test_parse_python_format(self): + timedeltas = [ + timedelta(days=4, minutes=15, seconds=30, milliseconds=100), # fractions of seconds + timedelta(hours=10, minutes=15, seconds=30), # hours, minutes, seconds + timedelta(days=4, minutes=15, seconds=30), # multiple days + timedelta(days=1, minutes=00, seconds=00), # single day + timedelta(days=-4, minutes=15, seconds=30), # negative durations + timedelta(minutes=15, seconds=30), # minute & seconds + timedelta(seconds=30), # seconds + ] + for delta in timedeltas: + self.assertEqual(parse_duration(format(delta)), delta) + def test_seconds(self): self.assertEqual(parse_duration('30'), timedelta(seconds=30))