Prepare data with collective.transmute for import with plone.exportimport – Migration best practices

Prepare data with collective.transmute for import with plone.exportimport

Prepare data with collective.transmute for import with plone.exportimport#

Instead of using collective.exportimport for the import of exported data you can also use collective.transmute

collective.transmute transforms data extracted by collective.exportimport into data to be loaded by plone.exportimport.

Important

A requirement for collective.transmute to work properly is to export each item as a separate file on the server and include the blob-data as base64 in the json-files. That means calling the export_content view with the arguments include_blobs=1 and download_to_server=2.

Here is an example for a export_all view that does that:

# -*- coding: UTF-8 -*-
from contentexport.interfaces import IContentexportLayer
from plone import api
from Products.Five import BrowserView
from zope.interface import alsoProvides

import logging

logger = logging.getLogger(__name__)

TYPES_TO_EXPORT = []


class ExportAll(BrowserView):

    def __call__(self):
        request = self.request
        if not request.form.get("form.submitted", False):
            return self.index()

        qi = api.portal.get_tool("portal_quickinstaller")
        if not qi.isProductInstalled("contentimport"):
            qi.installProducts(["contentimport"])
            alsoProvides(request, IContentexportLayer)

        portal = api.portal.get()

        export_name = "export_content"
        logger.info("Start {}".format(export_name))
        view = api.content.get_view(export_name, portal, request)
        exported_types = TYPES_TO_EXPORT
        request.form["form.submitted"] = True
        view(
            portal_type=exported_types,
            include_blobs=1,  # base64
            download_to_server=2, # each item as a separate file
            migration=True,
        )
        logger.info("Finished {}".format(export_name))

        other_exports = [
            "export_relations",
            "export_members",
            "export_translations",
            "export_localroles",
            "export_ordering",
            "export_defaultpages",
            "export_discussion",
            "export_portlets",
            "export_redirects",
        ]
        for export_name in other_exports:
            export_view = api.content.get_view(export_name, portal, request)
            request.form["form.submitted"] = True
            # store each result in var/instance/export_xxx.json
            export_view(download_to_server=True)

        logger.info("Finished export_all")
        # Important! Redirect to prevent infinite export loop :)
        return self.request.response.redirect(self.context.absolute_url())

With collective.transmute you can first create a nice report about the exported data regarding content types, views, review states and creators.

With collective.transmute you can configure a migration-pipeline that includes steps to migrate to Volto (e.g. transform html to Volto-blocks, integrate default-pages and transform collections to listing blocks).

Since collective.transmute is still in alpha and is undergoing development we will refer to the documentation: