diff options
| author | starryrbs <1322096624@qq.com> | 2020-12-19 17:53:35 +0800 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2020-12-21 10:28:07 +0100 |
| commit | 2a76f4313423a3b91caade4fce71790630ef9152 (patch) | |
| tree | 591d0303011cb8d5f97d33a96b62663d9d4ea14d | |
| parent | 57d05f94c36fd88378e94470e13d1e1dc935748a (diff) | |
Fixed #32269 -- Fixed parse_duration() for negative days in ISO 8601 format.
| -rw-r--r-- | django/utils/dateparse.py | 2 | ||||
| -rw-r--r-- | tests/utils_tests/test_dateparse.py | 4 |
2 files changed, 6 insertions, 0 deletions
diff --git a/django/utils/dateparse.py b/django/utils/dateparse.py index 0945c0c761..e069f5df39 100644 --- a/django/utils/dateparse.py +++ b/django/utils/dateparse.py @@ -144,4 +144,6 @@ def parse_duration(value): kw['microseconds'] = '-' + kw['microseconds'] kw = {k: float(v.replace(',', '.')) for k, v in kw.items() if v is not None} days = datetime.timedelta(kw.pop('days', .0) or .0) + if match.re == iso8601_duration_re: + days *= sign return days + sign * datetime.timedelta(**kw) diff --git a/tests/utils_tests/test_dateparse.py b/tests/utils_tests/test_dateparse.py index 59dcab6b1c..0ecbe24847 100644 --- a/tests/utils_tests/test_dateparse.py +++ b/tests/utils_tests/test_dateparse.py @@ -135,8 +135,11 @@ class DurationParseTests(unittest.TestCase): ('P4M', None), ('P4W', None), ('P4D', timedelta(days=4)), + ('-P1D', timedelta(days=-1)), ('P0.5D', timedelta(hours=12)), ('P0,5D', timedelta(hours=12)), + ('-P0.5D', timedelta(hours=-12)), + ('-P0,5D', timedelta(hours=-12)), ('PT5H', timedelta(hours=5)), ('-PT5H', timedelta(hours=-5)), ('PT5M', timedelta(minutes=5)), @@ -147,6 +150,7 @@ class DurationParseTests(unittest.TestCase): ('PT0,000005S', timedelta(microseconds=5)), ('-PT0.000005S', timedelta(microseconds=-5)), ('-PT0,000005S', timedelta(microseconds=-5)), + ('-P4DT1H', timedelta(days=-4, hours=-1)), ) for source, expected in test_values: with self.subTest(source=source): |
