[CMF-checkins] SVN: CMF/branches/1.5/C Issue 445: Work around possible bogus alias left by '_guessMethodAliases'.

Tres Seaver tseaver at palladion.com
Tue Jul 18 14:48:14 EDT 2006


Log message for revision 69188:
  Issue 445:  Work around possible bogus alias left by '_guessMethodAliases'.

Changed:
  U   CMF/branches/1.5/CHANGES.txt
  U   CMF/branches/1.5/CMFCore/PortalContent.py
  U   CMF/branches/1.5/CMFCore/tests/base/dummy.py
  U   CMF/branches/1.5/CMFCore/tests/test_PortalContent.py

-=-
Modified: CMF/branches/1.5/CHANGES.txt
===================================================================
--- CMF/branches/1.5/CHANGES.txt	2006-07-18 18:41:38 UTC (rev 69187)
+++ CMF/branches/1.5/CHANGES.txt	2006-07-18 18:48:12 UTC (rev 69188)
@@ -2,6 +2,10 @@
 
   Bug Fixes
 
+    - CMFCore.PortalContent:  '_guessAliases' may leave type information
+      with a default alias of '(Default)';  work around that case.
+      (http://www.zope.org/Collectors/CMF/445)
+
     - CMFCore.CatalogTool:  Removed import of LOG object from ZCatalog in
      favor of the new 'logger' pattern using Python's logging module.
 

Modified: CMF/branches/1.5/CMFCore/PortalContent.py
===================================================================
--- CMF/branches/1.5/CMFCore/PortalContent.py	2006-07-18 18:41:38 UTC (rev 69187)
+++ CMF/branches/1.5/CMFCore/PortalContent.py	2006-07-18 18:48:12 UTC (rev 69188)
@@ -97,7 +97,7 @@
         """
         ti = self.getTypeInfo()
         method_id = ti and ti.queryMethodID('(Default)', context=self)
-        if method_id:
+        if method_id and method_id!='(Default)':
             method = getattr(self, method_id)
         else:
             method = _getViewFor(self)

Modified: CMF/branches/1.5/CMFCore/tests/base/dummy.py
===================================================================
--- CMF/branches/1.5/CMFCore/tests/base/dummy.py	2006-07-18 18:41:38 UTC (rev 69187)
+++ CMF/branches/1.5/CMFCore/tests/base/dummy.py	2006-07-18 18:48:12 UTC (rev 69188)
@@ -59,7 +59,7 @@
         a page template.
         """
 
-        self.id = id
+        self.id = self._id = id
         self.title = title
         self._actions = {}
 
@@ -78,6 +78,31 @@
     def allowDiscussion(self):
         return False
 
+    def listActions(self, info=None, object=None):
+        rs = []
+        for k,v in self._actions.items():
+           rs.append( DummyAction( k,v ) )
+        return rs
+
+class DummyAction:
+
+    def __init__( self, id, target, permissions=() ):
+        self._id = id
+        self.target = target
+        self.permissions = permissions
+
+    def getId( self ):
+        return self._id
+
+    # can this be right? e.g. utils._getViewFor calls action
+    # attribute directly, which is not part of API but no other way
+    # to do it...
+    def action( self, context ):
+        return self.target
+
+    def getPermissions( self ):
+        return self.permissions
+
 class DummyContent( PortalContent, Item ):
     """
     A Dummy piece of PortalContent

Modified: CMF/branches/1.5/CMFCore/tests/test_PortalContent.py
===================================================================
--- CMF/branches/1.5/CMFCore/tests/test_PortalContent.py	2006-07-18 18:41:38 UTC (rev 69187)
+++ CMF/branches/1.5/CMFCore/tests/test_PortalContent.py	2006-07-18 18:48:12 UTC (rev 69188)
@@ -36,8 +36,11 @@
 from Products.CMFCore.tests.base.dummy import DummySite
 from Products.CMFCore.tests.base.dummy import DummyUserFolder
 from Products.CMFCore.tests.base.testcase import SecurityRequestTest
+from Products.CMFCore.tests.base.dummy import DummyTool
+from Products.CMFCore.tests.base.dummy import DummyContent
+from Products.CMFCore.tests.base.dummy import DummyObject
+from OFS.Folder import Folder
 
-
 class PortalContentTests(TestCase):
 
     def test_z2interfaces(self):
@@ -64,7 +67,43 @@
         verifyClass(IContentish, PortalContent)
         verifyClass(IDynamicType, PortalContent)
 
+    def _setupCallTests(self, aliases):
+        # root
+        root = Folder( 'root' )
 
+        # set up dummy type info with problematic double-default alias
+        root._setObject( 'portal_types', DummyTool() )
+        root.portal_types.view_actions = aliases
+
+        # dummy content and skin
+        root._setObject( 'dummycontent', DummyContent() )
+        root._setObject( 'dummy_view', DummyObject() )
+        return root.dummycontent
+
+    def test_DoubleDefaultAlias(self):
+        test_aliases = ( ('(Default)', '(Default)'),
+                         ('view', 'dummy_view'),
+                       )
+        ob = self._setupCallTests(test_aliases)
+        # in unfixed version fail here with AttributeError
+        # can end up with this arrangement using _getAliases though
+        # in fixed version, falls through to _getViewFor, which is BBB
+        self.assertEqual( ob(), 'dummy' )
+
+    def test_BlankDefaultAlias(self):
+        test_aliases = ( ('(Default)', ''),
+                         ('view', 'dummy_view'),
+                       )
+        ob = self._setupCallTests(test_aliases)
+        # blank default is BBB
+        self.assertEqual( ob(), 'dummy' )
+
+    def test_SpecificAlias(self):
+        test_aliases = ( ('(Default)', 'dummy_view'),
+                       )
+        ob = self._setupCallTests(test_aliases)
+        self.assertEqual( ob(), 'dummy' )
+
 class TestContentCopyPaste(SecurityRequestTest):
 
     # Tests related to http://www.zope.org/Collectors/CMF/205



More information about the CMF-checkins mailing list