[Erp5-report] r8380 - /erp5/trunk/products/ERP5/Document/BusinessTemplate.py
nobody at svn.erp5.org
nobody at svn.erp5.org
Tue Jul 11 11:01:50 CEST 2006
Author: romain
Date: Tue Jul 11 11:01:42 2006
New Revision: 8380
URL: http://svn.erp5.org?rev=8380&view=rev
Log:
Add PreferenceTemplateItem.
Do not export an installed Business Template.
Fix methods when no SQL connection is available.
--Cette ligne et les suivantes ci-dessous, seront ignorées--
M BusinessTemplate.py
Modified:
erp5/trunk/products/ERP5/Document/BusinessTemplate.py
Modified: erp5/trunk/products/ERP5/Document/BusinessTemplate.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/BusinessTemplate.py?rev=8380&r1=8379&r2=8380&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/BusinessTemplate.py (original)
+++ erp5/trunk/products/ERP5/Document/BusinessTemplate.py Tue Jul 11 11:01:42 2006
@@ -67,7 +67,7 @@
XMLExportImport.magic: XMLExportImport.importXML,
}
-from zLOG import LOG
+from zLOG import LOG, WARNING, ERROR, INFO
from OFS.ObjectManager import customImporters
from gzip import GzipFile
from xml.dom.minidom import parse
@@ -542,8 +542,9 @@
else:
action = 'backup'
# get subobjects in path
- container_path = path.split('/')[:-1]
- object_id = path.split('/')[-1]
+ path_list = path.split('/')
+ container_path = path_list[:-1]
+ object_id = path_list[-1]
try:
container = portal.unrestrictedTraverse(container_path)
except KeyError:
@@ -557,7 +558,8 @@
subobjects_dict = {}
# Object already exists
if object_id in container_ids:
- subobjects_dict = self._backupObject(action, trashbin, container_path, object_id)
+ subobjects_dict = self._backupObject(action, trashbin,
+ container_path, object_id)
container.manage_delObjects([object_id])
# install object
obj = self._objects[path]
@@ -565,7 +567,8 @@
if getattr(obj, '_code') is None:
obj._compile()
if hasattr(aq_base(obj), 'groups'):
- # we must keep original order groups because they change when we add subobjects
+ # we must keep original order groups
+ # because they change when we add subobjects
groups[path] = deepcopy(obj.groups)
# copy the object
obj = obj._getCopy(container)
@@ -574,11 +577,16 @@
obj.manage_afterClone(obj)
obj.wl_clearLocks()
# if portal types upgrade, set backup properties
- if getattr(obj, 'meta_type', None) == 'ERP5 Type Information' and len(subobjects_dict) > 0:
- setattr(obj, 'allowed_content_types', subobjects_dict['allowed_content_type_list'] or [])
- setattr(obj, 'hidden_content_type_list', subobjects_dict['hidden_content_type_list'] or [])
- setattr(obj, 'property_sheet_list', subobjects_dict['property_sheet_list'] or [])
- setattr(obj, 'base_category_list', subobjects_dict['base_category_list'] or [])
+ if getattr(obj, 'meta_type', None) == 'ERP5 Type Information' and \
+ len(subobjects_dict) > 0:
+ setattr(obj, 'allowed_content_types',
+ subobjects_dict['allowed_content_type_list'] or [])
+ setattr(obj, 'hidden_content_type_list',
+ subobjects_dict['hidden_content_type_list'] or [])
+ setattr(obj, 'property_sheet_list',
+ subobjects_dict['property_sheet_list'] or [])
+ setattr(obj, 'base_category_list',
+ subobjects_dict['base_category_list'] or [])
setattr(obj, '_roles', subobjects_dict['roles_list'] or [])
# set actions
action_list = subobjects_dict['action_list']
@@ -618,7 +626,8 @@
# It is necessary to make sure that the sql connection
# in this method is valid.
sql_connection_list = portal.objectIds(spec=('Z MySQL Database Connection',))
- if obj.connection_id not in sql_connection_list:
+ if (obj.connection_id not in sql_connection_list) and \
+ (len(sql_connection_list) != 0):
obj.connection_id = sql_connection_list[0]
# now put original order group
for path in groups.keys():
@@ -706,7 +715,9 @@
object_id = relative_url.split('/')[-1]
container = portal.unrestrictedTraverse(container_path)
if trash and trashbin is not None:
- self.portal_trash.backupObject(trashbin, container_path, object_id, save=1, keep_subobjects=1)
+ self.portal_trash.backupObject(trashbin, container_path,
+ object_id, save=1,
+ keep_subobjects=1)
container.manage_delObjects([object_id])
except (NotFound, KeyError):
# object is already backup and/or removed
@@ -737,7 +748,9 @@
path_list = []
for object_id in fnmatch.filter(folder.objectIds(), id):
if object_id != "":
- path_list.extend(self._resolvePath(folder._getOb(object_id), relative_url_list + [object_id], id_list[1:]))
+ path_list.extend(self._resolvePath(
+ folder._getOb(object_id),
+ relative_url_list + [object_id], id_list[1:]))
return path_list
def build(self, context, **kw):
@@ -767,6 +780,44 @@
obj.groups = groups
self._objects[relative_url] = obj
obj.wl_clearLocks()
+
+class PreferenceTemplateItem(PathTemplateItem):
+ """
+ This class is used to store preference objects
+ """
+ def _resolvePath(self, folder, relative_url_list, id_list):
+ """
+ This method calls itself recursively.
+
+ The folder is the current object which contains sub-objects.
+ The list of ids are path components. If the list is empty,
+ the current folder is valid.
+ """
+ if relative_url_list != []:
+ LOG("PreferenceTemplateItem, _resolvePath", WARNING,
+ "Should be empty")
+ if len(id_list) is not None:
+ LOG("PreferenceTemplateItem, _resolvePath", WARNING,
+ "Should contain only one element")
+ # XXX hardcoded
+ return ['portal_preferences/%s' % id_list[0]]
+
+ def install(self, context, trashbin, **kw):
+ """
+ Enable Preference
+ """
+ PathTemplateItem.install(self, context, trashbin, **kw)
+ portal = context.getPortalObject()
+ for object_path in self._objects.keys():
+ object = portal.unrestrictedTraverse(object_path)
+ # XXX getPreferenceState is a bad name
+ if object.getPreferenceState() == 'disabled':
+ object.portal_workflow.doActionFor(
+ object,
+ 'enable_action',
+ wf_id='preference_workflow',
+ comment="Initialized during Business Template " \
+ "installation.")
class CategoryTemplateItem(ObjectTemplateItem):
@@ -936,7 +987,8 @@
for relative_url in self._archive.keys():
folder = p.unrestrictedTraverse(relative_url)
for obj in folder.objectValues(spec=('Z SQL Method',)):
- if obj.connection_id not in sql_connection_list:
+ if (obj.connection_id not in sql_connection_list) and \
+ (len(sql_connection_list) != 0):
obj.connection_id = sql_connection_list[0]
# Add new folders into skin paths.
ps = p.portal_skins
@@ -1193,6 +1245,12 @@
keys.sort()
for key in keys:
workflow_list = self._objects[key]
+ # XXX Not always a list
+ if isinstance(workflow_list, str):
+ LOG("BusinessTemplate, generateXml.", ERROR,
+ "A list was expected instead of %s for key %s." % \
+ (workflow_list, key))
+ workflow_list = [workflow_list]
xml_data += os.linesep+' <chain>'
xml_data += os.linesep+' <type>%s</type>' %(key,)
xml_data += os.linesep+' <workflow>%s</workflow>' %(', '.join(workflow_list))
@@ -1467,6 +1525,7 @@
def build(self, context, **kw):
ObjectTemplateItem.build(self, context, **kw)
+
try:
catalog = context.portal_catalog.getSQLCatalog()
except KeyError:
@@ -1496,6 +1555,14 @@
catalog.filter_dict[method_id]['type']
def export(self, context, bta, **kw):
+ try:
+ catalog = context.portal_catalog.getSQLCatalog()
+ except KeyError:
+ catalog = None
+ if catalog is None:
+ LOG('BusinessTemplate, export', 0, 'no SQL catalog was available')
+ return
+
if len(self._objects.keys()) == 0:
return
root_path = os.path.join(bta.path, self.__class__.__name__)
@@ -3607,6 +3674,7 @@
'_module_item',
'_skin_item',
'_path_item',
+ '_preference_item',
'_action_item',
'_portal_type_roles_item',
'_local_roles_item',
@@ -3667,7 +3735,8 @@
"""
Copy existing portal objects to self
"""
- if no_action: return # this is use at import of Business Template to get the status built
+ if no_action: return
+ # this is use at import of Business Template to get the status built
# Make sure that everything is sane.
self.clean()
@@ -3738,6 +3807,8 @@
self.getTemplatePortalTypeBaseCategoryList())
self._path_item = \
PathTemplateItem(self.getTemplatePathList())
+ self._preference_item = \
+ PreferenceTemplateItem(self.getTemplatePreferenceList())
self._catalog_keyword_key_item = \
CatalogKeywordKeyTemplateItem(
self.getTemplateCatalogKeywordKeyList())
@@ -3916,7 +3987,7 @@
break
if update_catalog:
catalog = local_configuration.portal_catalog.getSQLCatalog()
- if catalog is None:
+ if (catalog is None) or (not site.isIndexable):
LOG('Business Template', 0, 'no SQL Catalog available')
update_catalog = 0
else:
@@ -4084,6 +4155,7 @@
if result != ():
result = list(result)
result.sort()
+ # XXX Why do we need to return a tuple ?
result = tuple(result)
return result
@@ -4129,67 +4201,74 @@
"""
return self._getOrderedList('template_path')
- def getTemplatePortalTypeAllowedContentTypeList(self):
+ def getTemplatePreferenceList(self):
"""
We have to set this method because we want an
ordered list
"""
- return self._getOrderedList('template_portal_type_allowed_content_type')
-
- def getTemplatePortalTypeHiddenContentTypeList(self):
+ return self._getOrderedList('template_preference')
+
+ def getTemplatePortalTypeAllowedContentTypeList(self):
"""
We have to set this method because we want an
ordered list
"""
- return self._getOrderedList('template_portal_type_hidden_content_type')
-
- def getTemplatePortalTypePropertySheetList(self):
+ return self._getOrderedList('template_portal_type_allowed_content_type')
+
+ def getTemplatePortalTypeHiddenContentTypeList(self):
"""
We have to set this method because we want an
ordered list
"""
- return self._getOrderedList('template_portal_type_property_sheet')
-
- def getTemplatePortalTypeBaseCategoryList(self):
+ return self._getOrderedList('template_portal_type_hidden_content_type')
+
+ def getTemplatePortalTypePropertySheetList(self):
"""
We have to set this method because we want an
ordered list
"""
- return self._getOrderedList('template_portal_type_base_category')
-
- def getTemplateActionPathList(self):
+ return self._getOrderedList('template_portal_type_property_sheet')
+
+ def getTemplatePortalTypeBaseCategoryList(self):
"""
We have to set this method because we want an
ordered list
"""
- return self._getOrderedList('template_action_path')
-
- def getTemplatePortalTypeRolesList(self):
+ return self._getOrderedList('template_portal_type_base_category')
+
+ def getTemplateActionPathList(self):
"""
We have to set this method because we want an
ordered list
"""
- return self._getOrderedList('template_portal_type_roles')
-
- def getTemplateSkinIdList(self):
+ return self._getOrderedList('template_action_path')
+
+ def getTemplatePortalTypeRolesList(self):
"""
We have to set this method because we want an
ordered list
"""
- return self._getOrderedList('template_skin_id')
-
- def getTemplateModuleIdList(self):
+ return self._getOrderedList('template_portal_type_roles')
+
+ def getTemplateSkinIdList(self):
"""
We have to set this method because we want an
ordered list
"""
- return self._getOrderedList('template_module_id')
-
- def getTemplateMessageTranslationList(self):
+ return self._getOrderedList('template_skin_id')
+
+ def getTemplateModuleIdList(self):
"""
We have to set this method because we want an
ordered list
"""
+ return self._getOrderedList('template_module_id')
+
+ def getTemplateMessageTranslationList(self):
+ """
+ We have to set this method because we want an
+ ordered list
+ """
return self._getOrderedList('template_message_translation')
security.declareProtected(Permissions.ManagePortal, 'export')
@@ -4198,7 +4277,11 @@
Export this Business Template
"""
if self.getBuildingState() != 'built':
- raise TemplateConditionError, 'Business Template must be build before export'
+ raise TemplateConditionError, \
+ 'Business Template must be build before export'
+ if self.getInstallationState() == 'installed':
+ raise TemplateConditionError, \
+ 'Can not export installed Business Template'
if local:
# we export into a folder tree
@@ -4212,13 +4295,15 @@
for prop in self.propertyMap():
prop_type = prop['type']
id = prop['id']
- if id in ('id', 'uid', 'rid', 'sid', 'id_group', 'last_id', 'install_object_list_list'):
+ if id in ('id', 'uid', 'rid', 'sid', 'id_group', 'last_id',
+ 'install_object_list_list'):
continue
value = self.getProperty(id)
if prop_type in ('text', 'string', 'int', 'boolean'):
bta.addObject(obj=value, name=id, path=path+os.sep+'bt', ext='')
elif prop_type in ('lines', 'tokens'):
- bta.addObject(obj=str(os.linesep).join(value), name=id, path=path+os.sep+'bt', ext='')
+ bta.addObject(obj=str(os.linesep).join(value), name=id,
+ path=path+os.sep+'bt', ext='')
# Export each part
for item_name in self._item_name_list:
@@ -4284,6 +4369,8 @@
self.getTemplateMessageTranslationList())
self._path_item = \
PathTemplateItem(self.getTemplatePathList())
+ self._preference_item = \
+ PreferenceTemplateItem(self.getTemplatePreferenceList())
self._portal_type_allowed_content_type_item = \
PortalTypeAllowedContentTypeTemplateItem(
self.getTemplatePortalTypeAllowedContentTypeList())
@@ -4356,6 +4443,7 @@
'Module' : '_module_item',
'Skin' : '_skin_item',
'Path' : '_path_item',
+ 'Preference' : '_preference_item',
'Action' : '_action_item',
'PortalTypeRoles' : '_portal_type_roles_item',
'LocalRoles' : '_local_roles_item',
@@ -4406,14 +4494,34 @@
diff_msg = ''
# Real Zope Objects (can be exported into XML directly by Zope)
- item_list_1 = ['_product_item', '_workflow_item', '_portal_type_item', '_category_item', '_path_item',
+ # XXX Bad naming
+ item_list_1 = ['_product_item', '_workflow_item', '_portal_type_item',
+ '_category_item', '_path_item', '_preference_tem',
'_skin_item', '_action_item',]
# Not considered as objects by Zope (will be exported into XML manually)
- item_list_2 = ['_site_property_item', '_module_item', '_catalog_result_key_item', '_catalog_related_key_item', '_catalog_result_table_item', '_catalog_keyword_key_item', '_catalog_full_text_key_item', '_catalog_request_key_item', '_catalog_multivalue_key_item', '_catalog_topic_key_item', '_portal_type_allowed_content_type_item', '_portal_type_hidden_content_type_item', '_portal_type_property_sheet_item', '_portal_type_roles_item', '_portal_type_base_category_item', '_local_roles_item', '_portal_type_workflow_chain_item',]
+ # XXX Bad naming
+ item_list_2 = ['_site_property_item', '_module_item',
+ '_catalog_result_key_item', '_catalog_related_key_item',
+ '_catalog_result_table_item',
+ '_catalog_keyword_key_item',
+ '_catalog_full_text_key_item',
+ '_catalog_request_key_item',
+ '_catalog_multivalue_key_item',
+ '_catalog_topic_key_item',
+ '_portal_type_allowed_content_type_item',
+ '_portal_type_hidden_content_type_item',
+ '_portal_type_property_sheet_item',
+ '_portal_type_roles_item',
+ '_portal_type_base_category_item',
+ '_local_roles_item',
+ '_portal_type_workflow_chain_item',]
# Text objects (no need to export them into XML)
- item_list_3 = ['_document_item', '_property_sheet_item', '_constraint_item', '_extension_item', '_test_item', '_message_translation_item',]
+ # XXX Bad naming
+ item_list_3 = ['_document_item', '_property_sheet_item',
+ '_constraint_item', '_extension_item',
+ '_test_item', '_message_translation_item',]
if item_name in item_list_1:
f1 = StringIO() # for XML export of New Object
More information about the Erp5-report
mailing list