summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--django/core/urlresolvers.py5
-rw-r--r--docs/releases/1.4.12.txt14
-rw-r--r--docs/releases/1.5.7.txt14
-rw-r--r--docs/releases/1.6.4.txt4
-rw-r--r--docs/releases/index.txt2
-rw-r--r--tests/urlpatterns_reverse/urls.py6
-rw-r--r--tests/urlpatterns_reverse/views.py10
7 files changed, 54 insertions, 1 deletions
diff --git a/django/core/urlresolvers.py b/django/core/urlresolvers.py
index 2aba375077..cb5e3bc36d 100644
--- a/django/core/urlresolvers.py
+++ b/django/core/urlresolvers.py
@@ -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
@@ -268,6 +270,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:
diff --git a/docs/releases/1.4.12.txt b/docs/releases/1.4.12.txt
new file mode 100644
index 0000000000..561125a2d0
--- /dev/null
+++ b/docs/releases/1.4.12.txt
@@ -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>`_)
diff --git a/docs/releases/1.5.7.txt b/docs/releases/1.5.7.txt
new file mode 100644
index 0000000000..c6987e3e5b
--- /dev/null
+++ b/docs/releases/1.5.7.txt
@@ -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>`_)
diff --git a/docs/releases/1.6.4.txt b/docs/releases/1.6.4.txt
index 6bf0b6fef0..fd36b21271 100644
--- a/docs/releases/1.6.4.txt
+++ b/docs/releases/1.6.4.txt
@@ -12,3 +12,7 @@ Bugfixes
* 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
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>`_)
diff --git a/docs/releases/index.txt b/docs/releases/index.txt
index 2a2c27b168..e6a8b17932 100644
--- a/docs/releases/index.txt
+++ b/docs/releases/index.txt
@@ -33,6 +33,7 @@ Final releases
.. toctree::
:maxdepth: 1
+ 1.5.7
1.5.6
1.5.5
1.5.4
@@ -46,6 +47,7 @@ Final releases
.. toctree::
:maxdepth: 1
+ 1.4.12
1.4.11
1.4.10
1.4.9
diff --git a/tests/urlpatterns_reverse/urls.py b/tests/urlpatterns_reverse/urls.py
index 0412f258ac..ac112c69cb 100644
--- a/tests/urlpatterns_reverse/urls.py
+++ b/tests/urlpatterns_reverse/urls.py
@@ -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'),
diff --git a/tests/urlpatterns_reverse/views.py b/tests/urlpatterns_reverse/views.py
index f8148e1f3e..dd1d97c700 100644
--- a/tests/urlpatterns_reverse/views.py
+++ b/tests/urlpatterns_reverse/views.py
@@ -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,
+)