mirror of
				https://github.com/django/django.git
				synced 2025-10-30 17:16:10 +00:00 
			
		
		
		
	[1.6.x] Fixed #22486 -- Restored the ability to reverse views created using functools.partial.
Regression in8b93b31487. Thanks rcoup for the report. Backport of3c06b2f2a3from master
This commit is contained in:
		| @@ -8,6 +8,8 @@ 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 | ||||||
| import re | import re | ||||||
| from threading import local | from threading import local | ||||||
|  |  | ||||||
| @@ -268,6 +270,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: | ||||||
|   | |||||||
							
								
								
									
										14
									
								
								docs/releases/1.4.12.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								docs/releases/1.4.12.txt
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										14
									
								
								docs/releases/1.5.7.txt
									
									
									
									
									
										Normal 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>`_) | ||||||
| @@ -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>`_) | ||||||
|   | |||||||
| @@ -33,6 +33,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 | ||||||
| @@ -46,6 +47,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 @@ from __future__ import absolute_import | |||||||
|  |  | ||||||
| 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 = patterns('', | other_patterns = patterns('', | ||||||
| @@ -56,6 +56,10 @@ urlpatterns = patterns('', | |||||||
|     # 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"), | ||||||
|  |  | ||||||
|  |     # 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 |     # Regression views for #9038. See tests for more details | ||||||
|     url(r'arg_view/$', 'kwargs_view'), |     url(r'arg_view/$', 'kwargs_view'), | ||||||
|     url(r'arg_view/(?P<arg1>\d+)/$', 'kwargs_view'), |     url(r'arg_view/(?P<arg1>\d+)/$', 'kwargs_view'), | ||||||
|   | |||||||
| @@ -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 | ||||||
| @@ -45,3 +47,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, | ||||||
|  | ) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user