Fixed a regression on Python 2.6 caused by r11623
This might fix #12037, but I cannot reproduce that bug. Refs #12037 git-svn-id: http://code.djangoproject.com/svn/django/trunk@11625 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
c161bf21f0
commit
a2d8acbacd
|
@ -8,27 +8,7 @@ RequestContext.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.utils.functional import lazy, memoize, LazyObject
|
from django.utils.functional import lazy, memoize, SimpleLazyObject
|
||||||
|
|
||||||
class ContextLazyObject(LazyObject):
|
|
||||||
"""
|
|
||||||
A lazy object initialised from any function, useful for lazily
|
|
||||||
adding things to the Context.
|
|
||||||
|
|
||||||
Designed for compound objects of unknown type. For simple objects of known
|
|
||||||
type, use django.utils.functional.lazy.
|
|
||||||
"""
|
|
||||||
def __init__(self, func):
|
|
||||||
"""
|
|
||||||
Pass in a callable that returns the actual value to be used
|
|
||||||
"""
|
|
||||||
self.__dict__['_setupfunc'] = func
|
|
||||||
# For some reason, we have to inline LazyObject.__init__ here to avoid
|
|
||||||
# recursion
|
|
||||||
self._wrapped = None
|
|
||||||
|
|
||||||
def _setup(self):
|
|
||||||
self._wrapped = self._setupfunc()
|
|
||||||
|
|
||||||
def auth(request):
|
def auth(request):
|
||||||
"""
|
"""
|
||||||
|
@ -55,7 +35,7 @@ def auth(request):
|
||||||
return AnonymousUser()
|
return AnonymousUser()
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'user': ContextLazyObject(get_user),
|
'user': SimpleLazyObject(get_user),
|
||||||
'messages': lazy(memoize(lambda: get_user().get_and_delete_messages(), {}, 0), list)(),
|
'messages': lazy(memoize(lambda: get_user().get_and_delete_messages(), {}, 0), list)(),
|
||||||
'perms': lazy(lambda: PermWrapper(get_user()), PermWrapper)(),
|
'perms': lazy(lambda: PermWrapper(get_user()), PermWrapper)(),
|
||||||
}
|
}
|
||||||
|
|
|
@ -257,9 +257,8 @@ class LazyObject(object):
|
||||||
A wrapper for another class that can be used to delay instantiation of the
|
A wrapper for another class that can be used to delay instantiation of the
|
||||||
wrapped class.
|
wrapped class.
|
||||||
|
|
||||||
This is useful, for example, if the wrapped class needs to use Django
|
By subclassing, you have the opportunity to intercept and alter the
|
||||||
settings at creation time: we want to permit it to be imported without
|
instantiation. If you don't need to do that, use SimpleLazyObject.
|
||||||
accessing settings.
|
|
||||||
"""
|
"""
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self._wrapped = None
|
self._wrapped = None
|
||||||
|
@ -287,3 +286,26 @@ class LazyObject(object):
|
||||||
"""
|
"""
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
|
|
||||||
|
class SimpleLazyObject(LazyObject):
|
||||||
|
"""
|
||||||
|
A lazy object initialised from any function.
|
||||||
|
|
||||||
|
Designed for compound objects of unknown type. For builtins or objects of
|
||||||
|
known type, use django.utils.functional.lazy.
|
||||||
|
"""
|
||||||
|
def __init__(self, func):
|
||||||
|
"""
|
||||||
|
Pass in a callable that returns the object to be wrapped.
|
||||||
|
"""
|
||||||
|
self.__dict__['_setupfunc'] = func
|
||||||
|
# For some reason, we have to inline LazyObject.__init__ here to avoid
|
||||||
|
# recursion
|
||||||
|
self._wrapped = None
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
if self._wrapped is None: self._setup()
|
||||||
|
return str(self._wrapped)
|
||||||
|
|
||||||
|
def _setup(self):
|
||||||
|
self._wrapped = self._setupfunc()
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
unicode: {{ user }}
|
unicode: {{ user }}
|
||||||
id: {{ user.id }}
|
id: {{ user.id }}
|
||||||
username: {{ user.username }}
|
username: {{ user.username }}
|
||||||
|
url: {% url userpage user %}
|
||||||
|
|
|
@ -4,7 +4,7 @@ Tests for Django's bundled context processors.
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
|
from django.template import Template
|
||||||
|
|
||||||
class RequestContextProcessorTests(TestCase):
|
class RequestContextProcessorTests(TestCase):
|
||||||
"""
|
"""
|
||||||
|
@ -79,3 +79,5 @@ class AuthContextProcessorTests(TestCase):
|
||||||
self.assertContains(response, "unicode: super")
|
self.assertContains(response, "unicode: super")
|
||||||
self.assertContains(response, "id: 100")
|
self.assertContains(response, "id: 100")
|
||||||
self.assertContains(response, "username: super")
|
self.assertContains(response, "username: super")
|
||||||
|
# bug #12037 is tested by the {% url %} in the template:
|
||||||
|
self.assertContains(response, "url: /userpage/super/")
|
||||||
|
|
|
@ -10,4 +10,5 @@ urlpatterns = patterns('',
|
||||||
(r'^auth_processor_user/$', views.auth_processor_user),
|
(r'^auth_processor_user/$', views.auth_processor_user),
|
||||||
(r'^auth_processor_perms/$', views.auth_processor_perms),
|
(r'^auth_processor_perms/$', views.auth_processor_perms),
|
||||||
(r'^auth_processor_messages/$', views.auth_processor_messages),
|
(r'^auth_processor_messages/$', views.auth_processor_messages),
|
||||||
|
url(r'^userpage/(.+)/$', views.userpage, name="userpage"),
|
||||||
)
|
)
|
||||||
|
|
|
@ -32,3 +32,6 @@ def auth_processor_messages(request):
|
||||||
request.user.message_set.create(message="Message 1")
|
request.user.message_set.create(message="Message 1")
|
||||||
return render_to_response('context_processors/auth_attrs_messages.html',
|
return render_to_response('context_processors/auth_attrs_messages.html',
|
||||||
RequestContext(request, {}, processors=[context_processors.auth]))
|
RequestContext(request, {}, processors=[context_processors.auth]))
|
||||||
|
|
||||||
|
def userpage(request):
|
||||||
|
pass
|
||||||
|
|
Loading…
Reference in New Issue