From 6cc0c3887ca1c43650f49d16916ac0d9862ce61f Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Mon, 13 Apr 2009 13:23:03 +0000 Subject: [PATCH] Fixed #10458 -- Corrected the `next_month` and `previous_month` context variables provided with the generic month_archive view. The value returned now matches the docstring and the generic views documentation. Thanks to fperetti for the report and initial patch. git-svn-id: http://code.djangoproject.com/svn/django/trunk@10556 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/views/generic/date_based.py | 18 ++++++++++----- .../views/tests/generic/date_based.py | 23 ++++++++++++++++++- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/django/views/generic/date_based.py b/django/views/generic/date_based.py index 5807e79573..d2829477a8 100644 --- a/django/views/generic/date_based.py +++ b/django/views/generic/date_based.py @@ -144,12 +144,18 @@ def archive_month(request, year, month, queryset, date_field, # Calculate the next month, if applicable. if allow_future: - next_month = last_day + datetime.timedelta(days=1) - elif last_day < datetime.date.today(): - next_month = last_day + datetime.timedelta(days=1) + next_month = last_day + elif last_day <= datetime.date.today(): + next_month = last_day else: next_month = None + # Calculate the previous month + if first_day.month == 1: + previous_month = first_day.replace(year=first_day.year-1,month=12) + else: + previous_month = first_day.replace(month=first_day.month-1) + if not template_name: template_name = "%s/%s_archive_month.html" % (model._meta.app_label, model._meta.object_name.lower()) t = template_loader.get_template(template_name) @@ -157,7 +163,7 @@ def archive_month(request, year, month, queryset, date_field, '%s_list' % template_object_name: object_list, 'month': date, 'next_month': next_month, - 'previous_month': first_day - datetime.timedelta(days=1), + 'previous_month': previous_month, }, context_processors) for key, value in extra_context.items(): if callable(value): @@ -239,7 +245,7 @@ def archive_day(request, year, month, day, queryset, date_field, """ if extra_context is None: extra_context = {} try: - tt = time.strptime('%s-%s-%s' % (year, month, day), + tt = time.strptime('%s-%s-%s' % (year, month, day), '%s-%s-%s' % ('%Y', month_format, day_format)) date = datetime.date(*tt[:3]) except ValueError: @@ -311,7 +317,7 @@ def object_detail(request, year, month, day, queryset, date_field, """ if extra_context is None: extra_context = {} try: - tt = time.strptime('%s-%s-%s' % (year, month, day), + tt = time.strptime('%s-%s-%s' % (year, month, day), '%s-%s-%s' % ('%Y', month_format, day_format)) date = datetime.date(*tt[:3]) except ValueError: diff --git a/tests/regressiontests/views/tests/generic/date_based.py b/tests/regressiontests/views/tests/generic/date_based.py index 1ec55c89f4..e0bae28ed0 100644 --- a/tests/regressiontests/views/tests/generic/date_based.py +++ b/tests/regressiontests/views/tests/generic/date_based.py @@ -1,6 +1,6 @@ # coding: utf-8 from django.test import TestCase -from datetime import datetime +from datetime import datetime, date from datetime import timedelta from regressiontests.views.models import Article, Author, DateArticle @@ -52,6 +52,8 @@ class MonthArchiveTest(TestCase): article.save() response = self.client.get('/views/date_based/archive_month/2004/02/') self.assertEqual(response.status_code, 200) + self.assertEqual(response.context['next_month'], date(2004, 3, 1)) + self.assertEqual(response.context['previous_month'], date(2004, 1, 1)) article.date_created = first_second_of_feb-two_seconds article.save() @@ -62,6 +64,8 @@ class MonthArchiveTest(TestCase): article.save() response = self.client.get('/views/date_based/archive_month/2004/02/') self.assertEqual(response.status_code, 200) + self.assertEqual(response.context['next_month'], date(2004, 3, 1)) + self.assertEqual(response.context['previous_month'], date(2004, 1, 1)) article.date_created = first_second_of_mar article.save() @@ -74,6 +78,8 @@ class MonthArchiveTest(TestCase): article2.save() response = self.client.get('/views/date_based/datefield/archive_month/2004/02/') self.assertEqual(response.status_code, 200) + self.assertEqual(response.context['next_month'], date(2004, 3, 1)) + self.assertEqual(response.context['previous_month'], date(2004, 1, 1)) article2.date_created = (first_second_of_feb-two_seconds).date() article2.save() @@ -84,12 +90,27 @@ class MonthArchiveTest(TestCase): article2.save() response = self.client.get('/views/date_based/datefield/archive_month/2004/02/') self.assertEqual(response.status_code, 200) + self.assertEqual(response.context['next_month'], date(2004, 3, 1)) + self.assertEqual(response.context['previous_month'], date(2004, 1, 1)) article2.date_created = first_second_of_mar.date() article2.save() response = self.client.get('/views/date_based/datefield/archive_month/2004/02/') self.assertEqual(response.status_code, 404) + now = datetime.now() + prev_month = now.date().replace(day=1) + if prev_month.month == 11: + prev_month = prev_month.replace(year=prev_month.year-1, month=12) + else: + prev_month = prev_month.replace(month=prev_month.month-1) + article2.date_created = now + article2.save() + response = self.client.get('/views/date_based/datefield/archive_month/%s/' % now.strftime('%Y/%m')) + self.assertEqual(response.status_code, 200) + self.assertEqual(response.context['next_month'], None) + self.assertEqual(response.context['previous_month'], prev_month) + class DayArchiveTests(TestCase): def test_year_month_day_format(self):