mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Fixed #28209 -- Made date-based generic views return a 404 rather than crash when given an out of range date.
This commit is contained in:
		| @@ -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.""" | ||||
|   | ||||
| @@ -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`). | ||||
|   | ||||
| @@ -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/") | ||||
|   | ||||
		Reference in New Issue
	
	Block a user