skip to navigation
skip to content

example.blobattype 1.0b2

Example of migrating an AT-based content type using blob-enabled FileFields.


The purpose of this example package is to demonstrate how to migrate custom AT-based content types that use FileFields to use based blobs.

Migrating your own AT-based content types.

In order to migrate your own content types to use blobs you need to perform the following steps:

Use a schema extender to replace the FileField(s) of your content type with BlobField(s). For detailed information on how to do so please look into the archetypes.schemaextender documentation. In essence this breaks down to:

  • Creating an extension field:

    class ExtensionBlobField(ExtensionField, BlobField):
        """ derivative of blobfield for extending schemas """
  • Extending your content type to use the blob fields. So for instance if your content type ExampleATType has two fields, namely afile and secondfile you need to register an extender looking like:

    class ExampleATTypeExtender(object):
        fields = [
                    label=_(u"A file"),
                    description=_(u"Some file"),
                    label=_(u"Some other file"),
                    description=_(u"Some other file"),
        def __init__(self, context):
            self.context = context
        def getFields(self):
            return self.fields

    If you want to be able to still use your content type without on instances that do not support blobs yet, you will find it convenient to register the adapter with a conditional such as:

        factory=".exampleattype.ExampleATTypeExtender" />

    This way, if is not installed your original FileField(s) will be used.

  • Migrate using the helper method. The method will automatically find all blob-aware fields as defined by the schema extender above and perform migrations for those. It is as simple as:

    from import migrate
    def migrateExampleATTypes(context):
        return migrate(context, 'ExampleATType')
  • If you need, you can write your own migrator. Use Products.contentmigration to do so, and for the example above the migrator would like this:

    class ExampleATTypeMigrator(BaseInlineMigrator):
        """ example migrator """
        src_portal_type = 'ExampleATType'
        src_meta_type = 'ExampleATType'
        dst_portal_type = 'ExampleATType'
        dst_meta_type = 'ExampleATType'
        fields_map = {
            'afile': None,
            'secondfile': None,
        def migrate_data(self):
            f = self.obj.getField('afile').get(self.obj)
            f = self.obj.getField('secondfile').get(self.obj)
        def last_migrate_reindex(self):

    You will also need to provide a walker iterating over your objects, in this case:

    def migrateExampleATTypes(context):
        portal = getToolByName(context, 'portal_url').getPortalObject()
        migrator = ExampleATTypeMigrator
        walker = CustomQueryWalker(portal, migrator, full_transaction=True)
        return walker.getOutput()

    You can now call migrateExampleATTypes from a view or a script to convert your objects.


1.0b2 2009-11-06

  • Simplify required migration code by using the helper method provided by [ggozad, witsch]

1.0b1 2009-11-01

  • Initial version [ggozad, witsch]
File Type Py Version Uploaded on Size (md5, pgp) Source 2009-11-06 30KB