[1.5.x] Fixed #22486 -- Restored the ability to reverse views created using functools.partial.

Regression in 8b93b31487.

Thanks rcoup for the report.

Backport of 3c06b2f2a3 from master
This commit is contained in:
Tim Graham 2014-04-23 08:49:12 -04:00
parent 2d450cc3e5
commit 19bd6b9477
6 changed files with 50 additions and 1 deletions

View File

@ -8,6 +8,8 @@ a string) and returns a tuple in this format:
"""
from __future__ import unicode_literals
import functools
from importlib import import_module
import re
from threading import local
@ -269,6 +271,9 @@ class RegexURLResolver(LocaleRegexProvider):
self._callback_strs.add(pattern._callback_str)
elif hasattr(pattern, '_callback'):
callback = pattern._callback
if isinstance(callback, functools.partial):
callback = callback.func
if not hasattr(callback, '__name__'):
lookup_str = callback.__module__ + "." + callback.__class__.__name__
else:

14
docs/releases/1.4.12.txt Normal file
View File

@ -0,0 +1,14 @@
===========================
Django 1.4.12 release notes
===========================
*Under development*
Django 1.4.12 fixes a regression in the 1.4.11 security release.
Bugfixes
========
* Restored the ability to :meth:`~django.core.urlresolvers.reverse` views
created using :func:`functools.partial()`
(`#22486 <http://code.djangoproject.com/ticket/22486>`_)

14
docs/releases/1.5.7.txt Normal file
View File

@ -0,0 +1,14 @@
==========================
Django 1.5.7 release notes
==========================
*Under development*
Django 1.5.7 fixes a regression in the 1.5.6 security release.
Bugfixes
========
* Restored the ability to :meth:`~django.core.urlresolvers.reverse` views
created using :func:`functools.partial()`
(`#22486 <http://code.djangoproject.com/ticket/22486>`_)

View File

@ -22,6 +22,7 @@ Final releases
.. toctree::
:maxdepth: 1
1.5.7
1.5.6
1.5.5
1.5.4
@ -35,6 +36,7 @@ Final releases
.. toctree::
:maxdepth: 1
1.4.12
1.4.11
1.4.10
1.4.9

View File

@ -2,7 +2,7 @@ from __future__ import absolute_import
from django.conf.urls import patterns, url, include
from .views import empty_view, absolute_kwargs_view
from .views import empty_view, empty_view_partial, empty_view_wrapped, absolute_kwargs_view
other_patterns = patterns('',
@ -56,6 +56,10 @@ urlpatterns = patterns('',
# This is non-reversible, but we shouldn't blow up when parsing it.
url(r'^(?:foo|bar)(\w+)/$', empty_view, name="disjunction"),
# Partials should be fine.
url(r'^partial/', empty_view_partial, name="partial"),
url(r'^partial_wrapped/', empty_view_wrapped, name="partial_wrapped"),
# Regression views for #9038. See tests for more details
url(r'arg_view/$', 'kwargs_view'),
url(r'arg_view/(?P<arg1>\d+)/$', 'kwargs_view'),

View File

@ -1,3 +1,5 @@
from functools import partial, update_wrapper
from django.http import HttpResponse
from django.views.generic import RedirectView
from django.core.urlresolvers import reverse_lazy
@ -45,3 +47,11 @@ def login_required_view(request):
def bad_view(request, *args, **kwargs):
raise ValueError("I don't think I'm getting good value for this view")
empty_view_partial = partial(empty_view, template_name="template.html")
empty_view_wrapped = update_wrapper(
partial(empty_view, template_name="template.html"), empty_view,
)