2012/07/10

ContentMigration Example

When migrating Plone from 2.5 to 4.x, you might want to migrate the custom Archetypes packages. Here is one simple example. Note that this might not be best practice, but should be working if your migration case is simple as mine.

First create a migration.py file in myproj.atcontent/myproj/atcontent/Extensions/

#!/usr/bin/python
# -*- coding: utf-8 -*-

from Products.contentmigration.archetypes import InplaceATItemMigrator, ATItemMigrator
from Products.contentmigration.walker import CustomQueryWalker
from Products.contentmigration.archetypes import *
from Products.contentmigration.common import unrestricted_rename

from transaction import savepoint
from Products.CMFCore.utils import getToolByName


def getMigrationWalker(context, migrator):
    """ set up migration walker using the given item migrator """
    portal = getToolByName(context, 'portal_url').getPortalObject()
    return CustomQueryWalker(portal, migrator, use_savepoint=False)


class OldTypeToNewTypeMigrator(InplaceATItemMigrator):
    src_portal_type = 'OldType'
    src_meta_type = 'OldType'
    dst_portal_type = 'NewType'
    dst_meta_type = 'NewType'

    def last_migrate_reindex(self):
        self.new.reindexObject(idxs=['object_provides', 'portal_type',
            'Type', 'UID'])

    def renameOld(self):
        self.code_field = self.old.getCode_field()
        InplaceATItemMigrator.renameOld(self)

    def remove(self):
        if self.new.getId() != self.code_field:
            unrestricted_rename(self.new.aq_inner.aq_parent, self.new.getId(), self.code_field)

    fields_map = {
        'datasource': 'data_src',
        'old_field': 'new_field',
    }


def getOldTypeToNewTypeMigrationWalker(self):
    return getMigrationWalker(self, migrator=OldTypeToNewTypeMigrator)


def migrateOldType(self):
    walker = getOldTypeToNewTypeMigrationWalker(self)
    savepoint(optimistic=True)
    walker.go()
    return walker.getOutput()


class ImagesToPhotosMigrator(InplaceATItemMigrator):
    src_portal_type = 'Image'
    src_meta_type = 'ATBlob'
    dst_portal_type = 'Photo'
    dst_meta_type = 'Photo'

    def last_migrate_reindex(self):

        self.new.reindexObject(idxs=['object_provides', 'portal_type',
            'Type', 'UID'])

    fields_map = {
    }

def getImagesToPhotosMigrationWalker(self):
    return getMigrationWalker(self, migrator=ImagesToPhotosMigrator)

def migrateImages(self):
    walker = getImagesToPhotosMigrationWalker(self, {'path': '/my_folder'})
    #savepoint(optimistic=False)
    walker.go()
    return walker.getOutput()

Then, go ZMI and add an External Method in Plone Site root:

Id: myproj.atcontent.migration
Module Name: myproj.atcontent.migration
Function Name: migrateOldType

Click Test tab to run the External Method. If everything goes well, you might want go portal_catalog Advanced tab to Update Catalog.

No comments: