From 020473fa14233690c062e95c382896ac154beb0d Mon Sep 17 00:00:00 2001 From: Arnaud Fontaine <arnaud.fontaine@nexedi.com> Date: Thu, 12 Dec 2013 11:34:02 +0100 Subject: [PATCH] Reindent code following removal of Business Template format version 0. --- product/ERP5/Document/BusinessTemplate.py | 1355 ++++++++++----------- product/ERP5/Tool/TemplateTool.py | 71 +- 2 files changed, 705 insertions(+), 721 deletions(-) diff --git a/product/ERP5/Document/BusinessTemplate.py b/product/ERP5/Document/BusinessTemplate.py index 38073ba956..9faab34a74 100644 --- a/product/ERP5/Document/BusinessTemplate.py +++ b/product/ERP5/Document/BusinessTemplate.py @@ -472,22 +472,21 @@ class BaseTemplateItem(Implicit, Persistent): XXX: -12 used here is -len('TemplateItem') """ modified_object_list = {} - if 1: - for path in self._objects: - if installed_item._objects.has_key(path): - # compare objects to see it there are changes - new_obj_xml = self.generateXml(path=path) - old_obj_xml = installed_item.generateXml(path=path) - if new_obj_xml != old_obj_xml: - modified_object_list.update({path : ['Modified', self.__class__.__name__[:-12]]}) - # else, compared versions are identical, don't overwrite the old one - else: # new object - modified_object_list.update({path : ['New', self.__class__.__name__[:-12]]}) - # list removed objects - old_keys = installed_item._objects.keys() - for path in old_keys: - if path not in self._objects: - modified_object_list.update({path : ['Removed', self.__class__.__name__[:-12]]}) + for path in self._objects: + if installed_item._objects.has_key(path): + # compare objects to see it there are changes + new_obj_xml = self.generateXml(path=path) + old_obj_xml = installed_item.generateXml(path=path) + if new_obj_xml != old_obj_xml: + modified_object_list.update({path : ['Modified', self.__class__.__name__[:-12]]}) + # else, compared versions are identical, don't overwrite the old one + else: # new object + modified_object_list.update({path : ['New', self.__class__.__name__[:-12]]}) + # list removed objects + old_keys = installed_item._objects.keys() + for path in old_keys: + if path not in self._objects: + modified_object_list.update({path : ['Removed', self.__class__.__name__[:-12]]}) return modified_object_list def install(self, context, trashbin, **kw): @@ -817,43 +816,42 @@ class ObjectTemplateItem(BaseTemplateItem): def preinstall(self, context, installed_item, **kw): modified_object_list = {} - if 1: - upgrade_list = [] - type_name = self.__class__.__name__.split('TemplateItem')[-2] - for path, obj in self._objects.iteritems(): - if installed_item._objects.has_key(path): - upgrade_list.append((path, installed_item._objects[path])) - else: # new object - modified_object_list[path] = 'New', type_name + upgrade_list = [] + type_name = self.__class__.__name__.split('TemplateItem')[-2] + for path, obj in self._objects.iteritems(): + if installed_item._objects.has_key(path): + upgrade_list.append((path, installed_item._objects[path])) + else: # new object + modified_object_list[path] = 'New', type_name - # update _p_jar property of objects cleaned by removeProperties - transaction.savepoint(optimistic=True) - for path, old_object in upgrade_list: - # compare object to see it there is changes - new_object = self._objects[path] - new_io = StringIO() - old_io = StringIO() - OFS.XMLExportImport.exportXML(new_object._p_jar, new_object._p_oid, new_io) - new_obj_xml = new_io.getvalue() - try: - OFS.XMLExportImport.exportXML(old_object._p_jar, old_object._p_oid, old_io) - old_obj_xml = old_io.getvalue() - except (ImportError, UnicodeDecodeError), e: # module is already - # removed etc. - old_obj_xml = '(%s: %s)' % (e.__class__.__name__, e) - new_io.close() - old_io.close() - if new_obj_xml != old_obj_xml: - if context.isKeepObject(path): - modified_object_list[path] = 'Modified but should be kept', type_name - else: - modified_object_list[path] = 'Modified', type_name - # get removed object - for path in set(installed_item._objects) - set(self._objects): + # update _p_jar property of objects cleaned by removeProperties + transaction.savepoint(optimistic=True) + for path, old_object in upgrade_list: + # compare object to see it there is changes + new_object = self._objects[path] + new_io = StringIO() + old_io = StringIO() + OFS.XMLExportImport.exportXML(new_object._p_jar, new_object._p_oid, new_io) + new_obj_xml = new_io.getvalue() + try: + OFS.XMLExportImport.exportXML(old_object._p_jar, old_object._p_oid, old_io) + old_obj_xml = old_io.getvalue() + except (ImportError, UnicodeDecodeError), e: # module is already + # removed etc. + old_obj_xml = '(%s: %s)' % (e.__class__.__name__, e) + new_io.close() + old_io.close() + if new_obj_xml != old_obj_xml: if context.isKeepObject(path): - modified_object_list[path] = 'Removed but should be kept', type_name + modified_object_list[path] = 'Modified but should be kept', type_name else: - modified_object_list[path] = 'Removed', type_name + modified_object_list[path] = 'Modified', type_name + # get removed object + for path in set(installed_item._objects) - set(self._objects): + if context.isKeepObject(path): + modified_object_list[path] = 'Removed but should be kept', type_name + else: + modified_object_list[path] = 'Removed', type_name return modified_object_list def _backupObject(self, action, trashbin, container_path, object_id, **kw): @@ -999,332 +997,332 @@ class ObjectTemplateItem(BaseTemplateItem): self.beforeInstall() update_dict = kw.get('object_to_update') force = kw.get('force') - if 1: - def recurse(hook, document, prefix=''): - my_prefix = '%s/%s' % (prefix, document.id) - if (hook(document, my_prefix)): - for subdocument in document.objectValues(): - recurse(hook, subdocument, my_prefix) - def saveHook(document, prefix): - uid = getattr(aq_base(document), 'uid', None) - if uid is None: - return 0 - else: - saved_uid_dict[prefix] = uid - return 1 - def restoreHook(document, prefix): - uid = saved_uid_dict.get(prefix) - if uid is None: - return 0 - else: - document.uid = uid - return 1 - groups = {} - old_groups = {} - portal = context.getPortalObject() - # set safe activities execution order - original_reindex_parameters = self.setSafeReindexationMode(context) - object_key_list = self._getObjectKeyList() - for path in object_key_list: - __traceback_info__ = path - # We do not need to perform any backup because the object was - # created during the Business Template installation - if update_dict.get(path) == 'migrate': - continue - if update_dict.has_key(path) or force: - # get action for the oject - action = 'backup' - if not force: - action = update_dict[path] - if action == 'nothing': - continue - # get subobjects in path - path_list = path.split('/') - container_path = path_list[:-1] - object_id = path_list[-1] - try: - container = self.unrestrictedResolveValue(portal, container_path) - except KeyError: - # parent object can be set to nothing, in this case just go on - container_url = '/'.join(container_path) - if update_dict.get(container_url) == 'nothing': - continue - # If container's container is portal_catalog, - # then automatically create the container. - elif len(container_path) > 1 and container_path[-2] == 'portal_catalog': - # The id match, but better double check with the meta type - # while avoiding the impact of systematic check - container_container = portal.unrestrictedTraverse(container_path[:-1]) - if container_container.meta_type == 'ERP5 Catalog': - container_container.manage_addProduct['ZSQLCatalog'].manage_addSQLCatalog(id=container_path[-1], title='') - if len(container_container.objectIds()) == 1: - container_container.default_sql_catalog_id = container_path[-1] - container = portal.unrestrictedTraverse(container_path) - else: - raise - saved_uid_dict = {} - subobjects_dict = {} - portal_type_dict = {} - old_obj = container._getOb(object_id, None) - object_existed = old_obj is not None - if object_existed: - if context.isKeepObject(path) and force: - # do nothing if the object is specified in keep list in - # force mode. - continue - # Object already exists - recurse(saveHook, old_obj) - if getattr(aq_base(old_obj), 'groups', None) is not None: - # we must keep original order groups - # from old form in case we keep some - # old widget, thus we can readd them in - # the right order group - old_groups[path] = deepcopy(old_obj.groups) - subobjects_dict = self._backupObject(action, trashbin, - container_path, object_id) - # in case of portal types, we want to keep some properties - if interfaces.ITypeProvider.providedBy(container): - for attr in ('allowed_content_types', - 'hidden_content_type_list', - 'property_sheet_list', - 'base_category_list'): - portal_type_dict[attr] = getattr(old_obj, attr, ()) - portal_type_dict['workflow_chain'] = \ - getChainByType(context)[1].get('chain_' + object_id, '') - container.manage_delObjects([object_id]) - # unindex here when it is a broken object - if isinstance(old_obj, Broken): - new_obj = self._objects[path] - # check isIndexable with new one, because the old one is broken - if new_obj.isIndexable(): - self.unindexBrokenObject(path) - - # install object - obj = self._objects[path] - # XXX Following code make Python Scripts compile twice, because - # _getCopy returns a copy without the result of the compilation. - # A solution could be to add a specific _getCopy method to - # Python Scripts. - if getattr(aq_base(obj), 'groups', None) is not None: + def recurse(hook, document, prefix=''): + my_prefix = '%s/%s' % (prefix, document.id) + if (hook(document, my_prefix)): + for subdocument in document.objectValues(): + recurse(hook, subdocument, my_prefix) + def saveHook(document, prefix): + uid = getattr(aq_base(document), 'uid', None) + if uid is None: + return 0 + else: + saved_uid_dict[prefix] = uid + return 1 + def restoreHook(document, prefix): + uid = saved_uid_dict.get(prefix) + if uid is None: + return 0 + else: + document.uid = uid + return 1 + groups = {} + old_groups = {} + portal = context.getPortalObject() + # set safe activities execution order + original_reindex_parameters = self.setSafeReindexationMode(context) + object_key_list = self._getObjectKeyList() + for path in object_key_list: + __traceback_info__ = path + # We do not need to perform any backup because the object was + # created during the Business Template installation + if update_dict.get(path) == 'migrate': + continue + + if update_dict.has_key(path) or force: + # get action for the oject + action = 'backup' + if not force: + action = update_dict[path] + if action == 'nothing': + continue + # get subobjects in path + path_list = path.split('/') + container_path = path_list[:-1] + object_id = path_list[-1] + try: + container = self.unrestrictedResolveValue(portal, container_path) + except KeyError: + # parent object can be set to nothing, in this case just go on + container_url = '/'.join(container_path) + if update_dict.get(container_url) == 'nothing': + continue + # If container's container is portal_catalog, + # then automatically create the container. + elif len(container_path) > 1 and container_path[-2] == 'portal_catalog': + # The id match, but better double check with the meta type + # while avoiding the impact of systematic check + container_container = portal.unrestrictedTraverse(container_path[:-1]) + if container_container.meta_type == 'ERP5 Catalog': + container_container.manage_addProduct['ZSQLCatalog'].manage_addSQLCatalog(id=container_path[-1], title='') + if len(container_container.objectIds()) == 1: + container_container.default_sql_catalog_id = container_path[-1] + container = portal.unrestrictedTraverse(container_path) + else: + raise + saved_uid_dict = {} + subobjects_dict = {} + portal_type_dict = {} + old_obj = container._getOb(object_id, None) + object_existed = old_obj is not None + if object_existed: + if context.isKeepObject(path) and force: + # do nothing if the object is specified in keep list in + # force mode. + continue + # Object already exists + recurse(saveHook, old_obj) + if getattr(aq_base(old_obj), 'groups', None) is not None: # we must keep original order groups - # because they change when we add subobjects - groups[path] = deepcopy(obj.groups) - # copy the object - if (getattr(aq_base(obj), '_mt_index', None) is not None and - obj._count() == 0): - # some btrees were exported in a corrupted state. They're empty but - # their metadata-index (._mt_index) contains entries which in - # Zope 2.12 are used for .objectIds(), .objectValues() and - # .objectItems(). In these cases, force the - LOG('Products.ERP5.Document.BusinessTemplate', WARNING, - 'Cleaning corrupted BTreeFolder2 object at %r.' % (path,)) - obj._initBTrees() - obj = obj._getCopy(container) - self.removeProperties(obj, 0) - __traceback_info__ = (container, object_id, obj) - container._setObject(object_id, obj) - obj = container._getOb(object_id) - - if not object_existed: - # A new object was added, call the hook - self.onNewObject(obj) - - # mark a business template installation so in 'PortalType_afterClone' scripts - # we can implement logical for reseting or not attributes (i.e reference). - self.REQUEST.set('is_business_template_installation', 1) - # We set isIndexable to 0 before calling - # manage_afterClone in order to not call recursiveReindex, this is - # useless because we will already reindex every created object, so - # we avoid duplication of reindexation - obj.isIndexable = ConstantGetter('isIndexable', value=False) - # START:part of ERP5Type.CopySupport.manage_afterClone - # * reset uid - # * reset owner - # * do not reset workflow - # * do not call recursively - # * do not call type-based afterClone script - # - # Change uid attribute so that Catalog thinks object was not yet catalogued - aq_base(obj).uid = portal.portal_catalog.newUid() - # Give the Owner local role to the current user, zope only does this if no - # local role has been defined on the object, which breaks ERP5Security - if getattr(aq_base(obj), '__ac_local_roles__', None) is not None: - user=getSecurityManager().getUser() - if user is not None: - userid=user.getId() - if userid is not None: - #remove previous owners - local_role_dict = obj.__ac_local_roles__ - removable_role_key_list = [] - for key, value in local_role_dict.items(): - if 'Owner' in value: - value.remove('Owner') - if len(value) == 0: - removable_role_key_list.append(key) - # there is no need to keep emptied keys after cloning, it makes - # unstable local roles -- if object is cloned it can be different when - # after being just added - for key in removable_role_key_list: - local_role_dict.pop(key) - #add new owner - l=local_role_dict.setdefault(userid, []) - l.append('Owner') - # END:part of ERP5Type.CopySupport.manage_afterClone - del obj.isIndexable - if getattr(aq_base(obj), 'reindexObject', None) is not None: - obj.reindexObject() - obj.wl_clearLocks() - if portal_type_dict: - # set workflow chain - wf_chain = portal_type_dict.pop('workflow_chain') - chain_dict = getChainByType(context)[1] - default_chain = '' - chain_dict['chain_%s' % (object_id)] = wf_chain - context.portal_workflow.manage_changeWorkflows(default_chain, props=chain_dict) - # restore some other properties - obj.__dict__.update(portal_type_dict) - # import sub objects if there is - if subobjects_dict: - # get a jar - connection = self.getConnection(obj) - # import subobjects - for subobject_id, subobject_data in subobjects_dict.iteritems(): - try: - if obj._getOb(subobject_id, None) is None: - subobject_data.seek(0) - subobject = connection.importFile(subobject_data) - obj._setObject(subobject_id, subobject) - except AttributeError: - # XXX this may happen when an object which can contain - # sub-objects (e.g. ERP5 Form) has been replaced with - # an object which cannot (e.g. External Method). - LOG('BusinessTemplate', WARNING, - 'could not restore %r in %r' % (subobject_id, obj)) - if obj.meta_type in ('Z SQL Method',): - fixZSQLMethod(portal, obj) - # portal transforms specific initialization - elif obj.meta_type in ('Transform', 'TransformsChain'): - assert container.meta_type == 'Portal Transforms' - # skip transforms that couldn't have been initialized - if obj.title != 'BROKEN': - container._mapTransform(obj) - elif obj.meta_type in ('ERP5 Ram Cache', - 'ERP5 Distributed Ram Cache',): - assert container.meta_type in ('ERP5 Cache Factory', - 'ERP5 Cache Bag') - container.getParentValue().updateCache() - elif (container.meta_type == 'CMF Skins Tool') and \ - (old_obj is not None): - # Keep compatibility with previous export format of - # business_template_registered_skin_selections - # and do not modify exported value - if obj.getProperty('business_template_registered_skin_selections', - None) is None: - # Keep previous value of register skin selection for skin folder - skin_selection_list = old_obj.getProperty( - 'business_template_registered_skin_selections', None) - if skin_selection_list is not None: - if isinstance(skin_selection_list, basestring): - skin_selection_list = skin_selection_list.split(' ') - obj._setProperty( - 'business_template_registered_skin_selections', - skin_selection_list, type='tokens') - # in case the portal ids, we want keep the property dict - elif interfaces.IIdGenerator.providedBy(obj) and \ - old_obj is not None: - for dict_name in ('last_max_id_dict', 'last_id_dict'): - # Keep previous last id dict - if getattr(old_obj, dict_name, None) is not None: - old_dict = getattr(old_obj, dict_name, None) - setattr(obj, dict_name, old_dict) - - recurse(restoreHook, obj) - # now put original order group - # we remove object not added in forms - # we put old objects we have kept - for path, new_groups_dict in groups.iteritems(): - if not old_groups.has_key(path): - # installation of a new form - obj = portal.unrestrictedTraverse(path) - obj.groups = new_groups_dict - else: - # upgrade of a form - old_groups_dict = old_groups[path] - obj = portal.unrestrictedTraverse(path) - # first check that all widgets are in new order - # excetp the one that had to be removed - widget_id_list = obj.objectIds() - for widget_id in widget_id_list: - widget_path = path+'/'+widget_id - if update_dict.has_key(widget_path) and update_dict[widget_path] in ('remove', 'save_and_remove'): - continue - widget_in_form = 0 - for group_id, group_value_list in new_groups_dict.iteritems(): - if widget_id in group_value_list: - widget_in_form = 1 - break - # if not, add it in the same groups - # defined on the former form - previous_group_id = None - if not widget_in_form: - for old_group_id, old_group_values in old_groups_dict.iteritems(): - if widget_id in old_group_values: - previous_group_id = old_group_id - # if we find same group in new one, add widget to it - if previous_group_id is not None and new_groups_dict.has_key(previous_group_id): - new_groups_dict[previous_group_id].append(widget_id) - # otherwise use a specific group - else: - if new_groups_dict.has_key('not_assigned'): - new_groups_dict['not_assigned'].append(widget_id) - else: - new_groups_dict['not_assigned'] = [widget_id,] - obj.group_list = list(obj.group_list) + ['not_assigned'] - # second check all widget_id in order are in form + # from old form in case we keep some + # old widget, thus we can readd them in + # the right order group + old_groups[path] = deepcopy(old_obj.groups) + subobjects_dict = self._backupObject(action, trashbin, + container_path, object_id) + # in case of portal types, we want to keep some properties + if interfaces.ITypeProvider.providedBy(container): + for attr in ('allowed_content_types', + 'hidden_content_type_list', + 'property_sheet_list', + 'base_category_list'): + portal_type_dict[attr] = getattr(old_obj, attr, ()) + portal_type_dict['workflow_chain'] = \ + getChainByType(context)[1].get('chain_' + object_id, '') + container.manage_delObjects([object_id]) + # unindex here when it is a broken object + if isinstance(old_obj, Broken): + new_obj = self._objects[path] + # check isIndexable with new one, because the old one is broken + if new_obj.isIndexable(): + self.unindexBrokenObject(path) + + # install object + obj = self._objects[path] + # XXX Following code make Python Scripts compile twice, because + # _getCopy returns a copy without the result of the compilation. + # A solution could be to add a specific _getCopy method to + # Python Scripts. + if getattr(aq_base(obj), 'groups', None) is not None: + # we must keep original order groups + # because they change when we add subobjects + groups[path] = deepcopy(obj.groups) + # copy the object + if (getattr(aq_base(obj), '_mt_index', None) is not None and + obj._count() == 0): + # some btrees were exported in a corrupted state. They're empty but + # their metadata-index (._mt_index) contains entries which in + # Zope 2.12 are used for .objectIds(), .objectValues() and + # .objectItems(). In these cases, force the + LOG('Products.ERP5.Document.BusinessTemplate', WARNING, + 'Cleaning corrupted BTreeFolder2 object at %r.' % (path,)) + obj._initBTrees() + obj = obj._getCopy(container) + self.removeProperties(obj, 0) + __traceback_info__ = (container, object_id, obj) + container._setObject(object_id, obj) + obj = container._getOb(object_id) + + if not object_existed: + # A new object was added, call the hook + self.onNewObject(obj) + + # mark a business template installation so in 'PortalType_afterClone' scripts + # we can implement logical for reseting or not attributes (i.e reference). + self.REQUEST.set('is_business_template_installation', 1) + # We set isIndexable to 0 before calling + # manage_afterClone in order to not call recursiveReindex, this is + # useless because we will already reindex every created object, so + # we avoid duplication of reindexation + obj.isIndexable = ConstantGetter('isIndexable', value=False) + # START:part of ERP5Type.CopySupport.manage_afterClone + # * reset uid + # * reset owner + # * do not reset workflow + # * do not call recursively + # * do not call type-based afterClone script + # + # Change uid attribute so that Catalog thinks object was not yet catalogued + aq_base(obj).uid = portal.portal_catalog.newUid() + # Give the Owner local role to the current user, zope only does this if no + # local role has been defined on the object, which breaks ERP5Security + if getattr(aq_base(obj), '__ac_local_roles__', None) is not None: + user=getSecurityManager().getUser() + if user is not None: + userid=user.getId() + if userid is not None: + #remove previous owners + local_role_dict = obj.__ac_local_roles__ + removable_role_key_list = [] + for key, value in local_role_dict.items(): + if 'Owner' in value: + value.remove('Owner') + if len(value) == 0: + removable_role_key_list.append(key) + # there is no need to keep emptied keys after cloning, it makes + # unstable local roles -- if object is cloned it can be different when + # after being just added + for key in removable_role_key_list: + local_role_dict.pop(key) + #add new owner + l=local_role_dict.setdefault(userid, []) + l.append('Owner') + # END:part of ERP5Type.CopySupport.manage_afterClone + del obj.isIndexable + if getattr(aq_base(obj), 'reindexObject', None) is not None: + obj.reindexObject() + obj.wl_clearLocks() + if portal_type_dict: + # set workflow chain + wf_chain = portal_type_dict.pop('workflow_chain') + chain_dict = getChainByType(context)[1] + default_chain = '' + chain_dict['chain_%s' % (object_id)] = wf_chain + context.portal_workflow.manage_changeWorkflows(default_chain, props=chain_dict) + # restore some other properties + obj.__dict__.update(portal_type_dict) + # import sub objects if there is + if subobjects_dict: + # get a jar + connection = self.getConnection(obj) + # import subobjects + for subobject_id, subobject_data in subobjects_dict.iteritems(): + try: + if obj._getOb(subobject_id, None) is None: + subobject_data.seek(0) + subobject = connection.importFile(subobject_data) + obj._setObject(subobject_id, subobject) + except AttributeError: + # XXX this may happen when an object which can contain + # sub-objects (e.g. ERP5 Form) has been replaced with + # an object which cannot (e.g. External Method). + LOG('BusinessTemplate', WARNING, + 'could not restore %r in %r' % (subobject_id, obj)) + if obj.meta_type in ('Z SQL Method',): + fixZSQLMethod(portal, obj) + # portal transforms specific initialization + elif obj.meta_type in ('Transform', 'TransformsChain'): + assert container.meta_type == 'Portal Transforms' + # skip transforms that couldn't have been initialized + if obj.title != 'BROKEN': + container._mapTransform(obj) + elif obj.meta_type in ('ERP5 Ram Cache', + 'ERP5 Distributed Ram Cache',): + assert container.meta_type in ('ERP5 Cache Factory', + 'ERP5 Cache Bag') + container.getParentValue().updateCache() + elif (container.meta_type == 'CMF Skins Tool') and \ + (old_obj is not None): + # Keep compatibility with previous export format of + # business_template_registered_skin_selections + # and do not modify exported value + if obj.getProperty('business_template_registered_skin_selections', + None) is None: + # Keep previous value of register skin selection for skin folder + skin_selection_list = old_obj.getProperty( + 'business_template_registered_skin_selections', None) + if skin_selection_list is not None: + if isinstance(skin_selection_list, basestring): + skin_selection_list = skin_selection_list.split(' ') + obj._setProperty( + 'business_template_registered_skin_selections', + skin_selection_list, type='tokens') + # in case the portal ids, we want keep the property dict + elif interfaces.IIdGenerator.providedBy(obj) and \ + old_obj is not None: + for dict_name in ('last_max_id_dict', 'last_id_dict'): + # Keep previous last id dict + if getattr(old_obj, dict_name, None) is not None: + old_dict = getattr(old_obj, dict_name, None) + setattr(obj, dict_name, old_dict) + + recurse(restoreHook, obj) + # now put original order group + # we remove object not added in forms + # we put old objects we have kept + for path, new_groups_dict in groups.iteritems(): + if not old_groups.has_key(path): + # installation of a new form + obj = portal.unrestrictedTraverse(path) + obj.groups = new_groups_dict + else: + # upgrade of a form + old_groups_dict = old_groups[path] + obj = portal.unrestrictedTraverse(path) + # first check that all widgets are in new order + # excetp the one that had to be removed + widget_id_list = obj.objectIds() + for widget_id in widget_id_list: + widget_path = path+'/'+widget_id + if update_dict.has_key(widget_path) and update_dict[widget_path] in ('remove', 'save_and_remove'): + continue + widget_in_form = 0 for group_id, group_value_list in new_groups_dict.iteritems(): - for widget_id in tuple(group_value_list): - if widget_id not in widget_id_list: - # if we don't find the widget id in the form - # remove it fro the group - group_value_list.remove(widget_id) - # now set new group object - obj.groups = new_groups_dict - # restore previous activities execution order - context.setPlacelessDefaultReindexParameters(**original_reindex_parameters) - # Do not forget to delete all remaining objects if asked by user - # Fetch all sub objects path recursively - recursive_path_list = [] - def fillRecursivePathList(from_path_list): - for from_path in from_path_list: - container = portal.unrestrictedTraverse(from_path, None) - if container is not None: - if from_path in recursive_path_list: - continue - recursive_path_list.append(from_path) - # Check that container support iteration of sub_content_id - if getattr(aq_base(container), 'objectIds', None) is not None: - fillRecursivePathList(['%s/%s' % (from_path, sub_content_id) for\ - sub_content_id in container.objectIds()]) - fillRecursivePathList(object_key_list) - for recursive_path in recursive_path_list: - if recursive_path in update_dict: - action = update_dict[recursive_path] - if action in ('remove', 'save_and_remove'): - document = self.unrestrictedResolveValue(portal, recursive_path, None) - if document is None: - # It happens if the parent of target path is removed before - continue - if getattr(aq_base(document), 'getParentValue', None) is not None: - # regular ERP5 object - parent = document.getParentValue() + if widget_id in group_value_list: + widget_in_form = 1 + break + # if not, add it in the same groups + # defined on the former form + previous_group_id = None + if not widget_in_form: + for old_group_id, old_group_values in old_groups_dict.iteritems(): + if widget_id in old_group_values: + previous_group_id = old_group_id + # if we find same group in new one, add widget to it + if previous_group_id is not None and new_groups_dict.has_key(previous_group_id): + new_groups_dict[previous_group_id].append(widget_id) + # otherwise use a specific group else: - parent = document.aq_parent - document_id = document.getId() - container_path_list = recursive_path.split('/')[:-1] - self._backupObject(action, trashbin, container_path_list, - document_id) - parent.manage_delObjects([document_id]) + if new_groups_dict.has_key('not_assigned'): + new_groups_dict['not_assigned'].append(widget_id) + else: + new_groups_dict['not_assigned'] = [widget_id,] + obj.group_list = list(obj.group_list) + ['not_assigned'] + # second check all widget_id in order are in form + for group_id, group_value_list in new_groups_dict.iteritems(): + for widget_id in tuple(group_value_list): + if widget_id not in widget_id_list: + # if we don't find the widget id in the form + # remove it fro the group + group_value_list.remove(widget_id) + # now set new group object + obj.groups = new_groups_dict + # restore previous activities execution order + context.setPlacelessDefaultReindexParameters(**original_reindex_parameters) + # Do not forget to delete all remaining objects if asked by user + # Fetch all sub objects path recursively + recursive_path_list = [] + def fillRecursivePathList(from_path_list): + for from_path in from_path_list: + container = portal.unrestrictedTraverse(from_path, None) + if container is not None: + if from_path in recursive_path_list: + continue + recursive_path_list.append(from_path) + # Check that container support iteration of sub_content_id + if getattr(aq_base(container), 'objectIds', None) is not None: + fillRecursivePathList(['%s/%s' % (from_path, sub_content_id) for\ + sub_content_id in container.objectIds()]) + fillRecursivePathList(object_key_list) + for recursive_path in recursive_path_list: + if recursive_path in update_dict: + action = update_dict[recursive_path] + if action in ('remove', 'save_and_remove'): + document = self.unrestrictedResolveValue(portal, recursive_path, None) + if document is None: + # It happens if the parent of target path is removed before + continue + if getattr(aq_base(document), 'getParentValue', None) is not None: + # regular ERP5 object + parent = document.getParentValue() + else: + parent = document.aq_parent + document_id = document.getId() + container_path_list = recursive_path.split('/')[:-1] + self._backupObject(action, trashbin, container_path_list, + document_id) + parent.manage_delObjects([document_id]) self.afterInstall() @@ -1835,21 +1833,20 @@ class RegisteredSkinSelectionTemplateItem(BaseTemplateItem): def preinstall(self, context, installed_item, **kw): modified_object_list = {} - if 1: - for path in self._objects: - if installed_item._objects.has_key(path): - # compare object to see it there is changes - new_object = self._objects[path] - old_object = installed_item._objects[path] - if new_object != old_object: - modified_object_list.update({path : ['Modified', self.__class__.__name__[:-12]]}) - else: # new object - modified_object_list.update({path : ['New', self.__class__.__name__[:-12]]}) - # get removed object - old_keys = installed_item._objects.keys() - for path in old_keys: - if path not in self._objects: - modified_object_list.update({path : ['Removed', self.__class__.__name__[:-12]]}) + for path in self._objects: + if installed_item._objects.has_key(path): + # compare object to see it there is changes + new_object = self._objects[path] + old_object = installed_item._objects[path] + if new_object != old_object: + modified_object_list.update({path : ['Modified', self.__class__.__name__[:-12]]}) + else: # new object + modified_object_list.update({path : ['New', self.__class__.__name__[:-12]]}) + # get removed object + old_keys = installed_item._objects.keys() + for path in old_keys: + if path not in self._objects: + modified_object_list.update({path : ['Removed', self.__class__.__name__[:-12]]}) return modified_object_list def _importFile(self, file_name, file): @@ -2022,40 +2019,39 @@ class WorkflowTemplateItem(ObjectTemplateItem): return modified_workflow_dict def install(self, context, trashbin, **kw): - if 1: - portal = context.getPortalObject() - update_dict = kw.get('object_to_update') - force = kw.get('force') - # sort to add objects before their subobjects - for path in sorted(self._objects): - if force: - action = 'backup' - else: - action = update_dict.get('/'.join(path.split('/')[:2])) - if action in (None, 'nothing'): + portal = context.getPortalObject() + update_dict = kw.get('object_to_update') + force = kw.get('force') + # sort to add objects before their subobjects + for path in sorted(self._objects): + if force: + action = 'backup' + else: + action = update_dict.get('/'.join(path.split('/')[:2])) + if action in (None, 'nothing'): + continue + container_path = path.split('/')[:-1] + object_id = path.split('/')[-1] + try: + container = self.unrestrictedResolveValue(portal, container_path) + except KeyError: + # parent object can be set to nothing, in this case just go on + container_url = '/'.join(container_path) + if update_dict.has_key(container_url): + if update_dict[container_url] == 'nothing': continue - container_path = path.split('/')[:-1] - object_id = path.split('/')[-1] - try: - container = self.unrestrictedResolveValue(portal, container_path) - except KeyError: - # parent object can be set to nothing, in this case just go on - container_url = '/'.join(container_path) - if update_dict.has_key(container_url): - if update_dict[container_url] == 'nothing': - continue - raise - container_ids = container.objectIds() - if object_id in container_ids: # Object already exists - self._backupObject(action, trashbin, container_path, object_id, keep_subobjects=1) - container.manage_delObjects([object_id]) - obj = self._objects[path] - obj = obj._getCopy(container) - self.removeProperties(obj, 0) - container._setObject(object_id, obj) - obj = container._getOb(object_id) - obj.manage_afterClone(obj) - obj.wl_clearLocks() + raise + container_ids = container.objectIds() + if object_id in container_ids: # Object already exists + self._backupObject(action, trashbin, container_path, object_id, keep_subobjects=1) + container.manage_delObjects([object_id]) + obj = self._objects[path] + obj = obj._getCopy(container) + self.removeProperties(obj, 0) + container._setObject(object_id, obj) + obj = container._getOb(object_id) + obj.manage_afterClone(obj) + obj.wl_clearLocks() def uninstall(self, context, **kw): object_path = kw.get('object_path', None) @@ -2359,34 +2355,33 @@ class PortalTypeWorkflowChainTemplateItem(BaseTemplateItem): def preinstall(self, context, installed_item, **kw): modified_object_list = {} - if 1: - new_dict = PersistentMapping() - # Fix key from installed bt if necessary - for key, value in installed_item._objects.iteritems(): - if not 'portal_type_workflow_chain/' in key: - key = 'portal_type_workflow_chain/%s' % (key) - new_dict[key] = value - if new_dict: - installed_item._objects = new_dict - for path in self._objects: - if path in installed_item._objects: - # compare object to see it there is changes - new_object = self._objects[path] - old_object = installed_item._objects[path] - if isinstance(new_object, str): - new_object = new_object.split(self._chain_string_separator) - if isinstance(old_object, str): - old_object = old_object.split(self._chain_string_separator) - new_object.sort() - old_object.sort() - if new_object != old_object: - modified_object_list.update({path : ['Modified', self.getTemplateTypeName()]}) - else: # new object - modified_object_list.update({path : ['New', self.getTemplateTypeName()]}) - # get removed object - for path in installed_item._objects: - if path not in self._objects: - modified_object_list.update({path : ['Removed', self.getTemplateTypeName()]}) + new_dict = PersistentMapping() + # Fix key from installed bt if necessary + for key, value in installed_item._objects.iteritems(): + if not 'portal_type_workflow_chain/' in key: + key = 'portal_type_workflow_chain/%s' % (key) + new_dict[key] = value + if new_dict: + installed_item._objects = new_dict + for path in self._objects: + if path in installed_item._objects: + # compare object to see it there is changes + new_object = self._objects[path] + old_object = installed_item._objects[path] + if isinstance(new_object, str): + new_object = new_object.split(self._chain_string_separator) + if isinstance(old_object, str): + old_object = old_object.split(self._chain_string_separator) + new_object.sort() + old_object.sort() + if new_object != old_object: + modified_object_list.update({path : ['Modified', self.getTemplateTypeName()]}) + else: # new object + modified_object_list.update({path : ['New', self.getTemplateTypeName()]}) + # get removed object + for path in installed_item._objects: + if path not in self._objects: + modified_object_list.update({path : ['Removed', self.getTemplateTypeName()]}) return modified_object_list def _importFile(self, file_name, file): @@ -2465,30 +2460,29 @@ class PortalTypeAllowedContentTypeTemplateItem(BaseTemplateItem): def preinstall(self, context, installed_item, **kw): modified_object_list = {} - if 1: - new_dict = PersistentMapping() - # fix key if necessary in installed bt for diff - for key, value in installed_item._objects.iteritems(): - if self.class_property not in key: - key = '%s/%s' % (self.class_property, key) - new_dict[key] = value - if new_dict: - installed_item._objects = new_dict - for path in self._objects: - if path in installed_item._objects: - # compare object to see it there is changes - new_object = self._objects[path] - old_object = installed_item._objects[path] - new_object.sort() - old_object.sort() - if new_object != old_object: - modified_object_list.update({path : ['Modified', self.getTemplateTypeName()]}) - else: # new object - modified_object_list.update({path : ['New', self.getTemplateTypeName()]}) - # get removed object - for path in installed_item._objects: - if path not in self._objects: - modified_object_list.update({path : ['Removed', self.getTemplateTypeName()]}) + new_dict = PersistentMapping() + # fix key if necessary in installed bt for diff + for key, value in installed_item._objects.iteritems(): + if self.class_property not in key: + key = '%s/%s' % (self.class_property, key) + new_dict[key] = value + if new_dict: + installed_item._objects = new_dict + for path in self._objects: + if path in installed_item._objects: + # compare object to see it there is changes + new_object = self._objects[path] + old_object = installed_item._objects[path] + new_object.sort() + old_object.sort() + if new_object != old_object: + modified_object_list.update({path : ['Modified', self.getTemplateTypeName()]}) + else: # new object + modified_object_list.update({path : ['New', self.getTemplateTypeName()]}) + # get removed object + for path in installed_item._objects: + if path not in self._objects: + modified_object_list.update({path : ['Removed', self.getTemplateTypeName()]}) return modified_object_list def _importFile(self, file_name, file): @@ -2749,12 +2743,11 @@ class CatalogMethodTemplateItem(ObjectTemplateItem): # Restore filter if self._is_filtered_archive.get(method_id, 0): expression = self._filter_expression_archive[method_id] - if 1: - if expression and expression.strip(): - # only compile non-empty expressions - expr_instance = Expression(expression) - else: - expr_instance = None + if expression and expression.strip(): + # only compile non-empty expressions + expr_instance = Expression(expression) + else: + expr_instance = None catalog.filter_dict[method_id] = PersistentMapping() catalog.filter_dict[method_id]['filtered'] = 1 catalog.filter_dict[method_id]['expression'] = expression @@ -2961,76 +2954,75 @@ class ActionTemplateItem(ObjectTemplateItem): def install(self, context, trashbin, **kw): update_dict = kw.get('object_to_update') force = kw.get('force') - if 1: - portal_type_dict = {} - p = context.getPortalObject() - for id in self._objects.keys(): - if update_dict.has_key(id) or force: - if not force: - action = update_dict[id] - if action == 'nothing': - continue - obj = self._objects[id] - path, id = id.rsplit('/', 1) - container = p.unrestrictedTraverse(path) - - if interfaces.ITypeProvider.providedBy(aq_parent(aq_inner(container))): - # XXX future BT should use 'reference' instead of 'id' - reference = getattr(obj, 'reference', None) or obj.id - portal_type_dict.setdefault(path, {})[reference] = obj + portal_type_dict = {} + p = context.getPortalObject() + for id in self._objects.keys(): + if update_dict.has_key(id) or force: + if not force: + action = update_dict[id] + if action == 'nothing': continue - - # Following code is for actions outside Types Tool. - # It will be removed when they are also converted to ERP5 actions. - from Products.CMFCore.interfaces import IActionProvider - if not IActionProvider.providedBy(container): - # some tools stopped being ActionProviders in CMF 2.x. Drop the - # action into portal_actions. - LOG('Products.ERP5.Document.BusinessTemplate', WARNING, - 'Redirected action import', - 'Attempted to store action %r in %r which is no longer an ' - 'IActionProvided. Storing action on portal_actions instead' % - (id, path)) - container = p.portal_actions - obj, action = container, obj - action_list = obj.listActions() - for index in range(len(action_list)): - if action_list[index].id == id: - # remove previous action - obj.deleteActions(selections=(index,)) - action_text = action.action - if isinstance(action_text, Expression): - action_text = action_text.text - obj.addAction( - id = action.id - , name = action.title - , action = action_text - , condition = action.getCondition() - , permission = action.permissions - , category = action.category - , visible = action.visible - , icon = getattr(action, 'icon', None)\ - and action.icon.text or '' - , priority = action.priority - , description = action.description - ) - # sort action based on the priority define on it - # XXX suppose that priority are properly on actions - new_priority = action.priority - action_list = obj.listActions() - move_down_list = [] - for index in range(len(action_list)): - action = action_list[index] - if action.priority > new_priority: - move_down_list.append(str(index)) - obj.moveDownActions(selections=tuple(move_down_list)) - for path, action_dict in portal_type_dict.iteritems(): + obj = self._objects[id] + path, id = id.rsplit('/', 1) container = p.unrestrictedTraverse(path) - container.manage_delObjects([obj.id - for obj in container.getActionInformationList() - if obj.getReference() in action_dict]) - for name, obj in action_dict.iteritems(): - container._importOldAction(obj).aq_base + + if interfaces.ITypeProvider.providedBy(aq_parent(aq_inner(container))): + # XXX future BT should use 'reference' instead of 'id' + reference = getattr(obj, 'reference', None) or obj.id + portal_type_dict.setdefault(path, {})[reference] = obj + continue + + # Following code is for actions outside Types Tool. + # It will be removed when they are also converted to ERP5 actions. + from Products.CMFCore.interfaces import IActionProvider + if not IActionProvider.providedBy(container): + # some tools stopped being ActionProviders in CMF 2.x. Drop the + # action into portal_actions. + LOG('Products.ERP5.Document.BusinessTemplate', WARNING, + 'Redirected action import', + 'Attempted to store action %r in %r which is no longer an ' + 'IActionProvided. Storing action on portal_actions instead' % + (id, path)) + container = p.portal_actions + obj, action = container, obj + action_list = obj.listActions() + for index in range(len(action_list)): + if action_list[index].id == id: + # remove previous action + obj.deleteActions(selections=(index,)) + action_text = action.action + if isinstance(action_text, Expression): + action_text = action_text.text + obj.addAction( + id = action.id + , name = action.title + , action = action_text + , condition = action.getCondition() + , permission = action.permissions + , category = action.category + , visible = action.visible + , icon = getattr(action, 'icon', None)\ + and action.icon.text or '' + , priority = action.priority + , description = action.description + ) + # sort action based on the priority define on it + # XXX suppose that priority are properly on actions + new_priority = action.priority + action_list = obj.listActions() + move_down_list = [] + for index in range(len(action_list)): + action = action_list[index] + if action.priority > new_priority: + move_down_list.append(str(index)) + obj.moveDownActions(selections=tuple(move_down_list)) + for path, action_dict in portal_type_dict.iteritems(): + container = p.unrestrictedTraverse(path) + container.manage_delObjects([obj.id + for obj in container.getActionInformationList() + if obj.getReference() in action_dict]) + for name, obj in action_dict.iteritems(): + container._importOldAction(obj).aq_base def uninstall(self, context, **kw): p = context.getPortalObject() @@ -3248,24 +3240,23 @@ class SitePropertyTemplateItem(BaseTemplateItem): def install(self, context, trashbin, **kw): update_dict = kw.get('object_to_update') force = kw.get('force') - if 1: - p = context.getPortalObject() - for path in self._objects.keys(): - if update_dict.has_key(path) or force: - if not force: - action = update_dict[path] - if action == 'nothing': - continue - dir, id = posixpath.split(path) - prop_type, property = self._objects[path] - if p.hasProperty(id): - if p.getPropertyType(id) != prop_type: - p._delProperty(id) - p._setProperty(id, property, type=prop_type) - else: - p._updateProperty(id, property) - else: + p = context.getPortalObject() + for path in self._objects.keys(): + if update_dict.has_key(path) or force: + if not force: + action = update_dict[path] + if action == 'nothing': + continue + dir, id = posixpath.split(path) + prop_type, property = self._objects[path] + if p.hasProperty(id): + if p.getPropertyType(id) != prop_type: + p._delProperty(id) p._setProperty(id, property, type=prop_type) + else: + p._updateProperty(id, property) + else: + p._setProperty(id, property, type=prop_type) def uninstall(self, context, **kw): p = context.getPortalObject() @@ -3491,34 +3482,33 @@ class FilesystemDocumentTemplateItem(BaseTemplateItem): def preinstall(self, context, installed_item, **kw): modified_object_list = {} - if 1: - # fix key if necessary in installed bt for diff - extra_prefix = self.__class__.__name__ + '/' - for key in installed_item._objects.keys(): - if key.startswith(extra_prefix): - new_key = key[len(extra_prefix):] - installed_item._objects[new_key] = installed_item._objects[key] - del installed_item._objects[key] - for path in self._objects: - if installed_item._objects.has_key(path): - # compare object to see if there is changes - new_obj_code = self._objects[path] - old_obj_code = installed_item._objects[path] - if new_obj_code != old_obj_code: - # Note: Magical way to have unique paths - modified_object_list.update( - {self._getKey(path) : ['Modified', self.__class__.__name__[:-12]]}) - else: # new object - # Note: Magical way to have unique paths - modified_object_list.update( - {self._getKey(path) : ['New', self.__class__.__name__[:-12]]}) - # get removed object - old_keys = installed_item._objects.keys() - for path in old_keys: - if path not in self._objects: + # fix key if necessary in installed bt for diff + extra_prefix = self.__class__.__name__ + '/' + for key in installed_item._objects.keys(): + if key.startswith(extra_prefix): + new_key = key[len(extra_prefix):] + installed_item._objects[new_key] = installed_item._objects[key] + del installed_item._objects[key] + for path in self._objects: + if installed_item._objects.has_key(path): + # compare object to see if there is changes + new_obj_code = self._objects[path] + old_obj_code = installed_item._objects[path] + if new_obj_code != old_obj_code: # Note: Magical way to have unique paths modified_object_list.update( - {self._getKey(path) : ['Removed', self.__class__.__name__[:-12]]}) + {self._getKey(path) : ['Modified', self.__class__.__name__[:-12]]}) + else: # new object + # Note: Magical way to have unique paths + modified_object_list.update( + {self._getKey(path) : ['New', self.__class__.__name__[:-12]]}) + # get removed object + old_keys = installed_item._objects.keys() + for path in old_keys: + if path not in self._objects: + # Note: Magical way to have unique paths + modified_object_list.update( + {self._getKey(path) : ['Removed', self.__class__.__name__[:-12]]}) return modified_object_list def _resetDynamicModules(self): @@ -3539,35 +3529,34 @@ class FilesystemDocumentTemplateItem(BaseTemplateItem): def install(self, context, trashbin, **kw): update_dict = kw.get('object_to_update') force = kw.get('force') - if 1: - need_reset = isinstance(self, FilesystemDocumentTemplateItem) - for key in self._objects.keys(): - # to achieve non data migration fresh installation parameters - # differ from upgrade parameteres, so here the check have to be - # care of both cases - upgraded_key = self._getKey(key) - if update_dict.has_key(key) or update_dict.has_key(upgraded_key) \ - or force: - if not force: - action = update_dict.get(key, update_dict.get(upgraded_key)) - if action == 'nothing': - continue - text = self._objects[key] - path, name = posixpath.split(key) - try: - self.local_file_writer_name(name, text, create=0) - except IOError, error: - LOG(self.__class__.__name__, WARNING, - "Cannot install class %r on file system" % name) - if error.errno: - raise - continue - if self.local_file_importer_name is None: + need_reset = isinstance(self, FilesystemDocumentTemplateItem) + for key in self._objects.keys(): + # to achieve non data migration fresh installation parameters + # differ from upgrade parameteres, so here the check have to be + # care of both cases + upgraded_key = self._getKey(key) + if update_dict.has_key(key) or update_dict.has_key(upgraded_key) \ + or force: + if not force: + action = update_dict.get(key, update_dict.get(upgraded_key)) + if action == 'nothing': continue - if need_reset: - self._resetDynamicModules() - need_reset = False - self.local_file_importer_name(name) + text = self._objects[key] + path, name = posixpath.split(key) + try: + self.local_file_writer_name(name, text, create=0) + except IOError, error: + LOG(self.__class__.__name__, WARNING, + "Cannot install class %r on file system" % name) + if error.errno: + raise + continue + if self.local_file_importer_name is None: + continue + if need_reset: + self._resetDynamicModules() + need_reset = False + self.local_file_importer_name(name) def remove(self, context, **kw): """Conversion of magically uniqued paths to real ones""" @@ -4112,23 +4101,22 @@ class RoleTemplateItem(BaseTemplateItem): def preinstall(self, context, installed_item, **kw): modified_object_list = {} - if 1: - # BBB it might be necessary to change the data structure. - obsolete_key = self.__class__.__name__ + '/role_list' - if obsolete_key in installed_item._objects: - for role in installed_item._objects[obsolete_key]: - installed_item._objects[role] = 1 - del installed_item._objects[obsolete_key] - for role in self._objects: - if installed_item._objects.has_key(role): - continue - else: # only show new roles - modified_object_list.update({role : ['New', 'Role']}) - # get removed roles - old_roles = installed_item._objects.keys() - for role in old_roles: - if role not in self._objects: - modified_object_list.update({role : ['Removed', self.__class__.__name__[:-12]]}) + # BBB it might be necessary to change the data structure. + obsolete_key = self.__class__.__name__ + '/role_list' + if obsolete_key in installed_item._objects: + for role in installed_item._objects[obsolete_key]: + installed_item._objects[role] = 1 + del installed_item._objects[obsolete_key] + for role in self._objects: + if installed_item._objects.has_key(role): + continue + else: # only show new roles + modified_object_list.update({role : ['New', 'Role']}) + # get removed roles + old_roles = installed_item._objects.keys() + for role in old_roles: + if role not in self._objects: + modified_object_list.update({role : ['Removed', self.__class__.__name__[:-12]]}) return modified_object_list def install(self, context, trashbin, **kw): @@ -4235,12 +4223,11 @@ class CatalogKeyTemplateItemBase(BaseTemplateItem): return catalog_key_list = list(getattr(catalog, self.key_list_attr, [])) - if 1: - if len(self._objects.keys()) == 0: # needed because of pop() - return - keys = [] - for k in self._objects.values().pop(): # because of list of list - keys.append(k) + if len(self._objects.keys()) == 0: # needed because of pop() + return + keys = [] + for k in self._objects.values().pop(): # because of list of list + keys.append(k) update_dict = kw.get('object_to_update') force = kw.get('force') if force or self._getUpdateDictAction(update_dict) != 'nothing': @@ -4408,21 +4395,20 @@ class MessageTranslationTemplateItem(BaseTemplateItem): def preinstall(self, context, installed_item, **kw): modified_object_list = {} - if 1: - for path in self._objects: - if installed_item._objects.has_key(path): - # compare object to see if there is changes - new_obj_code = self._objects[path] - old_obj_code = installed_item._objects[path] - if new_obj_code != old_obj_code: - modified_object_list.update({path : ['Modified', self.__class__.__name__[:-12]]}) - else: # new object - modified_object_list.update({path : ['New', self.__class__.__name__[:-12]]}) - # get removed object - old_keys = installed_item._objects.keys() - for path in old_keys: - if path not in self._objects: - modified_object_list.update({path : ['Removed', self.__class__.__name__[:-12]]}) + for path in self._objects: + if installed_item._objects.has_key(path): + # compare object to see if there is changes + new_obj_code = self._objects[path] + old_obj_code = installed_item._objects[path] + if new_obj_code != old_obj_code: + modified_object_list.update({path : ['Modified', self.__class__.__name__[:-12]]}) + else: # new object + modified_object_list.update({path : ['New', self.__class__.__name__[:-12]]}) + # get removed object + old_keys = installed_item._objects.keys() + for path in old_keys: + if path not in self._objects: + modified_object_list.update({path : ['Removed', self.__class__.__name__[:-12]]}) return modified_object_list def _splitKey(self,key): @@ -4454,37 +4440,36 @@ class MessageTranslationTemplateItem(BaseTemplateItem): localizer = context.getPortalObject().Localizer update_dict = kw.get('object_to_update', {}) force = kw.get('force') - if 1: - for key in sorted(self._objects.keys()): - if update_dict.has_key(key) or force: - if not force: - action = update_dict[key] - if action == 'nothing': - continue - lang, catalog = self._splitKey(key) - - if catalog is None: - name = self._objects[key] - for lang_dict in localizer.get_all_languages(): - if lang_dict['code'] == lang: - # When the Localizer has the language as a user-defined - # language, make sure that the name is updated. - old_name = localizer.get_user_defined_language_name(lang) - if old_name is not None and old_name != name: - localizer._del_user_defined_language(lang) - localizer._add_user_defined_language(name, lang) - break - else: - # if the Localizer does not know the language code, it must be - # defined as a user-defined language. - localizer._add_user_defined_language(name, lang) - if lang not in localizer.get_languages(): - localizer.manage_addLanguage(lang) + for key in sorted(self._objects.keys()): + if update_dict.has_key(key) or force: + if not force: + action = update_dict[key] + if action == 'nothing': + continue + lang, catalog = self._splitKey(key) + + if catalog is None: + name = self._objects[key] + for lang_dict in localizer.get_all_languages(): + if lang_dict['code'] == lang: + # When the Localizer has the language as a user-defined + # language, make sure that the name is updated. + old_name = localizer.get_user_defined_language_name(lang) + if old_name is not None and old_name != name: + localizer._del_user_defined_language(lang) + localizer._add_user_defined_language(name, lang) + break else: - po = self._objects[key] - if lang not in localizer.get_languages(): - localizer.manage_addLanguage(lang) - self._importCatalogLanguage(localizer, catalog, lang, po) + # if the Localizer does not know the language code, it must be + # defined as a user-defined language. + localizer._add_user_defined_language(name, lang) + if lang not in localizer.get_languages(): + localizer.manage_addLanguage(lang) + else: + po = self._objects[key] + if lang not in localizer.get_languages(): + localizer.manage_addLanguage(lang) + self._importCatalogLanguage(localizer, catalog, lang, po) def uninstall(self, context, remove_translations=False, **kw): if not remove_translations: diff --git a/product/ERP5/Tool/TemplateTool.py b/product/ERP5/Tool/TemplateTool.py index f0d831674e..355a369db7 100644 --- a/product/ERP5/Tool/TemplateTool.py +++ b/product/ERP5/Tool/TemplateTool.py @@ -307,42 +307,41 @@ class TemplateTool (BaseTool): file.seek(0) magic = file.read(5) - if 1: - # XXX: should really check for a magic and offer a falback if it - # doens't correspond to anything handled. - tar = tarfile.open(path, 'r:gz') - dir_name = tar.members[0].name.split(posixpath.sep, 1)[0] - try: - # create bt object - bt = self.newContent(portal_type='Business Template', id=id) - prop_dict = {} - for prop in bt.propertyMap(): - prop_type = prop['type'] - pid = prop['id'] - prop_path = posixpath.join(dir_name, 'bt', pid) - try: - info = tar.getmember(prop_path) - value = tar.extractfile(info).read() - except KeyError: - value = None - if value is 'None': - # At export time, we used to export non-existent properties: - # str(obj.getProperty('non-existing')) == 'None' - # Discard them - continue - if prop_type in ('text', 'string'): - prop_dict[pid] = value or '' - elif prop_type in ('int', 'boolean'): - prop_dict[pid] = value or 0 - elif prop_type in ('lines', 'tokens'): - prop_dict[pid[:-5]] = (value or '').splitlines() - prop_dict.pop('id', '') - bt.edit(**prop_dict) - # import all other files from bt - with open(path, 'rb') as fobj: - bt.importFile(file=fobj) - finally: - tar.close() + # XXX: should really check for a magic and offer a falback if it + # doens't correspond to anything handled. + tar = tarfile.open(path, 'r:gz') + dir_name = tar.members[0].name.split(posixpath.sep, 1)[0] + try: + # create bt object + bt = self.newContent(portal_type='Business Template', id=id) + prop_dict = {} + for prop in bt.propertyMap(): + prop_type = prop['type'] + pid = prop['id'] + prop_path = posixpath.join(dir_name, 'bt', pid) + try: + info = tar.getmember(prop_path) + value = tar.extractfile(info).read() + except KeyError: + value = None + if value is 'None': + # At export time, we used to export non-existent properties: + # str(obj.getProperty('non-existing')) == 'None' + # Discard them + continue + if prop_type in ('text', 'string'): + prop_dict[pid] = value or '' + elif prop_type in ('int', 'boolean'): + prop_dict[pid] = value or 0 + elif prop_type in ('lines', 'tokens'): + prop_dict[pid[:-5]] = (value or '').splitlines() + prop_dict.pop('id', '') + bt.edit(**prop_dict) + # import all other files from bt + with open(path, 'rb') as fobj: + bt.importFile(file=fobj) + finally: + tar.close() return bt security.declareProtected( Permissions.ManagePortal, 'manage_download' ) -- 2.30.9