diff options
| author | Adit Biswas <adit.biswas@grofers.com> | 2017-05-16 00:26:30 +0530 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2017-05-30 13:20:35 -0400 |
| commit | c2eea61dff44b16caab04928d582b856c2b8b615 (patch) | |
| tree | 087948b919470ac88e81d2b5e8c63af10a925f05 | |
| parent | c61d1361d027a729d07d277879950ff133c19f4c (diff) | |
Fixed #28209 -- Made date-based generic views return a 404 rather than crash when given an out of range date.
| -rw-r--r-- | django/views/generic/dates.py | 15 | ||||
| -rw-r--r-- | docs/releases/1.11.2.txt | 3 | ||||
| -rw-r--r-- | tests/generic_views/test_dates.py | 12 |
3 files changed, 27 insertions, 3 deletions
diff --git a/django/views/generic/dates.py b/django/views/generic/dates.py index 2ec8aabf6a..3b55014e73 100644 --- a/django/views/generic/dates.py +++ b/django/views/generic/dates.py @@ -55,7 +55,10 @@ class YearMixin: The interval is defined by start date <= item date < next start date. """ - return date.replace(year=date.year + 1, month=1, day=1) + try: + return date.replace(year=date.year + 1, month=1, day=1) + except ValueError: + raise Http404(_("Date out of range")) def _get_current_year(self, date): """Return the start date of the current interval.""" @@ -102,7 +105,10 @@ class MonthMixin: The interval is defined by start date <= item date < next start date. """ if date.month == 12: - return date.replace(year=date.year + 1, month=1, day=1) + try: + return date.replace(year=date.year + 1, month=1, day=1) + except ValueError: + raise Http404(_("Date out of range")) else: return date.replace(month=date.month + 1, day=1) @@ -196,7 +202,10 @@ class WeekMixin: The interval is defined by start date <= item date < next start date. """ - return date + datetime.timedelta(days=7 - self._get_weekday(date)) + try: + return date + datetime.timedelta(days=7 - self._get_weekday(date)) + except OverflowError: + raise Http404(_("Date out of range")) def _get_current_week(self, date): """Return the start date of the current interval.""" diff --git a/docs/releases/1.11.2.txt b/docs/releases/1.11.2.txt index 99e82f75a0..ab7d04959f 100644 --- a/docs/releases/1.11.2.txt +++ b/docs/releases/1.11.2.txt @@ -44,3 +44,6 @@ Bugfixes invalid SQL (:ticket:`28199`). * Corrected detection of GDAL 2.1 on Windows (:ticket:`28181`). + +* Made date-based generic views return a 404 rather than crash when given an + out of range date (:ticket:`28209`). diff --git a/tests/generic_views/test_dates.py b/tests/generic_views/test_dates.py index bf462b44fb..454b9e5a1d 100644 --- a/tests/generic_views/test_dates.py +++ b/tests/generic_views/test_dates.py @@ -661,6 +661,18 @@ class DateDetailViewTests(TestDataMixin, TestCase): self.assertEqual(res.context['book'], b) self.assertTemplateUsed(res, 'generic_views/book_detail.html') + def test_year_out_of_range(self): + urls = [ + '/dates/books/9999/', + '/dates/books/9999/12/', + '/dates/books/9999/week/52/', + ] + for url in urls: + with self.subTest(url=url): + res = self.client.get(url) + self.assertEqual(res.status_code, 404) + self.assertEqual(res.context['exception'], 'Date out of range') + def test_invalid_url(self): with self.assertRaises(AttributeError): self.client.get("/dates/books/2008/oct/01/nopk/") |
