Fixed #12049 - LazyObject-wrapped User breaks queries in template tags

Thanks to chipx86 for the report and patch.



git-svn-id: http://code.djangoproject.com/svn/django/trunk@11634 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Luke Plant 2009-10-19 21:13:22 +00:00
parent cb7a3262b5
commit 22be3d7612
2 changed files with 33 additions and 0 deletions

View file

@ -297,6 +297,11 @@ class SimpleLazyObject(LazyObject):
def __init__(self, func):
"""
Pass in a callable that returns the object to be wrapped.
If copies are made of the resulting SimpleLazyObject, which can happen
in various circumstances within Django, then you must ensure that the
callable can be safely run more than once and will return the same
value.
"""
self.__dict__['_setupfunc'] = func
# For some reason, we have to inline LazyObject.__init__ here to avoid
@ -307,5 +312,14 @@ class SimpleLazyObject(LazyObject):
if self._wrapped is None: self._setup()
return str(self._wrapped)
def __deepcopy__(self, memo):
if self._wrapped is None:
result = self.__class__(self._setupfunc)
memo[id(self)] = result
return result
else:
import copy
return copy.deepcopy(self._wrapped, memo)
def _setup(self):
self._wrapped = self._setupfunc()