Fixed #22486 -- Restored the ability to reverse views created using functools.partial.
Regression in 8b93b31487
.
Thanks rcoup for the report.
This commit is contained in:
parent
c3152e5bcd
commit
3c06b2f2a3
|
@ -8,6 +8,7 @@ a string) and returns a tuple in this format:
|
||||||
"""
|
"""
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import functools
|
||||||
from importlib import import_module
|
from importlib import import_module
|
||||||
import re
|
import re
|
||||||
from threading import local
|
from threading import local
|
||||||
|
@ -270,6 +271,9 @@ class RegexURLResolver(LocaleRegexProvider):
|
||||||
self._callback_strs.add(pattern._callback_str)
|
self._callback_strs.add(pattern._callback_str)
|
||||||
elif hasattr(pattern, '_callback'):
|
elif hasattr(pattern, '_callback'):
|
||||||
callback = pattern._callback
|
callback = pattern._callback
|
||||||
|
if isinstance(callback, functools.partial):
|
||||||
|
callback = callback.func
|
||||||
|
|
||||||
if not hasattr(callback, '__name__'):
|
if not hasattr(callback, '__name__'):
|
||||||
lookup_str = callback.__module__ + "." + callback.__class__.__name__
|
lookup_str = callback.__module__ + "." + callback.__class__.__name__
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -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>`_)
|
|
@ -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>`_)
|
|
@ -12,3 +12,7 @@ Bugfixes
|
||||||
* Added backwards compatibility support for the :mod:`django.contrib.messages`
|
* Added backwards compatibility support for the :mod:`django.contrib.messages`
|
||||||
cookie format of Django 1.4 and earlier to facilitate upgrading to 1.6 from
|
cookie format of Django 1.4 and earlier to facilitate upgrading to 1.6 from
|
||||||
1.4 (`#22426 <http://code.djangoproject.com/ticket/22426>`_).
|
1.4 (`#22426 <http://code.djangoproject.com/ticket/22426>`_).
|
||||||
|
|
||||||
|
* Restored the ability to :meth:`~django.core.urlresolvers.reverse` views
|
||||||
|
created using :func:`functools.partial()`
|
||||||
|
(`#22486 <http://code.djangoproject.com/ticket/22486>`_)
|
||||||
|
|
|
@ -47,6 +47,7 @@ Final releases
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 1
|
:maxdepth: 1
|
||||||
|
|
||||||
|
1.5.7
|
||||||
1.5.6
|
1.5.6
|
||||||
1.5.5
|
1.5.5
|
||||||
1.5.4
|
1.5.4
|
||||||
|
@ -60,6 +61,7 @@ Final releases
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 1
|
:maxdepth: 1
|
||||||
|
|
||||||
|
1.4.12
|
||||||
1.4.11
|
1.4.11
|
||||||
1.4.10
|
1.4.10
|
||||||
1.4.9
|
1.4.9
|
||||||
|
|
|
@ -2,7 +2,7 @@ import warnings
|
||||||
|
|
||||||
from django.conf.urls import patterns, url, include
|
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 = [
|
other_patterns = [
|
||||||
|
@ -54,6 +54,10 @@ with warnings.catch_warnings(record=True):
|
||||||
url(r'^outer-no-kwargs/([0-9]+)/', include('urlpatterns_reverse.included_no_kwargs_urls')),
|
url(r'^outer-no-kwargs/([0-9]+)/', include('urlpatterns_reverse.included_no_kwargs_urls')),
|
||||||
url('', include('urlpatterns_reverse.extra_urls')),
|
url('', include('urlpatterns_reverse.extra_urls')),
|
||||||
|
|
||||||
|
# Partials should be fine.
|
||||||
|
url(r'^partial/', empty_view_partial, name="partial"),
|
||||||
|
url(r'^partial_wrapped/', empty_view_wrapped, name="partial_wrapped"),
|
||||||
|
|
||||||
# This is non-reversible, but we shouldn't blow up when parsing it.
|
# This is non-reversible, but we shouldn't blow up when parsing it.
|
||||||
url(r'^(?:foo|bar)(\w+)/$', empty_view, name="disjunction"),
|
url(r'^(?:foo|bar)(\w+)/$', empty_view, name="disjunction"),
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
from functools import partial, update_wrapper
|
||||||
|
|
||||||
from django.http import HttpResponse
|
from django.http import HttpResponse
|
||||||
from django.views.generic import RedirectView
|
from django.views.generic import RedirectView
|
||||||
from django.core.urlresolvers import reverse_lazy
|
from django.core.urlresolvers import reverse_lazy
|
||||||
|
@ -55,3 +57,11 @@ def login_required_view(request):
|
||||||
|
|
||||||
def bad_view(request, *args, **kwargs):
|
def bad_view(request, *args, **kwargs):
|
||||||
raise ValueError("I don't think I'm getting good value for this view")
|
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,
|
||||||
|
)
|
||||||
|
|
Loading…
Reference in New Issue