跳转到主要内容

使用具有blob功能的FileFields迁移基于AT的内容类型的示例。

项目描述

简介

本示例包的目的是演示如何将使用FileFields的AT自定义内容类型迁移到使用基于plone.app.blob的blob。

迁移您自己的AT内容类型。

为了将您的内容类型迁移到使用blob,您需要执行以下步骤

使用架构扩展器将您的内容类型的FileField(s)替换为BlobField(s)。有关如何操作的详细信息,请参阅archetypes.schemaextender文档。本质上这包括

  • 创建一个扩展字段

    class ExtensionBlobField(ExtensionField, BlobField):
        """ derivative of blobfield for extending schemas """
  • 扩展您的内容类型以使用blob字段。例如,如果您的内容类型ExampleATType有两个字段,即afilesecondfile,您需要注册一个类似以下扩展器

    class ExampleATTypeExtender(object):
        adapts(IExampleATType)
        implements(ISchemaExtender)
    
        fields = [
            ExtensionBlobField('afile',
                widget=atapi.FileWidget(
                    label=_(u"A file"),
                    description=_(u"Some file"),
                ),
                required=True,
                validators=('isNonEmptyFile'),
            ),
            ExtensionBlobField('secondfile',
                widget=atapi.FileWidget(
                    label=_(u"Some other file"),
                    description=_(u"Some other file"),
                ),
                required=True,
                validators=('isNonEmptyFile'),
            ),
        ]
    
        def __init__(self, context):
            self.context = context
    
        def getFields(self):
            return self.fields

    如果您希望能够在不支持blob的实例上仍然使用您的内容类型(即没有plone.app.blob),您会发现使用条件注册适配器很方便

    <adapter
        zcml:condition="installed plone.app.blob"
        factory=".exampleattype.ExampleATTypeExtender" />

    这样,如果plone.app.blob未安装,您将使用原始的FileField(s)。

  • 编写迁移器。我们使用 Products.contentmigration 来完成此任务,并且对于上面的示例,迁移器希望这样

    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)
            self.obj.getField('afile').getMutator(self.obj)(f)
            f = self.obj.getField('secondfile').get(self.obj)
            self.obj.getField('secondfile').getMutator(self.obj)(f)
    
        def last_migrate_reindex(self):
            self.obj.reindexObject()

    您还需要提供一个遍历您的对象的 walker,在这种情况下

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

    现在您可以从视图或脚本中调用 migrateExampleATTypes 来转换您的对象。

变更日志

1.0 未发布

  • 初始版本 [ggozad]

项目详情


支持