MonthMixin.get_previous_month incorrect under certain conditions
|Reported by:||Mark Sundstrom||Owned by:||nobody|
|Cc:||Triage Stage:||Ready for checkin|
|Has patch:||yes||Needs documentation:||no|
|Needs tests:||no||Patch needs improvement:||no|
In the class-based generic views, MonthMixin.get_previous_month will give an incorrect result when allow_empty is False and there are no records that exist for the first day of the previous month.
For example, consider the Books model in the generic_views regression test cases, with 3 books with the pubdates:
/dates/books/2010/oct/ should return a context where previous_month is 2010-09-01
/dates/books/2010/nov/ should similarly return 2010-10-01
However, in the second case, 2010-09-01 is returned instead. This is because the date that is passed to the helper function, _get_next_prev_month, (i.e., naive_result), is 2010-10-01, and the subsequent database lookup is for a record before to that date. Hence, the existing record dated 2010-10-02, is skipped and the previous month is returned instead.
Changing MonthMixin.get_previous_month to instead pass in the last day of the previous month, instead of the first day, fixes this problem.
Test demonstrating the problem and a patch for django.views.generic.dates.py included. (patch fixes 3 typos also)