[Erp5-report] r35109 jerome - in /erp5/trunk/products/ERP5Type: Tool/ interfaces/ tests/

nobody at svn.erp5.org nobody at svn.erp5.org
Fri May 7 14:32:14 CEST 2010


Author: jerome
Date: Fri May  7 14:32:13 2010
New Revision: 35109

URL: http://svn.erp5.org?rev=35109&view=rev
Log:
Extends Types Tool to support multiple types providers.
A type provider is a container for type informations, by default we only have
portal_types, but other types providers can be registered.


Added:
    erp5/trunk/products/ERP5Type/interfaces/types_tool.py
Modified:
    erp5/trunk/products/ERP5Type/Tool/TypesTool.py
    erp5/trunk/products/ERP5Type/interfaces/__init__.py
    erp5/trunk/products/ERP5Type/tests/testERP5Type.py

Modified: erp5/trunk/products/ERP5Type/Tool/TypesTool.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/Tool/TypesTool.py?rev=35109&r1=35108&r2=35109&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/Tool/TypesTool.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/Tool/TypesTool.py [utf8] Fri May  7 14:32:13 2010
@@ -21,14 +21,26 @@
 from AccessControl import ClassSecurityInfo
 from OFS.Folder import Folder as OFSFolder
 import transaction
-from Products.CMFCore import TypesTool as CMFCore_TypesTool
+from Products.CMFCore import TypesTool as CMFCore_TypesToolModule
 from Products.ERP5Type.Tool.BaseTool import BaseTool
 from Products.ERP5Type import Permissions
 from Products.ERP5Type.ERP5Type import ERP5TypeInformation
 from Products.ERP5Type.UnrestrictedMethod import UnrestrictedMethod
 from zLOG import LOG, WARNING, PANIC
-
-class TypesTool(BaseTool, CMFCore_TypesTool.TypesTool):
+from Products.ERP5Type.interfaces import ITypeProvider, ITypesTool
+
+
+CMFCore_TypesTool = CMFCore_TypesToolModule.TypesTool
+
+class TypeProvider(BaseTool, CMFCore_TypesTool):
+  """Provides portal content types
+  """
+  zope.interface.implements(ITypeProvider)
+
+
+_MARKER = []
+
+class TypesTool(TypeProvider):
   """Provides a configurable registry of portal content types
   """
   id = 'portal_types'
@@ -36,9 +48,40 @@
   portal_type = 'Types Tool'
   allowed_types = ()
 
+  zope.interface.implements(ITypesTool)
+
+  # TODO: UI to configure this is missing
+  type_provider_list = ( 'portal_types', )
+
   security = ClassSecurityInfo()
   security.declareObjectProtected(Permissions.AccessContentsInformation)
 
+  def listTypeInfo(self, container=None):
+    """List type information from all providers
+    """
+    listTypeInfo = CMFCore_TypesTool.listTypeInfo
+    type_info_list = []
+    for provider in self.type_provider_list:
+      provider_value = getattr(self, provider, None)
+      if provider_value is not None:
+        type_info_list.extend(
+            listTypeInfo(provider_value, container=container))
+    return type_info_list
+
+  def _getOb(self, id, default=_MARKER):
+    """Get a type information from a provider
+    """
+    _getOb = CMFCore_TypesTool._getOb
+    for provider in self.type_provider_list:
+      provider_value = getattr(self, provider, None)
+      if provider_value is not None:
+        ob = _getOb(provider_value, id, default=default)
+        if ob is not default:
+          return ob
+    if ob is _MARKER:
+      raise AttributeError, id
+    return ob
+    
   security.declarePrivate('getActionListFor')
   def getActionListFor(self, ob=None):
     """Return all actions applicable to the object"""
@@ -238,4 +281,6 @@
       return OFSFolder.__of__(self, parent)
     return UnrestrictedMethod(base_self._migrateTypesTool)(parent)
 
-CMFCore_TypesTool.TypesTool = OldTypesTool
+# Change the CMFCore's TypesTool to automatically migrate to ERP5Type's
+# TypesTool
+CMFCore_TypesToolModule.TypesTool = OldTypesTool

Modified: erp5/trunk/products/ERP5Type/interfaces/__init__.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/interfaces/__init__.py?rev=35109&r1=35108&r2=35109&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/interfaces/__init__.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/interfaces/__init__.py [utf8] Fri May  7 14:32:13 2010
@@ -10,3 +10,4 @@
 from value_access_provider import IValueAccessProvider
 from constraint import IConstraint
 from role_provider import ILocalRoleAssignor, ILocalRoleGenerator
+from types_tool import ITypesTool, ITypeProvider

Added: erp5/trunk/products/ERP5Type/interfaces/types_tool.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/interfaces/types_tool.py?rev=35109&view=auto
==============================================================================
--- erp5/trunk/products/ERP5Type/interfaces/types_tool.py (added)
+++ erp5/trunk/products/ERP5Type/interfaces/types_tool.py [utf8] Fri May  7 14:32:13 2010
@@ -1,0 +1,55 @@
+##############################################################################
+#
+# Copyright (c) 2010 Nexedi SARL and Contributors. All Rights Reserved.
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsability of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# guarantees and support are strongly advised to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#
+##############################################################################
+
+"""Types Tool Interfaces.
+"""
+
+from zope.interface import Interface
+from zope.interface import Attribute
+try:
+  from Products.CMFCore.interfaces import ITypesTool as ICMFCoreTypesTool
+except ImportError:
+  # on CMF 1.5, this interface is generated by Five, and is not available at
+  # this point
+  class ICMFCoreTypesTool(Interface):
+    pass
+    
+
+class ITypesTool(ICMFCoreTypesTool):
+  """ERP5Type's types tool.
+
+  ERP5Type's types tool extends CMF types tool, by looking up requested types
+  into registered types providers.
+  """
+  type_provider_list = Attribute('type_provider_list',
+                                 'List of ids of types providers')
+
+class ITypeProvider(ICMFCoreTypesTool):
+  """A type provider contains type information, and conforms to CMF's
+  TypesTool interface, especially listTypeInfo and getTypeInfo methods.
+  """
+

Modified: erp5/trunk/products/ERP5Type/tests/testERP5Type.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/tests/testERP5Type.py?rev=35109&r1=35108&r2=35109&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/tests/testERP5Type.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/tests/testERP5Type.py [utf8] Fri May  7 14:32:13 2010
@@ -147,13 +147,13 @@
       return str(randint(-10000000,100000000))
 
     def getTemplateTool(self):
-      return getattr(self.getPortal(), 'portal_templates', None)
+      return getattr(self.portal, 'portal_templates', None)
 
     def getCategoryTool(self):
-      return getattr(self.getPortal(), 'portal_categories', None)
+      return getattr(self.portal, 'portal_categories', None)
 
     def getTypeTool(self):
-      return getattr(self.getPortal(), 'portal_types', None)
+      return getattr(self.portal, 'portal_types', None)
 
     # Here are the tests
     def testHasTemplateTool(self):
@@ -2735,6 +2735,43 @@
       self.assertNotEquals(None, method)
       self.assertTrue(method())
 
+    def test_type_provider(self):
+      from Products.ERP5Type.Tool.TypesTool import TypeProvider
+      class DummyTypeProvider(TypeProvider):
+        id = 'dummy_type_provider'
+       # portal_type = 'Dummy Type Provider'
+      
+      self.portal._setObject('dummy_type_provider', DummyTypeProvider())
+      types_tool = self.portal.portal_types
+      # register our dummy type provider
+      types_tool.type_provider_list = types_tool.type_provider_list + (
+                                            'dummy_type_provider',)
+      
+      # types created in our type provider are available
+      dummy_type = self.portal.dummy_type_provider.newContent(
+              portal_type='Base Type',
+              id='Dummy Type',
+              type_factory_method_id='addFolder', )
+
+      # our type is available from types tool
+      self.assertNotEquals(None, types_tool.getTypeInfo('Dummy Type'))
+      self.assertTrue('Dummy Type' in [ti.getId() for ti in
+                                        types_tool.listTypeInfo()])
+
+      # not existing types are not an error
+      self.assertEquals(None, types_tool.getTypeInfo(self.id()))
+
+      # we can create instances from our type provider
+      container = self.portal.newContent(portal_type='Folder', id='test_folder')
+      dummy_instance = container.newContent(portal_type='Dummy Type')
+      
+      # and use generated accessors on them
+      dummy_type.edit(type_property_sheet_list=('Reference', ))
+
+      dummy_instance.setReference('test')
+      self.assertEquals('test', dummy_instance.getReference())
+
+
 class TestAccessControl(ERP5TypeTestCase):
   # Isolate test in a dedicaced class in order not to break other tests
   # when this one fails.




More information about the Erp5-report mailing list