[Product-Developers] Product Upgrade and Migration

Chris Heiland heiland at gmail.com
Fri Dec 9 20:41:58 UTC 2011


I'm not understanding how to execute an inplace migration via upgrade
steps. I want to rename a field and migrate it's contents from the old
name to the new name. Running the steps through portal_setup does
execute, however, the data stored in the field does not migrate as
expected. Also, the tests are failing because the old object is
getting created with the new schema. Any help would be appreciated. I
can include the tests if that is helpful.

Tutorial Followed:

http://plone.org/documentation/kb/migrate-custom-types-with-products.contentmigration

Working on plone 4.0.5 and migrating from mypackage.plone 0.5 to 0.5.1

mypackage.plone.upgrade/configure.zcml:

<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:genericsetup="http://namespaces.zope.org/genericsetup"
    i18n_domain="mypackage">

    <include package=".to051" />

</configure>

mypackage.plone.upgrade/to051/__init__.py:

from Products.CMFCore.utils import getToolByName
from plone.app.upgrade.utils import logger
from plone.app.upgrade.utils import loadMigrationProfile

def convertPageObjects(context):
    """Remove old Page object schema for new

    We disable link integrity checks here, as the migration only
    removes objects to recreate them fresh, so in the end nothing is
    permanently removed.
    """
    logger.info('Started migration of link objects.')
    from mypackage.upgrade.to051.migrations import migratePageObjects
    sprop = getToolByName(context, 'portal_properties').site_properties
    if sprop.hasProperty('enable_link_integrity_checks'):
        ori_enable_link_integrity_checks =
sprop.getProperty('enable_link_integrity_checks')
        if ori_enable_link_integrity_checks:
            logger.info('Temporarily disabled link integrity checking')
            sprop.enable_link_integrity_checks = False
    else:
        ori_enable_link_integrity_checks = None

    output = migratePageObjects(context)
    count = len(output.split('\n')) - 1
    logger.info('Migrated %s files to new link.' % count)

mypackage.plone.upgrade/to051/configure.zcml:

<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:genericsetup="http://namespaces.zope.org/genericsetup"
    i18n_domain="mypackage">

    <genericsetup:upgradeSteps
        source="0.5"
        destination="0.5.1"
        profile="mypackage.plone:default">

        <genericsetup:upgradeStep
            title="Upgrade Page Object Schema"
            handler="mypackage.plone.upgrade.to051.convertPageObjects"
            />

    </genericsetup:upgradeSteps>

</configure>

mypackage.plone.upgrade/to051/migrations.py:

try:
    from Products.contentmigration.archetypes import InplaceATItemMigrator
    from Products.contentmigration.walker import CustomQueryWalker
    haveContentMigrations = True
    BaseMigrator = InplaceATItemMigrator
except ImportError:
    BaseMigrator = object
    haveContentMigrations = False

from transaction import savepoint
from Products.CMFCore.utils import getToolByName
from Products.Archetypes.interfaces import ISchema

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=True)

def migrate(context, portal_type=None, meta_type=None, walker=None):
    """ migrate instances using the given walker """
    walker = walker(context)
    savepoint(optimistic=True)
    walker.go()
    return walker.getOutput()

# migration of file content to new content type
class PageObjectMigrator(BaseMigrator):
    src_portal_type = 'Page'
    src_meta_type = 'Page'
    dst_portal_type = 'Page'
    dst_meta_type = 'Page'

    ## Basically we delete content from fields if exists
    fields_map = {
        'newsSource' : 'source',
    }

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

def getPageObjectsMigrationWalker(self):
    return getMigrationWalker(self, migrator=PageObjectMigrator)

def migratePageObjects(self):
    return migrate(self, walker=getPageObjectsMigrationWalker)


More information about the Product-Developers mailing list