使用具有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有两个字段,即afile和secondfile,您需要注册一个类似以下扩展器
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]