def migratePortalType(portal, src_portal_type, dst_portal_type, out=None, migrator=None, use_catalog_patch=False, **kwargs): """Migrate from src portal type to dst portal type Additional **kwargs are applied to the walker """ if not out: out = StringIO() # migrators are also registered by (src meta type, dst meta type) # let's find the right migrator for us ttool = getToolByName(portal, 'portal_types') src = ttool.getTypeInfo(src_portal_type) dst = ttool.getTypeInfo(dst_portal_type) if src is None or dst is None: raise ValueError, "Unknown src or dst portal type: %s -> %s" % ( src_portal_type, dst_portal_type,) key = (src.Metatype(), dst.Metatype()) migratorFromRegistry = getMigrator(key) if migratorFromRegistry is None: raise ValueError, "No registered migrator for '%s' found" % str(key) if migrator is not None: # got a migrator, make sure it is the right one if migrator is not migratorFromRegistry: raise ValueError, "ups" else: migrator = migratorFromRegistry Walker = migrator.walkerClass msg = '--> Migrating %s to %s with %s' % (src_portal_type, dst_portal_type, Walker.__name__) if use_catalog_patch: msg+=', using catalog patch' if kwargs.get('use_savepoint', False): msg+=', using savepoints' if kwargs.get('full_transaction', False): msg+=', using full transactions' print >> out, msg LOG.debug(msg) walk = Walker(portal, migrator, src_portal_type=src_portal_type, dst_portal_type=dst_portal_type, **kwargs) # wrap catalog patch inside a try/finally clause to make sure that the catalog # is unpatched under *any* circumstances (hopely) try: if use_catalog_patch: catalog_class = applyCatalogPatch(portal) walk.go() finally: if use_catalog_patch: removeCatalogPatch(catalog_class) print >>out, walk.getOutput() LOG.debug('<-- Migrating %s to %s done' % (src_portal_type, dst_portal_type)) return out
def migrateFtwFiles(context): portal = getToolByName(context, "portal_url").getPortalObject() out = "" try: catalog_class = applyCatalogPatch(portal) out = migrate(context, walker=getFtwFileMigrationWalker) finally: removeCatalogPatch(catalog_class) return out