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