[Erp5-report] r38249 kazuhiko - in /erp5/trunk/products/ERP5Form: Tool/ dtml/ tests/

nobody at svn.erp5.org nobody at svn.erp5.org
Thu Sep 9 23:11:24 CEST 2010


Author: kazuhiko
Date: Thu Sep  9 23:11:24 2010
New Revision: 38249

URL: http://svn.erp5.org?rev=38249&view=rev
Log:
support unique selection for unique anonymous user using a different storage that should be volatile one like memcached. this feature is disabled by default.

Modified:
    erp5/trunk/products/ERP5Form/Tool/SelectionTool.py
    erp5/trunk/products/ERP5Form/dtml/SelectionTool_configure.dtml
    erp5/trunk/products/ERP5Form/tests/testSelectionTool.py

Modified: erp5/trunk/products/ERP5Form/Tool/SelectionTool.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Form/Tool/SelectionTool.py?rev=38249&r1=38248&r2=38249&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Form/Tool/SelectionTool.py [utf8] (original)
+++ erp5/trunk/products/ERP5Form/Tool/SelectionTool.py [utf8] Thu Sep  9 23:11:24 2010
@@ -43,6 +43,8 @@ from Products.ERP5Form.Selection import 
 from ZPublisher.HTTPRequest import FileUpload
 import md5
 import string, re
+from time import time
+from random import random
 from urlparse import urlsplit, urlunsplit
 from zLOG import LOG, INFO
 from Acquisition import aq_base
@@ -139,14 +141,19 @@ class SelectionTool( BaseTool, SimpleIte
       return storage_item_list
 
     security.declareProtected( ERP5Permissions.ManagePortal, 'setStorage')
-    def setStorage(self, value, RESPONSE=None):
+    def setStorage(self, storage, anonymous_storage=None, RESPONSE=None):
       """
         Set the storage of Selection Tool.
       """
-      if value in [item[1] for item in self.getStorageItemList()]:
-        self.storage = value
+      if storage in [item[1] for item in self.getStorageItemList()]:
+        self.storage = storage
       else:
-        raise ValueError, 'Given storage type (%s) is now supported.' % (value,)
+        raise ValueError, 'Given storage type (%s) is now supported.' % (storage,)
+      anonymous_storage = anonymous_storage or None
+      if anonymous_storage in [item[1] for item in self.getStorageItemList()] + [None]:
+        self.anonymous_storage = anonymous_storage
+      else:
+        raise ValueError, 'Given storage type (%s) is now supported.' % (anonymous_storage,)
       if RESPONSE is not None:
         RESPONSE.redirect('%s/manage_configure' % (self.absolute_url()))
 
@@ -167,6 +174,12 @@ class SelectionTool( BaseTool, SimpleIte
             storage = 'selection_data'
       return storage
 
+    security.declareProtected( ERP5Permissions.ManagePortal, 'getAnonymousStorage')
+    def getAnonymousStorage(self, default=None):
+      """return the selected storage
+      """
+      return getattr(aq_base(self), 'anonymous_storage', default)
+
     def _redirectToOriginalForm(self, REQUEST=None, form_id=None, dialog_id=None,
                                 query_string=None,
                                 no_reset=False, no_report_depth=False):
@@ -267,6 +280,9 @@ class SelectionTool( BaseTool, SimpleIte
       """
       if not selection_name:
         return
+      if self._isAnonymous():
+        self.REQUEST.response.setCookie('anonymous_uid',
+                                        self.REQUEST.get('anonymous_uid'))
       if selection_object != None:
         # Set the name so that this selection itself can get its own name.
         selection_object.edit(name=selection_name)
@@ -1365,9 +1381,19 @@ class SelectionTool( BaseTool, SimpleIte
       return SelectionTool.inheritedAttribute('_aq_dynamic')(self, name)
 
     def _getUserId(self):
-      return self.portal_membership.getAuthenticatedMember().getUserName()
-      # XXX It would be good to add somthing here
-      # So that 2 anonymous users do not share the same selection
+      tv = getTransactionalVariable(self)
+      user_id = tv.get('_user_id', None)
+      if user_id is not None:
+        return user_id
+      user_id = self.portal_membership.getAuthenticatedMember().getUserName()
+      if user_id == 'Anonymous User' and self.getAnonymousStorage() is not None:
+        anonymous_uid = self.REQUEST.get('anonymous_uid', None)
+        if anonymous_uid is None:
+          anonymous_uid = md5.new('%s.%s' % (time(), random())).hexdigest()
+          self.REQUEST['anonymous_uid'] = anonymous_uid
+        user_id = 'Anonymous:%s' % anonymous_uid
+      tv['_user_id'] = user_id
+      return user_id
 
     def getTemporarySelectionDict(self):
       """ Temporary selections are used in push/pop nested scope,
@@ -1432,9 +1458,16 @@ class SelectionTool( BaseTool, SimpleIte
       return list(set(self._getContainer().getSelectionNameList(user_id) + \
                       self.getTemporarySelectionDict().keys()))
 
+    def _isAnonymous(self):
+      return self.portal_membership.isAnonymousUser()
+
     def _getContainer(self):
-      container_id = '_v_selection_container'
-      storage = self.getStorage()
+      if self._isAnonymous():
+        container_id = '_v_anonymous_selection_container'
+        storage = self.getAnonymousStorage()
+      else:
+        container_id = '_v_selection_container'
+        storage = self.getStorage()
       container = getattr(aq_base(self), container_id, None)
       if container is None:
         if storage.startswith('portal_memcached/'):

Modified: erp5/trunk/products/ERP5Form/dtml/SelectionTool_configure.dtml
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Form/dtml/SelectionTool_configure.dtml?rev=38249&r1=38248&r2=38249&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Form/dtml/SelectionTool_configure.dtml [utf8] (original)
+++ erp5/trunk/products/ERP5Form/dtml/SelectionTool_configure.dtml [utf8] Thu Sep  9 23:11:24 2010
@@ -5,22 +5,12 @@
 <p>
   Selection Tool supports Memcached Tool and Persistent Mapping for its storage.
 </p>
-<div>
-  <dtml-let storage_item_list="getStorageItemList()">
-    <dtml-in prefix="store" name="storage_item_list">
-      <dtml-let storage="store_item[1]"
-                  storage_title="store_item[0]"
-                  selected="storage == getStorage()">
-        <dtml-if selected>
-          Current setting: <dtml-var storage_title html_quote>
-        </dtml-if>
-      </dtml-let>
-    </dtml-in>
-  </dtml-let>
-</div>
 
 <form action="setStorage" method="post">
-  <select name="value">
+  <h4>
+    Storage for logged-in users' Selection objects.
+  </h4>
+  <select name="storage">
     <dtml-let storage_item_list="getStorageItemList()">
       <dtml-in prefix="store" name="storage_item_list">
         <dtml-let storage="store_item[1]"
@@ -31,7 +21,27 @@
       </dtml-in>
     </dtml-let>
   </select>
-  <input type="submit" value="Change"/>
+  <h4>
+    Storage for anonymous users' Selection objects.
+  </h4>
+  <p>
+    You can specify another storage to store unique Selection objects for each anonymous user. If you select nothing here, the same Selection object will be shared for all anonymous users and will be stored in the storage selected above. Using a volatile storage (like memcached) is highly recommended.
+  </p>
+  <select name="anonymous_storage">
+    <option value="">&nbsp;</option>
+    <dtml-let storage_item_list="getStorageItemList()">
+      <dtml-in prefix="store" name="storage_item_list">
+        <dtml-let storage="store_item[1]"
+                  storage_title="store_item[0]"
+                  selected="storage == getAnonymousStorage() and 'selected' or ''">
+          <option value="&dtml-storage;" &dtml-selected;>&dtml-storage_title;</option>
+        </dtml-let>
+      </dtml-in>
+    </dtml-let>
+  </select>
+  <p>
+    <input type="submit" value="Change"/>
+  </p>
 </form>
 
 <dtml-var manage_page_footer>

Modified: erp5/trunk/products/ERP5Form/tests/testSelectionTool.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Form/tests/testSelectionTool.py?rev=38249&r1=38248&r2=38249&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Form/tests/testSelectionTool.py [utf8] (original)
+++ erp5/trunk/products/ERP5Form/tests/testSelectionTool.py [utf8] Thu Sep  9 23:11:24 2010
@@ -246,6 +246,7 @@ class TestSelectionPersistence(unittest.
     # find the current user name
     SelectionTool._getUserId_saved = SelectionTool._getUserId
     SelectionTool._getUserId = lambda self: 'user'
+    SelectionTool._isAnonymous = lambda self: 0
 
     self.db = ZODButil.makeDB()
     self.cnx = self.db.open()




More information about the Erp5-report mailing list