[Erp5-report] r21613 - in /erp5/trunk/products/CMFCategory: ./ tests/

nobody at svn.erp5.org nobody at svn.erp5.org
Mon Jun 16 13:48:32 CEST 2008


Author: jerome
Date: Mon Jun 16 13:48:28 2008
New Revision: 21613

URL: http://svn.erp5.org?rev=21613&view=rev
Log:
Some categories can have different security, so getCategoryChildItemList cache
should take username into account when caching categories.
For optimisation, do this only when checked_permission is passed.


Modified:
    erp5/trunk/products/CMFCategory/Category.py
    erp5/trunk/products/CMFCategory/tests/testCMFCategory.py

Modified: erp5/trunk/products/CMFCategory/Category.py
URL: http://svn.erp5.org/erp5/trunk/products/CMFCategory/Category.py?rev=21613&r1=21612&r2=21613&view=diff
==============================================================================
--- erp5/trunk/products/CMFCategory/Category.py (original)
+++ erp5/trunk/products/CMFCategory/Category.py Mon Jun 16 13:48:28 2008
@@ -30,6 +30,7 @@
 
 from Globals import InitializeClass, DTMLFile
 from AccessControl import ClassSecurityInfo
+from AccessControl import getSecurityManager
 from Acquisition import aq_base, aq_inner, aq_parent
 from Products.CMFCore.utils import getToolByName
 
@@ -528,13 +529,20 @@
       if not cache:
         return _renderCategoryChildItemList(
                       recursive=recursive, base=base, **kw)
-
+      
+      # If checked_permission is specified, we include the username in the
+      # cache key
+      username = None
+      if 'checked_permission' in kw:
+        username = str(getSecurityManager().getUser())
+        
       # Some methods are language dependent so we include the language in the
       # key
       localizer = getToolByName(self, 'Localizer')
       language = localizer.get_selected_language()
       m = CachingMethod(_renderCategoryChildItemList,
-            ('Category_getCategoryChildItemList', language, self.getPath()),
+            ('Category_getCategoryChildItemList', language,
+              self.getPath(), username),
             cache_factory=cache)
 
       return m(recursive=recursive, base=base, **kw)

Modified: erp5/trunk/products/CMFCategory/tests/testCMFCategory.py
URL: http://svn.erp5.org/erp5/trunk/products/CMFCategory/tests/testCMFCategory.py?rev=21613&r1=21612&r2=21613&view=diff
==============================================================================
--- erp5/trunk/products/CMFCategory/tests/testCMFCategory.py (original)
+++ erp5/trunk/products/CMFCategory/tests/testCMFCategory.py Mon Jun 16 13:48:28 2008
@@ -30,6 +30,7 @@
 
 from Testing import ZopeTestCase
 from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
+from Testing.ZopeTestCase.PortalTestCase import PortalTestCase
 from AccessControl.SecurityManagement import newSecurityManager
 from AccessControl.SecurityManagement import noSecurityManager
 from Products.ERP5Type.Base import _aq_reset
@@ -1043,6 +1044,35 @@
       bc.getCategoryChildTitleItemList(checked_permission=checked_permission,
                                        cache=0))
 
+  def test_28b_getCategoryChildItemList_checked_permission_cache(self):
+    # getCategoryChildTitleItemList take into account user 
+    pc = self.getCategoriesTool()
+
+    bc_id = 'barfoo'
+    bc = pc.newContent(portal_type='Base Category', id=bc_id)
+    a = bc.newContent(portal_type='Category', id='1', title='A')
+    b = bc.newContent(portal_type='Category', id='2', title='B')
+    b1 = b.newContent(portal_type='Category', id='21', title='B1')
+
+    uf = self.getPortal().acl_users
+    uf._doAddUser('alice', '', ['Member', 'Manager', 'Assignor'], [])
+    uf._doAddUser('bob', '', ['Member'], [])
+    login = PortalTestCase.login
+
+    checked_permission = 'View'
+    
+    b.manage_permission(checked_permission, roles=['Assignor'], acquire=0)
+    login(self, 'alice')
+    self.assertEquals(
+      [['', ''], ['A', '1'], ['B', '2'], ['B1', '2/21']],
+      bc.getCategoryChildTitleItemList(checked_permission=checked_permission,))
+    
+    login(self, 'bob')
+    self.assertEquals(
+      [['', ''], ['A', '1']],
+      bc.getCategoryChildTitleItemList(checked_permission=checked_permission,))
+
+
   def test_29_renameBaseCategory(self):
     bc = self.portal.portal_categories.newContent(
                           portal_type='Base Category',




More information about the Erp5-report mailing list