SVN: CMF/branches/1.6/C Issue 445: Work around possible bogus alias left by '_guessMethodAliases'.

Tres Seaver <[email protected]>
Newsgroups gmane.comp.web.zope.cmf.cvs
Message-ID <[email protected]>
Log message for revision 69189:
  Issue 445:  Work around possible bogus alias left by '_guessMethodAliases'.

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

-=-
Modified: CMF/branches/1.6/CHANGES.txt
===================================================================
--- CMF/branches/1.6/CHANGES.txt	2006-07-18 18:48:12 UTC (rev 69188)
+++ CMF/branches/1.6/CHANGES.txt	2006-07-18 18:48:28 UTC (rev 69189)
@@ -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)
+
     - standard_error_message.pt was out of sync with Zope.
       (http://www.zope.org/Collectors/Zope/2133)
 

Modified: CMF/branches/1.6/CMFCore/PortalContent.py
===================================================================
--- CMF/branches/1.6/CMFCore/PortalContent.py	2006-07-18 18:48:12 UTC (rev 69188)
+++ CMF/branches/1.6/CMFCore/PortalContent.py	2006-07-18 18:48:28 UTC (rev 69189)
@@ -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.6/CMFCore/tests/base/dummy.py
===================================================================
--- CMF/branches/1.6/CMFCore/tests/base/dummy.py	2006-07-18 18:48:12 UTC (rev 69188)
+++ CMF/branches/1.6/CMFCore/tests/base/dummy.py	2006-07-18 18:48:28 UTC (rev 69189)
@@ -80,6 +80,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.6/CMFCore/tests/test_PortalContent.py
===================================================================
--- CMF/branches/1.6/CMFCore/tests/test_PortalContent.py	2006-07-18 18:48:12 UTC (rev 69188)
+++ CMF/branches/1.6/CMFCore/tests/test_PortalContent.py	2006-07-18 18:48:28 UTC (rev 69189)
@@ -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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.