3
From b63ae5c60619a257ad57cf6043e71f681283e47b Mon Sep 17 00:00:00 2001
4
From: Preston Timmons <prestontimmons@gfa.org>
5
Date: Tue, 22 Apr 2014 20:19:46 +0000
6
Subject: [PATCH] Fixed #22486 -- Reverse raises AttributeError on partial
9
Create the lookup_str from the original function whenever a partial
10
is provided as an argument to a url pattern.
12
django/core/urlresolvers.py | 4 ++++
13
tests/urlpatterns_reverse/urls.py | 6 +++++-
14
tests/urlpatterns_reverse/views.py | 10 ++++++++++
15
3 files changed, 19 insertions(+), 1 deletion(-)
17
Index: python-django-1.5.4/django/core/urlresolvers.py
18
===================================================================
19
--- python-django-1.5.4.orig/django/core/urlresolvers.py 2014-04-22 23:11:17.740353457 -0400
20
+++ python-django-1.5.4/django/core/urlresolvers.py 2014-04-22 23:11:48.292353952 -0400
23
from __future__ import unicode_literals
27
from threading import local
30
self._callback_strs.add(pattern._callback_str)
31
elif hasattr(pattern, '_callback'):
32
callback = pattern._callback
33
+ if isinstance(callback, functools.partial):
34
+ callback = callback.func
36
if not hasattr(callback, '__name__'):
37
lookup_str = callback.__module__ + "." + callback.__class__.__name__
39
Index: python-django-1.5.4/tests/regressiontests/urlpatterns_reverse/urls.py
40
===================================================================
41
--- python-django-1.5.4.orig/tests/regressiontests/urlpatterns_reverse/urls.py 2014-04-22 23:11:17.740353457 -0400
42
+++ python-django-1.5.4/tests/regressiontests/urlpatterns_reverse/urls.py 2014-04-22 23:12:02.688354185 -0400
45
from django.conf.urls import patterns, url, include
47
-from .views import empty_view, absolute_kwargs_view
48
+from .views import empty_view, empty_view_partial, empty_view_wrapped, absolute_kwargs_view
51
other_patterns = patterns('',
53
include('regressiontests.urlpatterns_reverse.included_urls')),
54
url('', include('regressiontests.urlpatterns_reverse.extra_urls')),
56
+ # Partials should be fine.
57
+ url(r'^partial/', empty_view_partial, name="partial"),
58
+ url(r'^partial_wrapped/', empty_view_wrapped, name="partial_wrapped"),
60
# This is non-reversible, but we shouldn't blow up when parsing it.
61
url(r'^(?:foo|bar)(\w+)/$', empty_view, name="disjunction"),
63
Index: python-django-1.5.4/tests/regressiontests/urlpatterns_reverse/views.py
64
===================================================================
65
--- python-django-1.5.4.orig/tests/regressiontests/urlpatterns_reverse/views.py 2014-04-22 23:11:17.740353457 -0400
66
+++ python-django-1.5.4/tests/regressiontests/urlpatterns_reverse/views.py 2014-04-22 23:11:17.740353457 -0400
68
+from functools import partial, update_wrapper
70
from django.http import HttpResponse
71
from django.views.generic import RedirectView
72
from django.core.urlresolvers import reverse_lazy
75
def bad_view(request, *args, **kwargs):
76
raise ValueError("I don't think I'm getting good value for this view")
79
+empty_view_partial = partial(empty_view, template_name="template.html")
82
+empty_view_wrapped = update_wrapper(
83
+ partial(empty_view, template_name="template.html"), empty_view,