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:
Luke Plant 2009-10-15 14:12:34 +00:00
parent c161bf21f0
commit a2d8acbacd
6 changed files with 35 additions and 26 deletions

View File

@ -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)(),
} }

View File

@ -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()

View File

@ -1,3 +1,4 @@
unicode: {{ user }} unicode: {{ user }}
id: {{ user.id }} id: {{ user.id }}
username: {{ user.username }} username: {{ user.username }}
url: {% url userpage user %}

View File

@ -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/")

View File

@ -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"),
) )

View File

@ -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