[Checkins] SVN: zope3org/trunk/src/zorg/ajax/page.py added a cookie storage for user preferences

Uwe Oestermeier uwe_oestermeier at iwm-kmrc.de
Mon Apr 24 11:52:21 EDT 2006


Log message for revision 67570:
  added a cookie storage for user preferences

Changed:
  U   zope3org/trunk/src/zorg/ajax/page.py

-=-
Modified: zope3org/trunk/src/zorg/ajax/page.py
===================================================================
--- zope3org/trunk/src/zorg/ajax/page.py	2006-04-24 14:33:57 UTC (rev 67569)
+++ zope3org/trunk/src/zorg/ajax/page.py	2006-04-24 15:52:20 UTC (rev 67570)
@@ -93,6 +93,9 @@
             session["storage"] = SettingsStorage()
         return session["storage"]
 
+    def getCookieStorage(self) :
+        """ Returns a cookie storage. """
+        return CookieStorage(self.request)
 
     def parameter(self, key, type=None, default=None, storage=None) :
         """ Extract parameter from request or storage. 
@@ -555,8 +558,62 @@
         
     def get(self, key, default=None) :
         return self.__settings__.get(key, default)
+
+
+class CookieStorage(object) :
+    """ A storage that holds key value pairs in the browser cookie. 
+    
+        The cookie has a default lifetime of one week. This deviates from
+        the Zope default which ends with the session. Use the SessionStorage
+        if you want this behavior or provide a max_age.
         
+        This implementation anticipates the actual storing and returns
+        the response cookie value if we a __setitem__ call was used
+        to modify the cookie:
+        
+        >>> request = TestRequest()
+        >>> storage = CookieStorage(request)
+        >>> storage.get('test', 42)
+        42
+        >>> storage['test'] = 43
+        >>> storage['test']
+        43
+        
+        Note that this implementation converts integers and floats
+        as expected albeit the internally used methods only work with strings.
+        
+    """
 
+    cookie_age = 60 * 60 * 24 * 7  # one week default
+    
+    def __init__(self, request, cookie_age=None) :
+        self.request = request
+        if cookie_age is not None :
+            self.cookie_age = cookie_age
+            
+    def save_eval(self, value) :
+        for type in int, float :
+            try :
+                return type(value)
+            except :
+                pass
+        return str(value)
+                
+    def __setitem__(self, key, value) :
+        if self.get(key) != value :
+            value = str(value)
+            self.request.response.setCookie(key, value, max_age=self.cookie_age)
+        
+    def __getitem__(self, key) :
+        if self.request.response.getCookie(key) :
+            return self.save_eval(self.request.response.getCookie(key)['value'])   
+        return self.save_eval(self.request.cookies.get(key))
+        
+    def get(self, key, default=None) :
+        return self.save_eval(self.request.cookies.get(key, default))
+
+
+
 def test_suite():
 
     from zorg.ajax.tests import ajaxSetUp, ajaxTearDown



More information about the Checkins mailing list