From b1b9451c1a7a7a8d0109e88df1ac22754127413b Mon Sep 17 00:00:00 2001
From: Kazuhiko Shiozaki <kazuhiko@nexedi.com>
Date: Tue, 10 Sep 2013 15:25:54 +0200
Subject: [PATCH] do not store _marker value in cache, especially for the value
 where loads(dumps(x)) != x.

---
 product/ERP5Form/PreferenceTool.py | 13 +++++--------
 1 file changed, 5 insertions(+), 8 deletions(-)

diff --git a/product/ERP5Form/PreferenceTool.py b/product/ERP5Form/PreferenceTool.py
index edc34cba8f..2bc38ef635 100644
--- a/product/ERP5Form/PreferenceTool.py
+++ b/product/ERP5Form/PreferenceTool.py
@@ -66,7 +66,7 @@ class PreferenceMethod(Method):
     self._preference_cache_id = 'PreferenceTool.CachingMethod.%s' % attribute
 
   def __call__(self, instance, default=_marker, *args, **kw):
-    def _getPreference(*args, **kw):
+    def _getPreference(default, *args, **kw):
       # XXX: sql_catalog_id is passed when calling getPreferredArchive
       # This is inconsistent with regular accessor API, and indicates that
       # there is a design problem in current archive API.
@@ -78,17 +78,14 @@ class PreferenceMethod(Method):
         #     user to mask a non-null global value with a null value.
         if value not in (_marker, None, '', (), []):
           return value
-      return _marker
+      if default is _marker:
+        return self._preference_default
+      return default
     _getPreference = CachingMethod(_getPreference,
             id='%s.%s' % (self._preference_cache_id,
                           getSecurityManager().getUser().getId()),
             cache_factory='erp5_ui_short')
-    value = _getPreference(*args, **kw)
-    if value is not _marker:
-      return value
-    elif default is _marker:
-      return self._preference_default
-    return default
+    return _getPreference(default, *args, **kw)
 
 class PreferenceTool(BaseTool):
   """
-- 
2.30.9