[Erp5-report] r45288 jm - in /erp5/trunk/products/ERP5Type: ERP5Type.py Tool/TypesTool.py
nobody at svn.erp5.org
nobody at svn.erp5.org
Mon Apr 11 15:07:23 CEST 2011
Author: jm
Date: Mon Apr 11 15:07:22 2011
New Revision: 45288
URL: http://svn.erp5.org?rev=45288&view=rev
Log:
Make first migration of types tool (CMF -> ERP5) work again
It was broken by the second migration (aq_dynamic -> erp5.portal_type).
And now the migration is not triggered by aq_dynamic, there is no reason anymore
to abort the transaction in OldTypesTool._migrateTypesTool if anything fails.
Modified:
erp5/trunk/products/ERP5Type/ERP5Type.py
erp5/trunk/products/ERP5Type/Tool/TypesTool.py
Modified: erp5/trunk/products/ERP5Type/ERP5Type.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/ERP5Type.py?rev=45288&r1=45287&r2=45288&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/ERP5Type.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/ERP5Type.py [utf8] Mon Apr 11 15:07:22 2011
@@ -175,7 +175,9 @@ class LocalRoleAssignorMixIn(object):
def _importRole(self, role_property_dict):
"""Import a role from a BT or from an old portal type"""
- role = self.newContent(portal_type='Role Information')
+ import erp5
+ RoleInformation = getattr(erp5.portal_type, 'Role Information')
+ role = RoleInformation(self.generateNewId())
for k, v in role_property_dict.iteritems():
if k == 'condition':
if isinstance(v, Expression):
@@ -193,7 +195,7 @@ class LocalRoleAssignorMixIn(object):
k = 'role_base_category_script_id'
setattr(role, k, v)
role.uid = None
- return role
+ return self[self._setObject(role.id, role, set_owner=0)]
class ERP5TypeInformation(XMLObject,
FactoryTypeInformation,
Modified: erp5/trunk/products/ERP5Type/Tool/TypesTool.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/Tool/TypesTool.py?rev=45288&r1=45287&r2=45288&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/Tool/TypesTool.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/Tool/TypesTool.py [utf8] Mon Apr 11 15:07:22 2011
@@ -391,32 +391,54 @@ sys.modules[OldRoleInformation.__name__]
from OFS.SimpleItem import SimpleItem
OldRoleInformation.RoleInformation = SimpleItem
+def _eventLessSetObject(container):
+ _setObject = container._setObject
+ def wrapper(*args, **kw):
+ try:
+ return _setObject(suppress_events=True, *args, **kw)
+ except TypeError:
+ return _setObject(*args, **kw)
+ return wrapper
+
class OldTypesTool(OFSFolder):
id = 'cmf_portal_types'
def _migratePortalType(self, types_tool, old_type):
- if old_type.__class__ is not ERP5TypeInformation:
+ import erp5
+ BaseType = getattr(erp5.portal_type, 'Base Type')
+ type_id = old_type.id
+ if old_type.__class__ is not BaseType:
LOG('OldTypesTool._migratePortalType', WARNING,
"Can't convert %r (meta_type is %r)."
% (old_type, old_type.meta_type))
return
- new_type = ERP5TypeInformation(old_type.id, uid=None)
- types_tool._setObject(new_type.id, new_type, set_owner=0)
- new_type = types_tool[new_type.id]
- for k, v in old_type.__dict__.iteritems():
- if k == '_actions':
- for action in v:
- new_type._importOldAction(action)
- elif k == '_roles':
- for role in v:
- new_type._importRole(role.__getstate__())
- elif k not in ('uid', 'isIndexable'):
- if k == '_property_domain_dict':
- v = dict((k, t.__class__(property_name=t.property_name,
- domain_name=t.domain_name))
- for k, t in v.iteritems())
- setattr(new_type, k, v)
+ new_type = BaseType(type_id, uid=None)
+ _eventLessSetObject(types_tool)(type_id, new_type, set_owner=0)
+ new_type = types_tool[type_id]
+ def generateNewId():
+ new_id = str(int(new_type.__dict__.get('last_id', 0)) + 1)
+ new_type.last_id = new_id
+ return new_id
+ try:
+ new_type.generateNewId = generateNewId
+ new_type._setObject = _eventLessSetObject(new_type)
+ for k, v in old_type.__dict__.iteritems():
+ if k == '_actions':
+ for action in v:
+ new_type._importOldAction(action)
+ elif k == '_roles':
+ for role in v:
+ new_type._importRole(role.__getstate__())
+ elif k not in ('uid', 'isIndexable'):
+ if k == '_property_domain_dict':
+ v = dict((k, t.__class__(property_name=t.property_name,
+ domain_name=t.domain_name))
+ for k, t in v.iteritems())
+ setattr(new_type, k, v)
+ finally:
+ del new_type.generateNewId
+ del new_type._setObject
def _migrateTypesTool(self, parent):
# 'parent' has no acquisition wrapper so migration must be done without
@@ -428,30 +450,22 @@ class OldTypesTool(OFSFolder):
break
types_tool = TypesTool()
types_tool.__ac_local_roles__ = self.__ac_local_roles__.copy()
- try:
- setattr(parent, self.id, self)
- object_info['id'] = self.id
- del parent.portal_types
- parent._setObject(TypesTool.id, types_tool, set_owner=0)
- types_tool = types_tool.__of__(parent)
- if not parent.portal_categories.hasObject('action_type'):
- # Required to generate ActionInformation.getActionType accessor.
- from Products.ERP5Type.Document.BaseCategory import BaseCategory
- action_type = BaseCategory('action_type')
- action_type.uid = None
- parent.portal_categories._setObject(action_type.id, action_type)
- for type_info in self.objectValues():
- self._migratePortalType(types_tool, type_info)
- types_tool.activate()._finalizeMigration()
- except:
- transaction.abort()
- LOG('OldTypesTool', PANIC, 'Could not convert portal_types: ',
- error=sys.exc_info())
- raise # XXX The exception may be hidden by acquisition code
- # (None returned instead)
- else:
- LOG('OldTypesTool', WARNING, "... portal_types converted.")
- return types_tool
+ setattr(parent, self.id, self)
+ object_info['id'] = self.id
+ del parent.portal_types
+ _eventLessSetObject(parent)(TypesTool.id, types_tool, set_owner=0)
+ types_tool = types_tool.__of__(parent)
+ if not parent.portal_categories.hasObject('action_type'):
+ # Required to generate ActionInformation.getActionType accessor.
+ import erp5
+ action_type = getattr(erp5.portal_type, 'Base Category')('action_type')
+ action_type.uid = None
+ parent.portal_categories._setObject(action_type.id, action_type)
+ for type_info in self.objectValues():
+ self._migratePortalType(types_tool, type_info)
+ types_tool.activate()._finalizeMigration()
+ LOG('OldTypesTool', WARNING, "... portal_types converted.")
+ return types_tool
def __of__(self, parent):
base_self = aq_base(self) # Is it required ?
More information about the Erp5-report
mailing list