From 6582261519d17b56e40f56f59e8a3661b233da2e Mon Sep 17 00:00:00 2001
From: Kevin Deldycke <kevin@nexedi.com>
Date: Mon, 12 Jun 2006 14:58:52 +0000
Subject: [PATCH] Convert to 2-space indention

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@7703 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 product/ERP5/ERP5Site.py | 2042 +++++++++++++++++++-------------------
 1 file changed, 1021 insertions(+), 1021 deletions(-)

diff --git a/product/ERP5/ERP5Site.py b/product/ERP5/ERP5Site.py
index a8b017b4c7..e30bfe9e0e 100644
--- a/product/ERP5/ERP5Site.py
+++ b/product/ERP5/ERP5Site.py
@@ -10,14 +10,13 @@
 # FOR A PARTICULAR PURPOSE
 #
 ##############################################################################
-""" Portal class
-
-$Id$
+"""
+  Portal class
 """
 
 import Globals
 from Globals import package_home
-#from Products.ERP5 import content_classes
+
 from AccessControl import ClassSecurityInfo
 from Products.CMFDefault.Portal import CMFSite, PortalGenerator
 from Products.CMFCore.utils import getToolByName, _getAuthenticatedUser
@@ -57,1094 +56,1095 @@ def manage_addERP5Site(self, id, title='ERP5', description='',
                          cmf_activity_sql_connection_string='test test',
                          light_install=0,reindex=1,
                          RESPONSE=None):
-    '''
+  """
     Adds a portal instance.
-    '''
-    #LOG('manage_addERP5Site, create_activities',0,create_activities)
-    #LOG('manage_addERP5Site, create_activities==1',0,create_activities==1)
-    gen = ERP5Generator()
-    from string import strip
-    id = strip(id)
-    p = gen.create(self, id, create_userfolder,
-                   erp5_sql_connection_type,erp5_sql_connection_string,
-                   cmf_activity_sql_connection_type,cmf_activity_sql_connection_string,
-                   create_activities=create_activities,light_install=light_install,
-                   reindex=reindex)
-    gen.setupDefaultProperties(p, title, description,
-                               email_from_address, email_from_name,
-                               validate_email)
-    if RESPONSE is not None:
-        RESPONSE.redirect(p.absolute_url())
+  """
+  #LOG('manage_addERP5Site, create_activities',0,create_activities)
+  #LOG('manage_addERP5Site, create_activities==1',0,create_activities==1)
+  gen = ERP5Generator()
+  from string import strip
+  id = strip(id)
+  p = gen.create(self, id, create_userfolder,
+                  erp5_sql_connection_type,erp5_sql_connection_string,
+                  cmf_activity_sql_connection_type,cmf_activity_sql_connection_string,
+                  create_activities=create_activities,light_install=light_install,
+                  reindex=reindex)
+  gen.setupDefaultProperties(p, title, description,
+                              email_from_address, email_from_name,
+                              validate_email)
+  if RESPONSE is not None:
+      RESPONSE.redirect(p.absolute_url())
 
 class ERP5Site ( FolderMixIn, CMFSite ):
+  """
+    The *only* function this class should have is to help in the setup
+    of a new ERP5.  It should not assist in the functionality at all.
+  """
+  meta_type = 'ERP5 Site'
+  constructors = (manage_addERP5SiteForm, manage_addERP5Site, )
+  uid = 0
+  last_id = 0
+  icon = 'portal.gif'
+
+  _properties = (
+      {'id':'title', 'type':'string'},
+      {'id':'description', 'type':'text'},
+      )
+  title = ''
+  description = ''
+
+  # Declarative security
+  security = ClassSecurityInfo()
+  security.declareObjectProtected(Permissions.AccessContentsInformation)
+
+  security.declareProtected(Permissions.View, 'view')
+  def view(self):
+      """
+        Returns the default view.
+        Implemented for consistency
+      """
+      return self.index_html()
+
+  def hasObject(self, id):
+    """Check if the portal has an id.
     """
-        The *only* function this class should have is to help in the setup
-        of a new ERP5.  It should not assist in the functionality at all.
-    """
-    meta_type = 'ERP5 Site'
-    constructors = (manage_addERP5SiteForm, manage_addERP5Site, )
-    uid = 0
-    last_id = 0
-    icon = 'portal.gif'
-
-    _properties = (
-        {'id':'title', 'type':'string'},
-        {'id':'description', 'type':'text'},
-        )
-    title = ''
-    description = ''
-
-    # Declarative security
-    security = ClassSecurityInfo()
-    security.declareObjectProtected(Permissions.AccessContentsInformation)
-
-    security.declareProtected(Permissions.View, 'view')
-    def view(self):
-        """
-          Returns the default view.
-          Implemented for consistency
-        """
-        return self.index_html()
-
-    def hasObject(self, id):
-      """Check if the portal has an id.
-      """
-      return id in self.objectIds()
+    return id in self.objectIds()
 
-    security.declareProtected(Permissions.AccessContentsInformation, 'getPortalObject')
-    def getPortalObject(self):
-      return self
+  security.declareProtected(Permissions.AccessContentsInformation, 'getPortalObject')
+  def getPortalObject(self):
+    return self
 
-    security.declareProtected(Permissions.AccessContentsInformation, 'getTitle')
-    def getTitle(self):
-      """
-        Return the title.
-      """
-      return self.title
+  security.declareProtected(Permissions.AccessContentsInformation, 'getTitle')
+  def getTitle(self):
+    """
+      Return the title.
+    """
+    return self.title
 
-    security.declareProtected(Permissions.AccessContentsInformation, 'getUid')
-    def getUid(self):
-      """
-        Returns the UID of the object. Eventually reindexes
-        the object in order to make sure there is a UID
-        (useful for import / export).
+  security.declareProtected(Permissions.AccessContentsInformation, 'getUid')
+  def getUid(self):
+    """
+      Returns the UID of the object. Eventually reindexes
+      the object in order to make sure there is a UID
+      (useful for import / export).
 
-        WARNING : must be updates for circular references issues
-      """
-      #if not hasattr(self, 'uid'):
-      #  self.reindexObject()
-      return getattr(self, 'uid', 0)
+      WARNING : must be updates for circular references issues
+    """
+    #if not hasattr(self, 'uid'):
+    #  self.reindexObject()
+    return getattr(self, 'uid', 0)
 
-    security.declareProtected(Permissions.AccessContentsInformation, 'getParentUid')
-    def getParentUid(self):
-      """
-        A portal has no parent
-      """
-      return self.getUid()
+  security.declareProtected(Permissions.AccessContentsInformation, 'getParentUid')
+  def getParentUid(self):
+    """
+      A portal has no parent
+    """
+    return self.getUid()
 
-    # Required to allow content creation outside folders
-    security.declareProtected(Permissions.View, 'getIdGroup')
-    def getIdGroup(self):
-      return None
+  # Required to allow content creation outside folders
+  security.declareProtected(Permissions.View, 'getIdGroup')
+  def getIdGroup(self):
+    return None
 
-    # Required to allow content creation outside folders
-    security.declareProtected(Permissions.ModifyPortalContent, 'setLastId')
-    def setLastId(self, id):
-      self.last_id = id
+  # Required to allow content creation outside folders
+  security.declareProtected(Permissions.ModifyPortalContent, 'setLastId')
+  def setLastId(self, id):
+    self.last_id = id
 
-    security.declareProtected(Permissions.AccessContentsInformation, 'getPath')
-    def getPath(self, REQUEST=None):
-      """
-        Returns the absolute path of an object
-      """
-      return join(self.getPhysicalPath(),'/')
+  security.declareProtected(Permissions.AccessContentsInformation, 'getPath')
+  def getPath(self, REQUEST=None):
+    """
+      Returns the absolute path of an object
+    """
+    return join(self.getPhysicalPath(),'/')
 
-    security.declareProtected(Permissions.AccessContentsInformation, 'searchFolder')
-    def searchFolder(self, **kw):
-      """
-        Search the content of a folder by calling
-        the portal_catalog.
-      """
-      if not kw.has_key('parent_uid'):
-        kw['parent_uid'] = self.uid
-      kw2 = {}
-      # Remove useless matter before calling the
-      # catalog. In particular, consider empty
-      # strings as None values
-      for cname in kw.keys():
-        if kw[cname] != '' and kw[cname]!=None:
-          kw2[cname] = kw[cname]
-      # The method to call to search the folder
-      # content has to be called z_search_folder
-      method = self.portal_catalog.searchResults
-      return method(**kw2)
-
-    security.declareProtected(Permissions.AccessContentsInformation, 'countFolder')
-    def countFolder(self, **kw):
-      """
-        Count the content of a folder by calling
-        the portal_catalog.
-      """
-      if not kw.has_key('parent_uid'):
-        kw['parent_uid'] = self.uid
-      kw2 = {}
-      # Remove useless matter before calling the
-      # catalog. In particular, consider empty
-      # strings as None values
-      for cname in kw.keys():
-        if kw[cname] != '' and kw[cname]!=None:
-          kw2[cname] = kw[cname]
-      # The method to call to search the folder
-      # content has to be called z_search_folder
-      method = self.portal_catalog.countResults
-      return method(**kw2)
-
-    # Proxy methods for security reasons
-    def getOwnerInfo(self):
-      return self.owner_info()
-
-    # Make sure fixConsistency is recursive - ERROR - this creates recursion errors
-    # checkConsistency = Folder.checkConsistency
-    # fixConsistency = Folder.fixConsistency
-
-    security.declarePublic('getOrderedGlobalActionList')
-    def getOrderedGlobalActionList(self, action_list):
-      """
-      Returns a dictionnary of actions, sorted by type of object
+  security.declareProtected(Permissions.AccessContentsInformation, 'searchFolder')
+  def searchFolder(self, **kw):
+    """
+      Search the content of a folder by calling
+      the portal_catalog.
+    """
+    if not kw.has_key('parent_uid'):
+      kw['parent_uid'] = self.uid
+    kw2 = {}
+    # Remove useless matter before calling the
+    # catalog. In particular, consider empty
+    # strings as None values
+    for cname in kw.keys():
+      if kw[cname] != '' and kw[cname]!=None:
+        kw2[cname] = kw[cname]
+    # The method to call to search the folder
+    # content has to be called z_search_folder
+    method = self.portal_catalog.searchResults
+    return method(**kw2)
+
+  security.declareProtected(Permissions.AccessContentsInformation, 'countFolder')
+  def countFolder(self, **kw):
+    """
+      Count the content of a folder by calling
+      the portal_catalog.
+    """
+    if not kw.has_key('parent_uid'):
+      kw['parent_uid'] = self.uid
+    kw2 = {}
+    # Remove useless matter before calling the
+    # catalog. In particular, consider empty
+    # strings as None values
+    for cname in kw.keys():
+      if kw[cname] != '' and kw[cname]!=None:
+        kw2[cname] = kw[cname]
+    # The method to call to search the folder
+    # content has to be called z_search_folder
+    method = self.portal_catalog.countResults
+    return method(**kw2)
+
+  # Proxy methods for security reasons
+  def getOwnerInfo(self):
+    return self.owner_info()
+
+  # Make sure fixConsistency is recursive - ERROR - this creates recursion errors
+  # checkConsistency = Folder.checkConsistency
+  # fixConsistency = Folder.fixConsistency
+
+  security.declarePublic('getOrderedGlobalActionList')
+  def getOrderedGlobalActionList(self, action_list):
+    """
+    Returns a dictionnary of actions, sorted by type of object
 
-      This should absolutely be rewritten by using clean concepts to separate worklists XXX
-      """
-      #LOG("getOrderedGlobalActionList", 0, str(action_list))
-      sorted_workflow_actions = {}
-      sorted_global_actions = []
-      other_global_actions = []
-      for action in action_list:
-        action['disabled'] = 0
-        if action.has_key('workflow_title'):
-          if not sorted_workflow_actions.has_key(action['workflow_title']):
-            sorted_workflow_actions[action['workflow_title']] = []
-          sorted_workflow_actions[action['workflow_title']].append(action)
-        else:
-          other_global_actions.append(action)
-      workflow_title_list = sorted_workflow_actions.keys()
-      workflow_title_list.sort()
-      for key in workflow_title_list:
-        sorted_global_actions.append({'title': key, 'disabled': 1})
-        sorted_global_actions.extend(sorted_workflow_actions[key])
-      sorted_global_actions.append({'title': 'Others', 'disabled': 1})
-      sorted_global_actions.extend(other_global_actions)
-      return sorted_global_actions
-
-    def setupDefaultProperties(self, p, title, description,
-                               email_from_address, email_from_name,
-                               validate_email
-                               ):
-        CMFSite.setupDefaultProperties(self, p, title, description,
-                               email_from_address, email_from_name,
-                               validate_email)
-
-    # Portal methods are based on the concept of having portal-specific parameters
-    # for customization. In the past, we used global parameters, but it was not very good
-    # because it was very difficult to customize the settings for each portal site.
-    def _getPortalConfiguration(self, id):
-      """
-        Get a portal-specific configuration.
+    This should absolutely be rewritten by using clean concepts to separate worklists XXX
+    """
+    #LOG("getOrderedGlobalActionList", 0, str(action_list))
+    sorted_workflow_actions = {}
+    sorted_global_actions = []
+    other_global_actions = []
+    for action in action_list:
+      action['disabled'] = 0
+      if action.has_key('workflow_title'):
+        if not sorted_workflow_actions.has_key(action['workflow_title']):
+          sorted_workflow_actions[action['workflow_title']] = []
+        sorted_workflow_actions[action['workflow_title']].append(action)
+      else:
+        other_global_actions.append(action)
+    workflow_title_list = sorted_workflow_actions.keys()
+    workflow_title_list.sort()
+    for key in workflow_title_list:
+      sorted_global_actions.append({'title': key, 'disabled': 1})
+      sorted_global_actions.extend(sorted_workflow_actions[key])
+    sorted_global_actions.append({'title': 'Others', 'disabled': 1})
+    sorted_global_actions.extend(other_global_actions)
+    return sorted_global_actions
+
+  def setupDefaultProperties(self, p, title, description,
+                              email_from_address, email_from_name,
+                              validate_email
+                              ):
+      CMFSite.setupDefaultProperties(self, p, title, description,
+                              email_from_address, email_from_name,
+                              validate_email)
+
+  # Portal methods are based on the concept of having portal-specific parameters
+  # for customization. In the past, we used global parameters, but it was not very good
+  # because it was very difficult to customize the settings for each portal site.
+  def _getPortalConfiguration(self, id):
+    """
+      Get a portal-specific configuration.
 
-        Current implementation is using properties in a portal object.
-        If not found, try to get a default value for backward compatibility.
+      Current implementation is using properties in a portal object.
+      If not found, try to get a default value for backward compatibility.
 
-        This implementation can be improved by gathering information from appropriate places,
-        such as portal_types, portal_categories and portal_workflow.
-      """
-      if self.hasProperty(id):
-        return self.getProperty(id)
+      This implementation can be improved by gathering information from appropriate places,
+      such as portal_types, portal_categories and portal_workflow.
+    """
+    if self.hasProperty(id):
+      return self.getProperty(id)
 
-      # Fall back to the default.
-      return getattr(ERP5Defaults, id, None)
+    # Fall back to the default.
+    return getattr(ERP5Defaults, id, None)
 
-    def _getPortalGroupedTypeList(self, group):
-      """Return a list of portal types classified to a specific group.
-      """
-      def getTypeList(group):
-        type_list = []
-        for pt in self.portal_types.objectValues():
-          if group in getattr(pt, 'group_list', ()):
-            type_list.append(pt.getId())
-        return tuple(type_list)
-
-      getTypeList = CachingMethod(getTypeList,
-          id=('_getPortalGroupedTypeList', group), cache_duration=3600)
-      return getTypeList(group)
-
-    def _getPortalGroupedCategoryList(self, group):
-      """Return a list of base categories classified to a specific group.
-      """
-      def getCategoryList(group):
-        category_list = []
-        for bc in self.portal_categories.objectValues():
-          if group in bc.getCategoryTypeList():
-            category_list.append(bc.getId())
-        return tuple(category_list)
-
-      getCategoryList = CachingMethod(getCategoryList,
-            id=('_getPortalGroupedCategoryList', group), cache_duration=3600)
-      return getCategoryList(group)
-
-    def _getPortalGroupedStateList(self, group):
-      """Return a list of workflow states classified to a specific group.
-      """
-      def getStateList(group):
-        state_dict = {}
-        for wf in self.portal_workflow.objectValues():
-          if getattr(wf, 'states', None):
-            for state in wf.states.objectValues():
-              if group in getattr(state, 'type_list', ()):
-                state_dict[state.getId()] = None
-        return tuple(state_dict.keys())
-
-      getStateList = CachingMethod(getStateList,
-          id=('_getPortalGroupedStateList', group), cache_duration=3600)
-      return getStateList(group)
-
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalDefaultSectionCategory')
-    def getPortalDefaultSectionCategory(self):
-      """
-        Return a default section category. This method is deprecated.
-      """
-      LOG('ERP5Site', 0, 'getPortalDefaultSectionCategory is deprecated;'+
-          ' use portal_preferences.getPreferredSectionCategory instead.')
-      section_category = self.portal_preferences.getPreferredSectionCategory()
+  def _getPortalGroupedTypeList(self, group):
+    """Return a list of portal types classified to a specific group.
+    """
+    def getTypeList(group):
+      type_list = []
+      for pt in self.portal_types.objectValues():
+        if group in getattr(pt, 'group_list', ()):
+          type_list.append(pt.getId())
+      return tuple(type_list)
+
+    getTypeList = CachingMethod(getTypeList,
+        id=('_getPortalGroupedTypeList', group), cache_duration=3600)
+    return getTypeList(group)
+
+  def _getPortalGroupedCategoryList(self, group):
+    """Return a list of base categories classified to a specific group.
+    """
+    def getCategoryList(group):
+      category_list = []
+      for bc in self.portal_categories.objectValues():
+        if group in bc.getCategoryTypeList():
+          category_list.append(bc.getId())
+      return tuple(category_list)
+
+    getCategoryList = CachingMethod(getCategoryList,
+          id=('_getPortalGroupedCategoryList', group), cache_duration=3600)
+    return getCategoryList(group)
+
+  def _getPortalGroupedStateList(self, group):
+    """Return a list of workflow states classified to a specific group.
+    """
+    def getStateList(group):
+      state_dict = {}
+      for wf in self.portal_workflow.objectValues():
+        if getattr(wf, 'states', None):
+          for state in wf.states.objectValues():
+            if group in getattr(state, 'type_list', ()):
+              state_dict[state.getId()] = None
+      return tuple(state_dict.keys())
+
+    getStateList = CachingMethod(getStateList,
+        id=('_getPortalGroupedStateList', group), cache_duration=3600)
+    return getStateList(group)
+
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalDefaultSectionCategory')
+  def getPortalDefaultSectionCategory(self):
+    """
+      Return a default section category. This method is deprecated.
+    """
+    LOG('ERP5Site', 0, 'getPortalDefaultSectionCategory is deprecated;'+
+        ' use portal_preferences.getPreferredSectionCategory instead.')
+    section_category = self.portal_preferences.getPreferredSectionCategory()
 
-      # XXX This is only for backward-compatibility.
-      if not section_category:
-        section_category = self._getPortalConfiguration(
-                                  'portal_default_section_category')
+    # XXX This is only for backward-compatibility.
+    if not section_category:
+      section_category = self._getPortalConfiguration(
+                                'portal_default_section_category')
 
-      return section_category
+    return section_category
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalResourceTypeList')
-    def getPortalResourceTypeList(self):
-      """
-        Return resource types.
-      """
-      return self._getPortalGroupedTypeList('resource') or\
-             self._getPortalConfiguration('portal_resource_type_list')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalResourceTypeList')
+  def getPortalResourceTypeList(self):
+    """
+      Return resource types.
+    """
+    return self._getPortalGroupedTypeList('resource') or\
+            self._getPortalConfiguration('portal_resource_type_list')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalSubVariationTypeList')
-    def getPortalSubVariationTypeList(self):
-      """
-        Return resource types.
-      """
-      return self._getPortalGroupedTypeList('sub_variation')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalSubVariationTypeList')
+  def getPortalSubVariationTypeList(self):
+    """
+      Return resource types.
+    """
+    return self._getPortalGroupedTypeList('sub_variation')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalSubVariationBaseCategoryList')
-    def getPortalSubVariationBaseCategoryList(self):
-      """
-        Return variation base categories.
-      """
-      return self._getPortalGroupedCategoryList('sub_variation')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalSubVariationBaseCategoryList')
+  def getPortalSubVariationBaseCategoryList(self):
+    """
+      Return variation base categories.
+    """
+    return self._getPortalGroupedCategoryList('sub_variation')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalVariationTypeList')
-    def getPortalVariationTypeList(self):
-      """
-        Return variation types.
-      """
-      return self._getPortalGroupedTypeList('variation') or\
-             self._getPortalConfiguration('portal_variation_type_list')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalVariationTypeList')
+  def getPortalVariationTypeList(self):
+    """
+      Return variation types.
+    """
+    return self._getPortalGroupedTypeList('variation') or\
+            self._getPortalConfiguration('portal_variation_type_list')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalNodeTypeList')
-    def getPortalNodeTypeList(self):
-      """
-        Return node types.
-      """
-      return self._getPortalGroupedTypeList('node') or\
-             self._getPortalConfiguration('portal_node_type_list')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalNodeTypeList')
+  def getPortalNodeTypeList(self):
+    """
+      Return node types.
+    """
+    return self._getPortalGroupedTypeList('node') or\
+            self._getPortalConfiguration('portal_node_type_list')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalPaymentNodeTypeList')
-    def getPortalPaymentNodeTypeList(self):
-      """
-        Return payment node types.
-      """
-      return self._getPortalGroupedTypeList('payment_node') or\
-             self._getPortalConfiguration('portal_payment_node_type_list')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalPaymentNodeTypeList')
+  def getPortalPaymentNodeTypeList(self):
+    """
+      Return payment node types.
+    """
+    return self._getPortalGroupedTypeList('payment_node') or\
+            self._getPortalConfiguration('portal_payment_node_type_list')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalInvoiceTypeList')
-    def getPortalInvoiceTypeList(self):
-      """
-        Return invoice types.
-      """
-      return self._getPortalGroupedTypeList('invoice') or\
-             self._getPortalConfiguration('portal_invoice_type_list')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalInvoiceTypeList')
+  def getPortalInvoiceTypeList(self):
+    """
+      Return invoice types.
+    """
+    return self._getPortalGroupedTypeList('invoice') or\
+            self._getPortalConfiguration('portal_invoice_type_list')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalOrderTypeList')
-    def getPortalOrderTypeList(self):
-      """
-        Return order types.
-      """
-      return self._getPortalGroupedTypeList('order') or\
-             self._getPortalConfiguration('portal_order_type_list')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalOrderTypeList')
+  def getPortalOrderTypeList(self):
+    """
+      Return order types.
+    """
+    return self._getPortalGroupedTypeList('order') or\
+            self._getPortalConfiguration('portal_order_type_list')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalDeliveryTypeList')
-    def getPortalDeliveryTypeList(self):
-      """
-        Return delivery types.
-      """
-      return self._getPortalGroupedTypeList('delivery') or\
-             self._getPortalConfiguration('portal_delivery_type_list')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalDeliveryTypeList')
+  def getPortalDeliveryTypeList(self):
+    """
+      Return delivery types.
+    """
+    return self._getPortalGroupedTypeList('delivery') or\
+            self._getPortalConfiguration('portal_delivery_type_list')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalTransformationTypeList')
-    def getPortalTransformationTypeList(self):
-      """
-        Return transformation types.
-      """
-      return self._getPortalGroupedTypeList('transformation') or\
-             self._getPortalConfiguration('portal_transformation_type_list')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalTransformationTypeList')
+  def getPortalTransformationTypeList(self):
+    """
+      Return transformation types.
+    """
+    return self._getPortalGroupedTypeList('transformation') or\
+            self._getPortalConfiguration('portal_transformation_type_list')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalVariationBaseCategoryList')
-    def getPortalVariationBaseCategoryList(self):
-      """
-        Return variation base categories.
-      """
-      return self._getPortalGroupedCategoryList('variation') or\
-             self._getPortalConfiguration('portal_variation_base_category_list')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalVariationBaseCategoryList')
+  def getPortalVariationBaseCategoryList(self):
+    """
+      Return variation base categories.
+    """
+    return self._getPortalGroupedCategoryList('variation') or\
+            self._getPortalConfiguration('portal_variation_base_category_list')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalOptionBaseCategoryList')
-    def getPortalOptionBaseCategoryList(self):
-      """
-        Return option base categories.
-      """
-      return self._getPortalGroupedCategoryList('option') or\
-             self._getPortalConfiguration('portal_option_base_category_list')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalOptionBaseCategoryList')
+  def getPortalOptionBaseCategoryList(self):
+    """
+      Return option base categories.
+    """
+    return self._getPortalGroupedCategoryList('option') or\
+            self._getPortalConfiguration('portal_option_base_category_list')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalInvoiceMovementTypeList')
-    def getPortalInvoiceMovementTypeList(self):
-      """
-        Return invoice movement types.
-      """
-      return self._getPortalGroupedTypeList('invoice_movement') or\
-             self._getPortalConfiguration('portal_invoice_movement_type_list')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalInvoiceMovementTypeList')
+  def getPortalInvoiceMovementTypeList(self):
+    """
+      Return invoice movement types.
+    """
+    return self._getPortalGroupedTypeList('invoice_movement') or\
+            self._getPortalConfiguration('portal_invoice_movement_type_list')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalOrderMovementTypeList')
-    def getPortalOrderMovementTypeList(self):
-      """
-        Return order movement types.
-      """
-      return self._getPortalGroupedTypeList('order_movement') or\
-             self._getPortalConfiguration('portal_order_movement_type_list')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalOrderMovementTypeList')
+  def getPortalOrderMovementTypeList(self):
+    """
+      Return order movement types.
+    """
+    return self._getPortalGroupedTypeList('order_movement') or\
+            self._getPortalConfiguration('portal_order_movement_type_list')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalDeliveryMovementTypeList')
-    def getPortalDeliveryMovementTypeList(self):
-      """
-        Return delivery movement types.
-      """
-      return self._getPortalGroupedTypeList('delivery_movement') or\
-             self._getPortalConfiguration('portal_delivery_movement_type_list')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalDeliveryMovementTypeList')
+  def getPortalDeliveryMovementTypeList(self):
+    """
+      Return delivery movement types.
+    """
+    return self._getPortalGroupedTypeList('delivery_movement') or\
+            self._getPortalConfiguration('portal_delivery_movement_type_list')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                               'getPortalSupplyTypeList')
-    def getPortalSupplyTypeList(self):
-      """
-        Return supply types.
-      """
-      return self._getPortalGroupedTypeList('supply') or\
-             self._getPortalConfiguration('portal_supply_type_list')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                              'getPortalSupplyTypeList')
+  def getPortalSupplyTypeList(self):
+    """
+      Return supply types.
+    """
+    return self._getPortalGroupedTypeList('supply') or\
+            self._getPortalConfiguration('portal_supply_type_list')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                               'getPortalSupplyPathTypeList')
-    def getPortalSupplyPathTypeList(self):
-      """
-        Return supply movement types.
-      """
-      return self._getPortalGroupedTypeList('supply_path') or\
-             self._getPortalConfiguration('portal_supply_path_type_list')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                              'getPortalSupplyPathTypeList')
+  def getPortalSupplyPathTypeList(self):
+    """
+      Return supply movement types.
+    """
+    return self._getPortalGroupedTypeList('supply_path') or\
+            self._getPortalConfiguration('portal_supply_path_type_list')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalAcquisitionMovementTypeList')
-    def getPortalAcquisitionMovementTypeList(self):
-      """
-        Return acquisition movement types.
-      """
-      return tuple(list(self.getPortalOrderMovementTypeList()) +
-                   list(self.getPortalDeliveryMovementTypeList()) +
-                   list(self.getPortalInvoiceMovementTypeList()))
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalAcquisitionMovementTypeList')
+  def getPortalAcquisitionMovementTypeList(self):
+    """
+      Return acquisition movement types.
+    """
+    return tuple(list(self.getPortalOrderMovementTypeList()) +
+                  list(self.getPortalDeliveryMovementTypeList()) +
+                  list(self.getPortalInvoiceMovementTypeList()))
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalMovementTypeList')
-    def getPortalMovementTypeList(self):
-      """
-        Return movement types.
-      """
-      return tuple(list(self.getPortalOrderMovementTypeList()) +
-                   list(self.getPortalDeliveryMovementTypeList()) +
-                   list(self.getPortalInvoiceMovementTypeList()) +
-                   ['Simulation Movement'])
-
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalSimulatedMovementTypeList')
-    def getPortalSimulatedMovementTypeList(self):
-      """
-        Return simulated movement types.
-      """
-      return tuple([x for x in self.getPortalMovementTypeList()\
-                     if x not in self.getPortalContainerTypeList()])
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalMovementTypeList')
+  def getPortalMovementTypeList(self):
+    """
+      Return movement types.
+    """
+    return tuple(list(self.getPortalOrderMovementTypeList()) +
+                  list(self.getPortalDeliveryMovementTypeList()) +
+                  list(self.getPortalInvoiceMovementTypeList()) +
+                  ['Simulation Movement'])
+
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalSimulatedMovementTypeList')
+  def getPortalSimulatedMovementTypeList(self):
+    """
+      Return simulated movement types.
+    """
+    return tuple([x for x in self.getPortalMovementTypeList()\
+                    if x not in self.getPortalContainerTypeList()])
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalContainerTypeList')
-    def getPortalContainerTypeList(self):
-      """
-        Return container types.
-      """
-      return self._getPortalGroupedTypeList('container') or\
-             self._getPortalConfiguration('portal_container_type_list')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalContainerTypeList')
+  def getPortalContainerTypeList(self):
+    """
+      Return container types.
+    """
+    return self._getPortalGroupedTypeList('container') or\
+            self._getPortalConfiguration('portal_container_type_list')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalContainerLineTypeList')
-    def getPortalContainerLineTypeList(self):
-      """
-        Return container line types.
-      """
-      return self._getPortalGroupedTypeList('container_line') or\
-             self._getPortalConfiguration('portal_container_line_type_list')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalContainerLineTypeList')
+  def getPortalContainerLineTypeList(self):
+    """
+      Return container line types.
+    """
+    return self._getPortalGroupedTypeList('container_line') or\
+            self._getPortalConfiguration('portal_container_line_type_list')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalItemTypeList')
-    def getPortalItemTypeList(self):
-      """
-        Return item types.
-      """
-      return self._getPortalGroupedTypeList('item') or\
-             self._getPortalConfiguration('portal_item_type_list')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalItemTypeList')
+  def getPortalItemTypeList(self):
+    """
+      Return item types.
+    """
+    return self._getPortalGroupedTypeList('item') or\
+            self._getPortalConfiguration('portal_item_type_list')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalDiscountTypeList')
-    def getPortalDiscountTypeList(self):
-      """
-        Return discount types.
-      """
-      return self._getPortalGroupedTypeList('discount') or\
-             self._getPortalConfiguration('portal_discount_type_list')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalDiscountTypeList')
+  def getPortalDiscountTypeList(self):
+    """
+      Return discount types.
+    """
+    return self._getPortalGroupedTypeList('discount') or\
+            self._getPortalConfiguration('portal_discount_type_list')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalAlarmTypeList')
-    def getPortalAlarmTypeList(self):
-      """
-        Return alarm types.
-      """
-      return self._getPortalGroupedTypeList('alarm') or\
-             self._getPortalConfiguration('portal_alarm_type_list')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalAlarmTypeList')
+  def getPortalAlarmTypeList(self):
+    """
+      Return alarm types.
+    """
+    return self._getPortalGroupedTypeList('alarm') or\
+            self._getPortalConfiguration('portal_alarm_type_list')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalPaymentConditionTypeList')
-    def getPortalPaymentConditionTypeList(self):
-      """
-        Return payment condition types.
-      """
-      return self._getPortalGroupedTypeList('payment_condition') or\
-             self._getPortalConfiguration('portal_payment_condition_type_list')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalPaymentConditionTypeList')
+  def getPortalPaymentConditionTypeList(self):
+    """
+      Return payment condition types.
+    """
+    return self._getPortalGroupedTypeList('payment_condition') or\
+            self._getPortalConfiguration('portal_payment_condition_type_list')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalBalanceTransactionLineTypeList')
-    def getPortalBalanceTransactionLineTypeList(self):
-      """
-        Return balance transaction line types.
-      """
-      return self._getPortalGroupedTypeList('balance_transaction_line') or\
-             self._getPortalConfiguration(
-                    'portal_balance_transaction_line_type_list')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalBalanceTransactionLineTypeList')
+  def getPortalBalanceTransactionLineTypeList(self):
+    """
+      Return balance transaction line types.
+    """
+    return self._getPortalGroupedTypeList('balance_transaction_line') or\
+            self._getPortalConfiguration(
+                  'portal_balance_transaction_line_type_list')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalCurrentInventoryStateList')
-    def getPortalCurrentInventoryStateList(self):
-      """
-        Return current inventory states.
-      """
-      return self._getPortalGroupedStateList('current_inventory') or\
-            self._getPortalConfiguration('portal_current_inventory_state_list')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalCurrentInventoryStateList')
+  def getPortalCurrentInventoryStateList(self):
+    """
+      Return current inventory states.
+    """
+    return self._getPortalGroupedStateList('current_inventory') or\
+          self._getPortalConfiguration('portal_current_inventory_state_list')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalDraftOrderStateList')
-    def getPortalDraftOrderStateList(self):
-      """
-        Return draft order states.
-      """
-      return self._getPortalGroupedStateList('draft_order') or\
-             self._getPortalConfiguration('portal_draft_order_state_list')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalDraftOrderStateList')
+  def getPortalDraftOrderStateList(self):
+    """
+      Return draft order states.
+    """
+    return self._getPortalGroupedStateList('draft_order') or\
+            self._getPortalConfiguration('portal_draft_order_state_list')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalPlannedOrderStateList')
-    def getPortalPlannedOrderStateList(self):
-      """
-        Return planned order states.
-      """
-      return self._getPortalGroupedStateList('planned_order') or\
-             self._getPortalConfiguration('portal_planned_order_state_list')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalPlannedOrderStateList')
+  def getPortalPlannedOrderStateList(self):
+    """
+      Return planned order states.
+    """
+    return self._getPortalGroupedStateList('planned_order') or\
+            self._getPortalConfiguration('portal_planned_order_state_list')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalReservedInventoryStateList')
-    def getPortalReservedInventoryStateList(self):
-      """
-        Return reserved inventory states.
-      """
-      return self._getPortalGroupedStateList('reserved_inventory') or\
-          self._getPortalConfiguration('portal_reserved_inventory_state_list')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalReservedInventoryStateList')
+  def getPortalReservedInventoryStateList(self):
+    """
+      Return reserved inventory states.
+    """
+    return self._getPortalGroupedStateList('reserved_inventory') or\
+        self._getPortalConfiguration('portal_reserved_inventory_state_list')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalFutureInventoryStateList')
-    def getPortalFutureInventoryStateList(self):
-      """
-        Return future inventory states.
-      """
-      return self._getPortalGroupedStateList('future_inventory') or\
-             self._getPortalConfiguration('portal_future_inventory_state_list')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalFutureInventoryStateList')
+  def getPortalFutureInventoryStateList(self):
+    """
+      Return future inventory states.
+    """
+    return self._getPortalGroupedStateList('future_inventory') or\
+            self._getPortalConfiguration('portal_future_inventory_state_list')
 
-    security.declareProtected(Permissions.AccessContentsInformation, 'getPortalUpdatableAmortisationTransactionStateList')
-    def getPortalUpdatableAmortisationTransactionStateList(self):
-      """
-        Return states when Amortisation Transaction can be updated by amortisation_transaction_builder.
-      """
-      return self._getPortalConfiguration('portal_updatable_amortisation_transaction_state_list')
+  security.declareProtected(Permissions.AccessContentsInformation, 'getPortalUpdatableAmortisationTransactionStateList')
+  def getPortalUpdatableAmortisationTransactionStateList(self):
+    """
+      Return states when Amortisation Transaction can be updated by amortisation_transaction_builder.
+    """
+    return self._getPortalConfiguration('portal_updatable_amortisation_transaction_state_list')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalColumnBaseCategoryList')
-    def getPortalColumnBaseCategoryList(self):
-      """
-        Return column base categories.
-      """
-      return self._getPortalGroupedCategoryList('column') or\
-             self._getPortalConfiguration('portal_column_base_category_list')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalColumnBaseCategoryList')
+  def getPortalColumnBaseCategoryList(self):
+    """
+      Return column base categories.
+    """
+    return self._getPortalGroupedCategoryList('column') or\
+            self._getPortalConfiguration('portal_column_base_category_list')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalLineBaseCategoryList')
-    def getPortalLineBaseCategoryList(self):
-      """
-        Return line base categories.
-      """
-      return self._getPortalGroupedCategoryList('line') or\
-             self._getPortalConfiguration('portal_line_base_category_list')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalLineBaseCategoryList')
+  def getPortalLineBaseCategoryList(self):
+    """
+      Return line base categories.
+    """
+    return self._getPortalGroupedCategoryList('line') or\
+            self._getPortalConfiguration('portal_line_base_category_list')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalTabBaseCategoryList')
-    def getPortalTabBaseCategoryList(self):
-      """
-        Return tab base categories.
-      """
-      return self._getPortalGroupedCategoryList('tab') or\
-             self._getPortalConfiguration('portal_tab_base_category_list')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalTabBaseCategoryList')
+  def getPortalTabBaseCategoryList(self):
+    """
+      Return tab base categories.
+    """
+    return self._getPortalGroupedCategoryList('tab') or\
+            self._getPortalConfiguration('portal_tab_base_category_list')
 
-    def getPortalDefaultGapRoot(self):
-      """
-        Return the Accounting Plan to use by default (return the root node)
-      """
-      LOG('ERP5Site', 0, 'getPortalDefaultGapRoot is deprecated;'+
-       ' use portal_preferences.getPreferredAccountingTransactionGap instead.')
+  def getPortalDefaultGapRoot(self):
+    """
+      Return the Accounting Plan to use by default (return the root node)
+    """
+    LOG('ERP5Site', 0, 'getPortalDefaultGapRoot is deprecated;'+
+      ' use portal_preferences.getPreferredAccountingTransactionGap instead.')
 
-      return self.portal_preferences.getPreferredAccountingTransactionGap() or\
-             self._getPortalConfiguration('portal_default_gap_root')
+    return self.portal_preferences.getPreferredAccountingTransactionGap() or\
+            self._getPortalConfiguration('portal_default_gap_root')
 
-    def getPortalAccountingMovementTypeList(self) :
-      """
-        Return accounting movement type list.
-      """
-      return self._getPortalGroupedTypeList('accounting_movement') or\
-          self._getPortalConfiguration('portal_accounting_movement_type_list')
+  def getPortalAccountingMovementTypeList(self) :
+    """
+      Return accounting movement type list.
+    """
+    return self._getPortalGroupedTypeList('accounting_movement') or\
+        self._getPortalConfiguration('portal_accounting_movement_type_list')
 
-    def getPortalAccountingTransactionTypeList(self) :
-      """
-        Return accounting transaction movement type list.
-      """
-      return self._getPortalGroupedTypeList('accounting_transaction') or\
-        self._getPortalConfiguration('portal_accounting_transaction_type_list')
+  def getPortalAccountingTransactionTypeList(self) :
+    """
+      Return accounting transaction movement type list.
+    """
+    return self._getPortalGroupedTypeList('accounting_transaction') or\
+      self._getPortalConfiguration('portal_accounting_transaction_type_list')
 
-    def getPortalAssignmentBaseCategoryList(self):
-      """
-        Return List of category values to generate security groups.
-      """
-      return self._getPortalGroupedCategoryList('assignment') or\
-          self._getPortalConfiguration('portal_assignment_base_category_list')
+  def getPortalAssignmentBaseCategoryList(self):
+    """
+      Return List of category values to generate security groups.
+    """
+    return self._getPortalGroupedCategoryList('assignment') or\
+        self._getPortalConfiguration('portal_assignment_base_category_list')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalTicketTypeList')
-    def getPortalTicketTypeList(self):
-      """
-      Return ticket types.
-      """
-      return self._getPortalGroupedTypeList('ticket')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalTicketTypeList')
+  def getPortalTicketTypeList(self):
+    """
+    Return ticket types.
+    """
+    return self._getPortalGroupedTypeList('ticket')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPortalEventTypeList')
-    def getPortalEventTypeList(self):
-      """
-      Return event types.
-      """
-      return self._getPortalGroupedTypeList('event')
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getPortalEventTypeList')
+  def getPortalEventTypeList(self):
+    """
+    Return event types.
+    """
+    return self._getPortalGroupedTypeList('event')
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getDefaultModuleId')
-    def getDefaultModuleId(self, portal_type, default=MARKER):
-      """
-        Return default module id where a object with portal_type can
-        be created.
-      """
-      # Very dummy method, but it works with today name convention.
-      module_name = portal_type.lower().replace(' ','_')
-      portal_object = self
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getDefaultModuleId')
+  def getDefaultModuleId(self, portal_type, default=MARKER):
+    """
+      Return default module id where a object with portal_type can
+      be created.
+    """
+    # Very dummy method, but it works with today name convention.
+    module_name = portal_type.lower().replace(' ','_')
+    portal_object = self
+    if not hasattr(portal_object, module_name):
+      module_name += '_module'
       if not hasattr(portal_object, module_name):
-        module_name += '_module'
-        if not hasattr(portal_object, module_name):
-          if default is not MARKER:
-            return default
-          LOG('ERP5Site, getDefaultModuleId', 0,
-              'Unable to find default module for portal_type: %s' % \
-                  portal_type)
-          raise ValueError, 'Unable to find module for portal_type: %s' % \
-                            portal_type
-      return module_name
-
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getDefaultModule')
-    def getDefaultModule(self, portal_type):
-      """
-        Return default module where a object with portal_type can be created
-      """
-      return getattr(self, self.getDefaultModuleId(portal_type), None)
+        if default is not MARKER:
+          return default
+        LOG('ERP5Site, getDefaultModuleId', 0,
+            'Unable to find default module for portal_type: %s' % \
+                portal_type)
+        raise ValueError, 'Unable to find module for portal_type: %s' % \
+                          portal_type
+    return module_name
+
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getDefaultModule')
+  def getDefaultModule(self, portal_type):
+    """
+      Return default module where a object with portal_type can be created
+    """
+    return getattr(self, self.getDefaultModuleId(portal_type), None)
 
-    security.declareProtected(Permissions.AddPortalContent, 'newContent')
-    def newContent(self, id=None, portal_type=None, immediate_reindex=0, **kw):
-      """
-        Creates a new content
-      """
-      if id is None:
-        raise ValueError, 'The id should not be None'
-      if portal_type is None:
-        raise ValueError, 'The portal_type should not be None'
-      self.portal_types.constructContent(type_name=portal_type,
-                                         container=self,
-                                         id=id,
-                                         ) # **kw) removed due to CMF bug
-      new_instance = self[id]
-      if kw is not None: new_instance._edit(force_update=1, **kw)
-      if immediate_reindex: new_instance.immediateReindexObject()
-      return new_instance
-
-    def log(self,description,content):
-      """
-      Put a log message
-      """
-      LOG(description,0,content)
+  security.declareProtected(Permissions.AddPortalContent, 'newContent')
+  def newContent(self, id=None, portal_type=None, immediate_reindex=0, **kw):
+    """
+      Creates a new content
+    """
+    if id is None:
+      raise ValueError, 'The id should not be None'
+    if portal_type is None:
+      raise ValueError, 'The portal_type should not be None'
+    self.portal_types.constructContent(type_name=portal_type,
+                                        container=self,
+                                        id=id,
+                                        ) # **kw) removed due to CMF bug
+    new_instance = self[id]
+    if kw is not None: new_instance._edit(force_update=1, **kw)
+    if immediate_reindex: new_instance.immediateReindexObject()
+    return new_instance
+
+  def log(self,description,content):
+    """
+    Put a log message
+    """
+    LOG(description,0,content)
 
 
 Globals.InitializeClass(ERP5Site)
 
 class ERP5Generator(PortalGenerator):
 
-    klass = ERP5Site
-
-    def getBootstrapDirectory(self):
-        """
-          Return the name of the bootstrap directory
-        """
-        product_path = package_home(globals())
-        return os.path.join(product_path, 'bootstrap')
-
-    def create(self, parent, id, create_userfolder,
-               erp5_sql_connection_type, erp5_sql_connection_string,
-               cmf_activity_sql_connection_type,cmf_activity_sql_connection_string,
-               reindex=1,**kw):
-        LOG('setupTools, create',0,kw)
-        id = str(id)
-        portal = self.klass(id=id)
-        # Make sure reindex will not be called until business templates
-        # will be installed
-        setattr(portal,'isIndexable',0)
-        parent._setObject(id, portal)
-        # Return the fully wrapped object.
-        p = parent.this()._getOb(id)
-        p._setProperty('erp5_sql_connection_type', erp5_sql_connection_type, 'string')
-        p._setProperty('erp5_sql_connection_string', erp5_sql_connection_string, 'string')
-        p._setProperty('cmf_activity_sql_connection_type', cmf_activity_sql_connection_type, 'string')
-        p._setProperty('cmf_activity_sql_connection_string', cmf_activity_sql_connection_string, 'string')
-        p._setProperty('management_page_charset', 'UTF-8', 'string') # XXX hardcoded charset
-        self.setup(p, create_userfolder,**kw)
-        return p
-
-    def setupLastTools(self, p, **kw):
-        """Set up finals tools
-           We want to set the activity tool only at the end to
-           make sure that we do not put un the queue the full reindexation
-        """
-        # Add Activity Tool
-        #LOG('setupTools, kw',0,kw)
-        if kw.has_key('create_activities') and int(kw['create_activities'])==1:
-          if not p.hasObject('portal_activities'):
-            addTool = p.manage_addProduct['CMFActivity'].manage_addTool
-            addTool('CMF Activity Tool', None) # Allow user to select active/passive
-          # Initialize Activities
-          portal_activities = getToolByName(p, 'portal_activities', None)
-          if portal_activities is not None:
-            if kw.get('update', 0):
-              keep = 1
-            else:
-              keep = 0
-            portal_activities.manageClearActivities(keep=keep)
-
-    def setupTemplateTool(self, p, **kw):
-      """Setup the Template Tool. Security must be set strictly.
-      """
-      addTool = p.manage_addProduct['ERP5'].manage_addTool
-      addTool('ERP5 Template Tool', None)
-      context = p.portal_templates
-      permission_list = context.possible_permissions()
-      for permission in permission_list:
-        context.manage_permission(permission, ['Manager'], 0)
-
-    def setupTools(self, p,**kw):
-        """Set up initial tools"""
-
-        if not 'portal_actions' in p.objectIds():
-          PortalGenerator.setupTools(self, p)
-
-        # It is better to remove portal_catalog which is ZCatalog as soon as possible,
-        # because the API is not the completely same as ERP5Catalog, and ZCatalog is
-        # useless for ERP5 after all.
-        update = kw.get('update', 0)
-        portal_catalog = getToolByName(p, 'portal_catalog', None)
-        if portal_catalog is not None and portal_catalog.meta_type != 'ZSQLCatalog' and not update:
-          p._delObject('portal_catalog')
-
-        # Add CMF Report Tool
-        if not p.hasObject('portal_report'):
-          addTool = p.manage_addProduct['CMFReportTool'].manage_addTool
-          addTool('CMF Report Tool', None)
-
-        # Add ERP5 Tools
-        addTool = p.manage_addProduct['ERP5'].manage_addTool
-        if not p.hasObject('portal_categories'):
-          addTool('ERP5 Categories', None)
-        if not p.hasObject('portal_rules'):
-          addTool('ERP5 Rule Tool', None)
-        if not p.hasObject('portal_ids'):
-          addTool('ERP5 Id Tool', None)
-        if not p.hasObject('portal_simulation'):
-          addTool('ERP5 Simulation Tool', None)
-        if not p.hasObject('portal_templates'):
-          self.setupTemplateTool(p)
-        if not p.hasObject('portal_trash'):
-          addTool('ERP5 Trash Tool', None)
-        if not p.hasObject('portal_alarms'):
-          addTool('ERP5 Alarm Tool', None)
-        if not p.hasObject('portal_domains'):
-          addTool('ERP5 Domain Tool', None)
-        if not p.hasObject('portal_deliveries'):
-          addTool('ERP5 Delivery Tool', None)
-        if not p.hasObject('portal_orders'):
-          addTool('ERP5 Order Tool', None)
-        
-        try:
-          addTool = p.manage_addProduct['ERP5Subversion'].manage_addTool
-          if not p.hasObject('portal_subversion'):
-            addTool('ERP5 Subversion Tool', None)
-        except AttributeError:
-          pass
-          
-        # Add ERP5Type Tools
-        addTool = p.manage_addProduct['ERP5Type'].manage_addTool
-        if not p.hasObject('portal_classes'):
-          if allowClassTool():
-            addTool('ERP5 Class Tool', None)
-          else:
-            addTool('ERP5 Dummy Class Tool', None)
-
-        # Add ERP5 SQL Catalog Tool
-        addTool = p.manage_addProduct['ERP5Catalog'].manage_addTool
-        if not p.hasObject('portal_catalog'):
-          addTool('ERP5 Catalog', None)
-        # Add Default SQL connection
-        if p.erp5_sql_connection_type == 'Z MySQL Database Connection':
-          if not p.hasObject('erp5_sql_connection'):
-            addSQLConnection = p.manage_addProduct['ZSQLMethods'].manage_addZMySQLConnection
-            addSQLConnection('erp5_sql_connection', 'ERP5 SQL Server Connection', p.erp5_sql_connection_string)
-        elif p.erp5_sql_connection_type == 'Z Gadfly':
-          pass
-        if p.cmf_activity_sql_connection_type == 'Z MySQL Database Connection':
-          if not p.hasObject('cmf_activity_sql_connection'):
-            addSQLConnection = p.manage_addProduct['ZSQLMethods'].manage_addZMySQLConnection
-            addSQLConnection('cmf_activity_sql_connection', 'CMF Activity SQL Server Connection', p.cmf_activity_sql_connection_string)
-        elif p.cmf_activity_sql_connection_type == 'Z Gadfly':
-          pass
-        
-        portal_catalog = getToolByName(p, 'portal_catalog')
-        if not portal_catalog.getSQLCatalog('erp5_mysql') and not update:
-          # Add a default SQL Catalog
-          #addSQLCatalog = portal_catalog.manage_addProduct['ZSQLCatalog']\
-          #                                .manage_addSQLCatalog
-          #addSQLCatalog('erp5_mysql', '')
-          #portal_catalog.default_sql_catalog_id = 'erp5_mysql'
-          portal_catalog.addDefaultSQLMethods()
-          portal_catalog.manage_catalogClear()
-
-        # Add ERP5Form Tools
-        addTool = p.manage_addProduct['ERP5Form'].manage_addTool
-        if not p.hasObject('portal_selections'):
-          addTool('ERP5 Selections', None)
-        if not p.hasObject('portal_preferences'):
-          addTool('ERP5 Preference Tool', None)
-
-        # Add ERP5SyncML Tools
-        addTool = p.manage_addProduct['ERP5SyncML'].manage_addTool
-        if not p.hasObject('portal_synchronizations'):
-          addTool('ERP5 Synchronizations', None)
-
-        # Add Message Catalog
-        if not 'Localizer' in p.objectIds():
-          addLocalizer = p.manage_addProduct['Localizer'].manage_addLocalizer
-          addLocalizer('', ('en',))
-        localizer = getToolByName(p, 'Localizer')
-        addMessageCatalog = localizer.manage_addProduct['Localizer']\
-                                          .manage_addMessageCatalog
-        if 'erp5_ui' not in localizer.objectIds():
-          if 'default' in localizer.objectIds():
-            localizer.manage_delObjects('default')
-          addMessageCatalog('default', 'ERP5 Localized Messages', ('en',))
-          addMessageCatalog('erp5_ui', 'ERP5 Localized Interface', ('en',))
-          addMessageCatalog('erp5_content', 'ERP5 Localized Content', ('en',))
-
-
-    def setupMembersFolder(self, p):
-        """
-          ERP5 is not a CMS
-        """
-        pass
-
-    def setupDefaultSkins(self, p):
-        from Products.CMFCore.DirectoryView import addDirectoryViews
-        from Products.CMFDefault import cmfdefault_globals
-        from Products.CMFActivity import cmfactivity_globals
-        ps = getToolByName(p, 'portal_skins')
-        # Do not use filesystem skins for ERP5 any longer.
-        # addDirectoryViews(ps, 'skins', globals())
-        # addDirectoryViews(ps, path.join('skins','pro'), globals())
-        addDirectoryViews(ps, 'skins', cmfdefault_globals)
-        addDirectoryViews(ps, 'skins', cmfactivity_globals)
-        ps.manage_addProduct['OFSP'].manage_addFolder(id='external_method')
-        ps.manage_addProduct['OFSP'].manage_addFolder(id='custom')
-        # set the 'custom' layer a high priority, so it remains the first
-        # layer when installing new business templates
-        ps['custom'].manage_addProperty(
-            "business_template_skin_layer_priority", 100.0, "float")
-        ps.addSkinSelection('View', 'custom, external_method, activity, '
-                                  + 'zpt_content, zpt_generic,'
-                                  + 'zpt_control, content, generic, control, Images',
-                            make_default=1)
-        ps.addSkinSelection('Print', 'custom, external_method, activity, '
-                                  + 'zpt_content, zpt_generic,'
-                                  + 'zpt_control, content, generic, control, Images',
-                            make_default=0)
-        ps.addSkinSelection('CSV', 'custom, external_method, activity, '
-                                  + 'zpt_content, zpt_generic,'
-                                  + 'zpt_control, content, generic, control, Images',
-                            make_default=0)
-        p.setupCurrentSkin()
-
-    def setupWorkflow(self, p):
-        """
-          Set up workflows for business templates
-        """
-        tool = getToolByName(p, 'portal_workflow', None)
-        if tool is None:
-            return
-        for wf_id in ('business_template_building_workflow', 'business_template_installation_workflow'):
-          if wf_id in tool.objectIds():
-            tool.manage_delObjects([wf_id])
-        bootstrap_dir = self.getBootstrapDirectory()
-        business_template_building_workflow = os.path.join(bootstrap_dir,
-                                                           'business_template_building_workflow.xml')
-        tool._importObjectFromFile(business_template_building_workflow)
-        business_template_installation_workflow = os.path.join(bootstrap_dir,
-                                                               'business_template_installation_workflow.xml')
-        tool._importObjectFromFile(business_template_installation_workflow)
-        tool.setChainForPortalTypes( ( 'Business Template', ),
-                                     ( 'business_template_building_workflow',
-                                       'business_template_installation_workflow' ) )
-        pass
-
-    def setupIndex(self, p, **kw):
-        # Make sure all tools and folders have been indexed
-        if kw.has_key('reindex') and kw['reindex']==0:
-          return
-        skins_tool = getToolByName(p, 'portal_skins', None)
-        if skins_tool is None:
-          return
-        setattr(p,'isIndexable',1)
-        portal_catalog = p.portal_catalog
-        portal_catalog.manage_catalogClear()
-        skins_tool["erp5_core"].ERP5Site_reindexAll()
-
-    def setupUserFolder(self, p):
-        # We use if possible ERP5Security, then NuxUserGroups
-        try:
-          from Products import ERP5Security
-          from Products import PluggableAuthService
-        except ImportError:
-          ERP5Security = None
-          try:
-            import Products.NuxUserGroups
-            withnuxgroups = 1
-          except ImportError:
-            withnuxgroups = 0
-        if ERP5Security is not None:
-          # Use Pluggable Auth Service instead of the standard acl_users.
-          p.manage_addProduct['PluggableAuthService'].addPluggableAuthService()
-          # Add legacy ZODB support
-          p.acl_users.manage_addProduct['PluggableAuthService'].addZODBUserManager('zodb_users')
-          p.acl_users.manage_addProduct['PluggableAuthService'].addZODBGroupManager('zodb_groups')
-          p.acl_users.manage_addProduct['PluggableAuthService'].addZODBRoleManager('zodb_roles')
-          # Add CMF Portal Roles
-          #XXX Maybe it will no longer be required once PAS is the standard
-          p.acl_users.zodb_roles.addRole('Member')
-          p.acl_users.zodb_roles.addRole('Reviewer')
-          # Register ZODB Interface
-          p.acl_users.zodb_users.manage_activateInterfaces(('IAuthenticationPlugin',
-                                                        'IUserEnumerationPlugin','IUserAdderPlugin'))
-          p.acl_users.zodb_groups.manage_activateInterfaces(('IGroupsPlugin',
-                                                        'IGroupEnumerationPlugin'))
-          p.acl_users.zodb_roles.manage_activateInterfaces(('IRoleEnumerationPlugin',
-                                                        'IRolesPlugin', 'IRoleAssignerPlugin'))
-          # Add ERP5UserManager
-          p.acl_users.manage_addProduct['ERP5Security'].addERP5UserManager('erp5_users')
-          p.acl_users.manage_addProduct['ERP5Security'].addERP5GroupManager('erp5_groups')
-          p.acl_users.manage_addProduct['ERP5Security'].addERP5RoleManager('erp5_roles')
-          # Register ERP5UserManager Interface
-          p.acl_users.erp5_users.manage_activateInterfaces(('IAuthenticationPlugin',
-                                                            'IUserEnumerationPlugin',))
-          p.acl_users.erp5_groups.manage_activateInterfaces(('IGroupsPlugin',))
-          p.acl_users.erp5_roles.manage_activateInterfaces(('IRolesPlugin',))
-        elif withnuxgroups:
-          # NuxUserGroups user folder
-          p.manage_addProduct['NuxUserGroups'].addUserFolderWithGroups()
-        else:
-          # Standard user folder
-          PortalGenerator.setupUserFolder(self, p)
-
-    def setupPermissions(self, p):
-      permission_dict = {
-        'Access Transient Objects'     : ('Manager', 'Anonymous'),
-        'Access contents information'  : ('Manager', 'Member', 'Anonymous'),
-        'Access future portal content' : ('Manager', 'Reviewer'),
-        'Access session data'          : ('Manager', 'Anonymous'),
-        'AccessContentsInformation'    : ('Manager', 'Member'),
-        'Add portal content'           : ('Manager', 'Owner'),
-        'Add portal folders'           : ('Manager', 'Owner'),
-        'Delete objects'               : ('Manager', 'Owner'),
-        'FTP access'                   : ('Manager', 'Owner'),
-        'List folder contents'         : ('Manager', 'Member'),
-        'List portal members'          : ('Manager', 'Member'),
-        'List undoable changes'        : ('Manager', 'Member'),
-        'Manage properties'            : ('Manager', 'Owner'),
-        'Modify portal content'        : ('Manager', 'Owner'),
-        'Reply to item'                : ('Manager', 'Member'),
-        'Review portal content'        : ('Manager', 'Reviewer'),
-        'Search ZCatalog'              : ('Manager', 'Member'),
-        'Set own password'             : ('Manager',),
-        'Set own properties'           : ('Manager', 'Member'),
-        'Undo changes'                 : ('Manager', 'Owner'),
-        'View'                         : ('Manager', 'Member', 'Owner', 'Anonymous'),
-        'View management screens'      : ('Manager', 'Owner')
-      }
-
-      for permission in p.ac_inherited_permissions(1):
-        name = permission[0]
-        role_list = permission_dict.get(name, ('Manager',))
-        p.manage_permission(name, roles=role_list, acquire=0)
-
-    def setup(self, p, create_userfolder, **kw):
-        update = kw.get('update', 0)
-
-        self.setupTools(p, **kw)
-
-        if not p.hasObject('MailHost'):
-          self.setupMailHost(p)
-
-        if int(create_userfolder) != 0 and not p.hasObject('acl_users'):
-            self.setupUserFolder(p)
-
-        if not p.hasObject('cookie_authentication'):
-          self.setupCookieAuth(p)
-
-        if 'Member' not in getattr(p, '__ac_roles__', ()):
-          self.setupRoles(p)
-
-        if not update:
-          self.setupPermissions(p)
-          self.setupDefaultSkins(p)
-
-        self.setupLastTools(p, **kw)
-
-        # Finish setup
-        if not p.hasObject('Members'):
-          self.setupMembersFolder(p)
-
-        # ERP5 Design Choice is that all content should be user defined
-        # Content is disseminated through business templates
-        self.setupBusinessTemplate(p)
-
-        if not p.hasObject('content_type_registry'):
-          self.setupMimetypes(p)
-        if not update:
-          self.setupWorkflow(p)
-
-        if not update:
-          self.setupERP5Core(p,**kw)
-
-        # Make sure tools are cleanly indexed with a uid before creating children
-        # XXX for some strange reason, member was indexed 5 times
-        if not update:
-          self.setupIndex(p, **kw)
-
-    def setupBusinessTemplate(self,p):
-        """
-        Install the portal_type of Business Template
-        """
-        tool = getToolByName(p, 'portal_types', None)
-        if tool is None:
-          return
-        if 'Business Template' not in tool.objectIds():
-          t = BusinessTemplate.factory_type_information
-          ti = apply(ERP5TypeInformation, (), t)
-          tool._setObject(t['id'], ti)
-
-    def setupERP5Core(self,p,**kw):
-        """
-        Install the core part of ERP5
-        """
-        template_tool = getToolByName(p, 'portal_templates', None)
-        if template_tool is None:
-          return
-        if template_tool.getInstalledBusinessTemplate('erp5_core') is None:
-          bootstrap_dir = self.getBootstrapDirectory()
-          for bt in ('erp5_core','erp5_html_style'):
-            template = os.path.join(bootstrap_dir, bt)
-            if not os.path.exists(template):
-              template = os.path.join(bootstrap_dir, '%s.bt5' % bt)
-
-            id = template_tool.generateNewId()
-            template_tool.download(template, id=id)
-            template_tool[id].install(**kw)
+  klass = ERP5Site
 
+  def getBootstrapDirectory(self):
+    """
+      Return the name of the bootstrap directory
+    """
+    product_path = package_home(globals())
+    return os.path.join(product_path, 'bootstrap')
+
+  def create(self, parent, id, create_userfolder,
+              erp5_sql_connection_type, erp5_sql_connection_string,
+              cmf_activity_sql_connection_type,cmf_activity_sql_connection_string,
+              reindex=1,**kw):
+    LOG('setupTools, create',0,kw)
+    id = str(id)
+    portal = self.klass(id=id)
+    # Make sure reindex will not be called until business templates
+    # will be installed
+    setattr(portal,'isIndexable',0)
+    parent._setObject(id, portal)
+    # Return the fully wrapped object.
+    p = parent.this()._getOb(id)
+    p._setProperty('erp5_sql_connection_type', erp5_sql_connection_type, 'string')
+    p._setProperty('erp5_sql_connection_string', erp5_sql_connection_string, 'string')
+    p._setProperty('cmf_activity_sql_connection_type', cmf_activity_sql_connection_type, 'string')
+    p._setProperty('cmf_activity_sql_connection_string', cmf_activity_sql_connection_string, 'string')
+    p._setProperty('management_page_charset', 'UTF-8', 'string') # XXX hardcoded charset
+    self.setup(p, create_userfolder,**kw)
+    return p
+
+  def setupLastTools(self, p, **kw):
+    """
+      Set up finals tools
+      We want to set the activity tool only at the end to
+      make sure that we do not put un the queue the full reindexation
+    """
+    # Add Activity Tool
+    #LOG('setupTools, kw',0,kw)
+    if kw.has_key('create_activities') and int(kw['create_activities'])==1:
+      if not p.hasObject('portal_activities'):
+        addTool = p.manage_addProduct['CMFActivity'].manage_addTool
+        addTool('CMF Activity Tool', None) # Allow user to select active/passive
+      # Initialize Activities
+      portal_activities = getToolByName(p, 'portal_activities', None)
+      if portal_activities is not None:
+        if kw.get('update', 0):
+          keep = 1
+        else:
+          keep = 0
+        portal_activities.manageClearActivities(keep=keep)
 
+  def setupTemplateTool(self, p, **kw):
+    """
+      Setup the Template Tool. Security must be set strictly.
+    """
+    addTool = p.manage_addProduct['ERP5'].manage_addTool
+    addTool('ERP5 Template Tool', None)
+    context = p.portal_templates
+    permission_list = context.possible_permissions()
+    for permission in permission_list:
+      context.manage_permission(permission, ['Manager'], 0)
+
+  def setupTools(self, p,**kw):
+    """
+      Set up initial tools
+    """
 
+    if not 'portal_actions' in p.objectIds():
+      PortalGenerator.setupTools(self, p)
+
+    # It is better to remove portal_catalog which is ZCatalog as soon as possible,
+    # because the API is not the completely same as ERP5Catalog, and ZCatalog is
+    # useless for ERP5 after all.
+    update = kw.get('update', 0)
+    portal_catalog = getToolByName(p, 'portal_catalog', None)
+    if portal_catalog is not None and portal_catalog.meta_type != 'ZSQLCatalog' and not update:
+      p._delObject('portal_catalog')
+
+    # Add CMF Report Tool
+    if not p.hasObject('portal_report'):
+      addTool = p.manage_addProduct['CMFReportTool'].manage_addTool
+      addTool('CMF Report Tool', None)
+
+    # Add ERP5 Tools
+    addTool = p.manage_addProduct['ERP5'].manage_addTool
+    if not p.hasObject('portal_categories'):
+      addTool('ERP5 Categories', None)
+    if not p.hasObject('portal_rules'):
+      addTool('ERP5 Rule Tool', None)
+    if not p.hasObject('portal_ids'):
+      addTool('ERP5 Id Tool', None)
+    if not p.hasObject('portal_simulation'):
+      addTool('ERP5 Simulation Tool', None)
+    if not p.hasObject('portal_templates'):
+      self.setupTemplateTool(p)
+    if not p.hasObject('portal_trash'):
+      addTool('ERP5 Trash Tool', None)
+    if not p.hasObject('portal_alarms'):
+      addTool('ERP5 Alarm Tool', None)
+    if not p.hasObject('portal_domains'):
+      addTool('ERP5 Domain Tool', None)
+    if not p.hasObject('portal_deliveries'):
+      addTool('ERP5 Delivery Tool', None)
+    if not p.hasObject('portal_orders'):
+      addTool('ERP5 Order Tool', None)
+
+    try:
+      addTool = p.manage_addProduct['ERP5Subversion'].manage_addTool
+      if not p.hasObject('portal_subversion'):
+        addTool('ERP5 Subversion Tool', None)
+    except AttributeError:
+      pass
+
+    # Add ERP5Type Tools
+    addTool = p.manage_addProduct['ERP5Type'].manage_addTool
+    if not p.hasObject('portal_classes'):
+      if allowClassTool():
+        addTool('ERP5 Class Tool', None)
+      else:
+        addTool('ERP5 Dummy Class Tool', None)
+
+    # Add ERP5 SQL Catalog Tool
+    addTool = p.manage_addProduct['ERP5Catalog'].manage_addTool
+    if not p.hasObject('portal_catalog'):
+      addTool('ERP5 Catalog', None)
+    # Add Default SQL connection
+    if p.erp5_sql_connection_type == 'Z MySQL Database Connection':
+      if not p.hasObject('erp5_sql_connection'):
+        addSQLConnection = p.manage_addProduct['ZSQLMethods'].manage_addZMySQLConnection
+        addSQLConnection('erp5_sql_connection', 'ERP5 SQL Server Connection', p.erp5_sql_connection_string)
+    elif p.erp5_sql_connection_type == 'Z Gadfly':
+      pass
+    if p.cmf_activity_sql_connection_type == 'Z MySQL Database Connection':
+      if not p.hasObject('cmf_activity_sql_connection'):
+        addSQLConnection = p.manage_addProduct['ZSQLMethods'].manage_addZMySQLConnection
+        addSQLConnection('cmf_activity_sql_connection', 'CMF Activity SQL Server Connection', p.cmf_activity_sql_connection_string)
+    elif p.cmf_activity_sql_connection_type == 'Z Gadfly':
+      pass
+
+    portal_catalog = getToolByName(p, 'portal_catalog')
+    if not portal_catalog.getSQLCatalog('erp5_mysql') and not update:
+      # Add a default SQL Catalog
+      #addSQLCatalog = portal_catalog.manage_addProduct['ZSQLCatalog']\
+      #                                .manage_addSQLCatalog
+      #addSQLCatalog('erp5_mysql', '')
+      #portal_catalog.default_sql_catalog_id = 'erp5_mysql'
+      portal_catalog.addDefaultSQLMethods()
+      portal_catalog.manage_catalogClear()
+
+    # Add ERP5Form Tools
+    addTool = p.manage_addProduct['ERP5Form'].manage_addTool
+    if not p.hasObject('portal_selections'):
+      addTool('ERP5 Selections', None)
+    if not p.hasObject('portal_preferences'):
+      addTool('ERP5 Preference Tool', None)
+
+    # Add ERP5SyncML Tools
+    addTool = p.manage_addProduct['ERP5SyncML'].manage_addTool
+    if not p.hasObject('portal_synchronizations'):
+      addTool('ERP5 Synchronizations', None)
+
+    # Add Message Catalog
+    if not 'Localizer' in p.objectIds():
+      addLocalizer = p.manage_addProduct['Localizer'].manage_addLocalizer
+      addLocalizer('', ('en',))
+    localizer = getToolByName(p, 'Localizer')
+    addMessageCatalog = localizer.manage_addProduct['Localizer']\
+                                      .manage_addMessageCatalog
+    if 'erp5_ui' not in localizer.objectIds():
+      if 'default' in localizer.objectIds():
+        localizer.manage_delObjects('default')
+      addMessageCatalog('default', 'ERP5 Localized Messages', ('en',))
+      addMessageCatalog('erp5_ui', 'ERP5 Localized Interface', ('en',))
+      addMessageCatalog('erp5_content', 'ERP5 Localized Content', ('en',))
+
+
+  def setupMembersFolder(self, p):
+    """
+      ERP5 is not a CMS
+    """
+    pass
+
+  def setupDefaultSkins(self, p):
+    from Products.CMFCore.DirectoryView import addDirectoryViews
+    from Products.CMFDefault import cmfdefault_globals
+    from Products.CMFActivity import cmfactivity_globals
+    ps = getToolByName(p, 'portal_skins')
+    # Do not use filesystem skins for ERP5 any longer.
+    # addDirectoryViews(ps, 'skins', globals())
+    # addDirectoryViews(ps, path.join('skins','pro'), globals())
+    addDirectoryViews(ps, 'skins', cmfdefault_globals)
+    addDirectoryViews(ps, 'skins', cmfactivity_globals)
+    ps.manage_addProduct['OFSP'].manage_addFolder(id='external_method')
+    ps.manage_addProduct['OFSP'].manage_addFolder(id='custom')
+    # set the 'custom' layer a high priority, so it remains the first
+    # layer when installing new business templates
+    ps['custom'].manage_addProperty(
+        "business_template_skin_layer_priority", 100.0, "float")
+    ps.addSkinSelection('View', 'custom, external_method, activity, '
+                              + 'zpt_content, zpt_generic,'
+                              + 'zpt_control, content, generic, control, Images',
+                        make_default=1)
+    ps.addSkinSelection('Print', 'custom, external_method, activity, '
+                              + 'zpt_content, zpt_generic,'
+                              + 'zpt_control, content, generic, control, Images',
+                        make_default=0)
+    ps.addSkinSelection('CSV', 'custom, external_method, activity, '
+                              + 'zpt_content, zpt_generic,'
+                              + 'zpt_control, content, generic, control, Images',
+                        make_default=0)
+    p.setupCurrentSkin()
+
+  def setupWorkflow(self, p):
+    """
+      Set up workflows for business templates
+    """
+    tool = getToolByName(p, 'portal_workflow', None)
+    if tool is None:
+        return
+    for wf_id in ('business_template_building_workflow', 'business_template_installation_workflow'):
+      if wf_id in tool.objectIds():
+        tool.manage_delObjects([wf_id])
+    bootstrap_dir = self.getBootstrapDirectory()
+    business_template_building_workflow = os.path.join(bootstrap_dir,
+                                                        'business_template_building_workflow.xml')
+    tool._importObjectFromFile(business_template_building_workflow)
+    business_template_installation_workflow = os.path.join(bootstrap_dir,
+                                                            'business_template_installation_workflow.xml')
+    tool._importObjectFromFile(business_template_installation_workflow)
+    tool.setChainForPortalTypes( ( 'Business Template', ),
+                                  ( 'business_template_building_workflow',
+                                    'business_template_installation_workflow' ) )
+    pass
+
+  def setupIndex(self, p, **kw):
+    # Make sure all tools and folders have been indexed
+    if kw.has_key('reindex') and kw['reindex']==0:
+      return
+    skins_tool = getToolByName(p, 'portal_skins', None)
+    if skins_tool is None:
+      return
+    setattr(p,'isIndexable',1)
+    portal_catalog = p.portal_catalog
+    portal_catalog.manage_catalogClear()
+    skins_tool["erp5_core"].ERP5Site_reindexAll()
+
+  def setupUserFolder(self, p):
+    # We use if possible ERP5Security, then NuxUserGroups
+    try:
+      from Products import ERP5Security
+      from Products import PluggableAuthService
+    except ImportError:
+      ERP5Security = None
+      try:
+        import Products.NuxUserGroups
+        withnuxgroups = 1
+      except ImportError:
+        withnuxgroups = 0
+    if ERP5Security is not None:
+      # Use Pluggable Auth Service instead of the standard acl_users.
+      p.manage_addProduct['PluggableAuthService'].addPluggableAuthService()
+      # Add legacy ZODB support
+      p.acl_users.manage_addProduct['PluggableAuthService'].addZODBUserManager('zodb_users')
+      p.acl_users.manage_addProduct['PluggableAuthService'].addZODBGroupManager('zodb_groups')
+      p.acl_users.manage_addProduct['PluggableAuthService'].addZODBRoleManager('zodb_roles')
+      # Add CMF Portal Roles
+      #XXX Maybe it will no longer be required once PAS is the standard
+      p.acl_users.zodb_roles.addRole('Member')
+      p.acl_users.zodb_roles.addRole('Reviewer')
+      # Register ZODB Interface
+      p.acl_users.zodb_users.manage_activateInterfaces(('IAuthenticationPlugin',
+                                                    'IUserEnumerationPlugin','IUserAdderPlugin'))
+      p.acl_users.zodb_groups.manage_activateInterfaces(('IGroupsPlugin',
+                                                    'IGroupEnumerationPlugin'))
+      p.acl_users.zodb_roles.manage_activateInterfaces(('IRoleEnumerationPlugin',
+                                                    'IRolesPlugin', 'IRoleAssignerPlugin'))
+      # Add ERP5UserManager
+      p.acl_users.manage_addProduct['ERP5Security'].addERP5UserManager('erp5_users')
+      p.acl_users.manage_addProduct['ERP5Security'].addERP5GroupManager('erp5_groups')
+      p.acl_users.manage_addProduct['ERP5Security'].addERP5RoleManager('erp5_roles')
+      # Register ERP5UserManager Interface
+      p.acl_users.erp5_users.manage_activateInterfaces(('IAuthenticationPlugin',
+                                                        'IUserEnumerationPlugin',))
+      p.acl_users.erp5_groups.manage_activateInterfaces(('IGroupsPlugin',))
+      p.acl_users.erp5_roles.manage_activateInterfaces(('IRolesPlugin',))
+    elif withnuxgroups:
+      # NuxUserGroups user folder
+      p.manage_addProduct['NuxUserGroups'].addUserFolderWithGroups()
+    else:
+      # Standard user folder
+      PortalGenerator.setupUserFolder(self, p)
+
+  def setupPermissions(self, p):
+    permission_dict = {
+      'Access Transient Objects'     : ('Manager', 'Anonymous'),
+      'Access contents information'  : ('Manager', 'Member', 'Anonymous'),
+      'Access future portal content' : ('Manager', 'Reviewer'),
+      'Access session data'          : ('Manager', 'Anonymous'),
+      'AccessContentsInformation'    : ('Manager', 'Member'),
+      'Add portal content'           : ('Manager', 'Owner'),
+      'Add portal folders'           : ('Manager', 'Owner'),
+      'Delete objects'               : ('Manager', 'Owner'),
+      'FTP access'                   : ('Manager', 'Owner'),
+      'List folder contents'         : ('Manager', 'Member'),
+      'List portal members'          : ('Manager', 'Member'),
+      'List undoable changes'        : ('Manager', 'Member'),
+      'Manage properties'            : ('Manager', 'Owner'),
+      'Modify portal content'        : ('Manager', 'Owner'),
+      'Reply to item'                : ('Manager', 'Member'),
+      'Review portal content'        : ('Manager', 'Reviewer'),
+      'Search ZCatalog'              : ('Manager', 'Member'),
+      'Set own password'             : ('Manager',),
+      'Set own properties'           : ('Manager', 'Member'),
+      'Undo changes'                 : ('Manager', 'Owner'),
+      'View'                         : ('Manager', 'Member', 'Owner', 'Anonymous'),
+      'View management screens'      : ('Manager', 'Owner')
+    }
+
+    for permission in p.ac_inherited_permissions(1):
+      name = permission[0]
+      role_list = permission_dict.get(name, ('Manager',))
+      p.manage_permission(name, roles=role_list, acquire=0)
+
+  def setup(self, p, create_userfolder, **kw):
+    update = kw.get('update', 0)
+
+    self.setupTools(p, **kw)
+
+    if not p.hasObject('MailHost'):
+      self.setupMailHost(p)
+
+    if int(create_userfolder) != 0 and not p.hasObject('acl_users'):
+      self.setupUserFolder(p)
+
+    if not p.hasObject('cookie_authentication'):
+      self.setupCookieAuth(p)
+
+    if 'Member' not in getattr(p, '__ac_roles__', ()):
+      self.setupRoles(p)
+
+    if not update:
+      self.setupPermissions(p)
+      self.setupDefaultSkins(p)
+
+    self.setupLastTools(p, **kw)
+
+    # Finish setup
+    if not p.hasObject('Members'):
+      self.setupMembersFolder(p)
+
+    # ERP5 Design Choice is that all content should be user defined
+    # Content is disseminated through business templates
+    self.setupBusinessTemplate(p)
+
+    if not p.hasObject('content_type_registry'):
+      self.setupMimetypes(p)
+    if not update:
+      self.setupWorkflow(p)
+
+    if not update:
+      self.setupERP5Core(p,**kw)
+
+    # Make sure tools are cleanly indexed with a uid before creating children
+    # XXX for some strange reason, member was indexed 5 times
+    if not update:
+      self.setupIndex(p, **kw)
+
+  def setupBusinessTemplate(self,p):
+    """
+      Install the portal_type of Business Template
+    """
+    tool = getToolByName(p, 'portal_types', None)
+    if tool is None:
+      return
+    if 'Business Template' not in tool.objectIds():
+      t = BusinessTemplate.factory_type_information
+      ti = apply(ERP5TypeInformation, (), t)
+      tool._setObject(t['id'], ti)
+
+  def setupERP5Core(self,p,**kw):
+    """
+      Install the core part of ERP5
+    """
+    template_tool = getToolByName(p, 'portal_templates', None)
+    if template_tool is None:
+      return
+    if template_tool.getInstalledBusinessTemplate('erp5_core') is None:
+      bootstrap_dir = self.getBootstrapDirectory()
+      for bt in ('erp5_core','erp5_html_style'):
+        template = os.path.join(bootstrap_dir, bt)
+        if not os.path.exists(template):
+          template = os.path.join(bootstrap_dir, '%s.bt5' % bt)
+
+        id = template_tool.generateNewId()
+        template_tool.download(template, id=id)
+        template_tool[id].install(**kw)
-- 
2.30.9