从(现在已过时)自定义ATImage内容类型迁移

时间:2011-08-31 10:55:03

标签: plone archetypes

我们有一整套Plone 3网站,其中包含自定义图像类型 来自ATImage的子类。这允许我们添加额外的图像缩放到 标准清单(“'logo':( 454,58)”,由我们的主题包使用。)

虽然这仍然适用于Plone 4,但它现在并不是真正的正确方法 plone.app.imaging是标准工具包的一部分。这可以定义自定义比例 苍蝇。

看起来我可以在任何类型的子类上启用plone.app.imaging 通过简单地为自定义集合设置“sizes = None”来自ATImage 缩放类型。然而,我留下了ATImage的冗余子类。 从长远来看,更换我们现有的所有“FalconImage”会很有用 带有标准“图像”内容项的内容项(总共数百个)。

测试网站上的简短实验表明,如果我只是浏览文档 树将portal_type属性从“FalconImage”更新为“Image”然后 内容表现为“图像”:每个对象突然获得一个 转换选项卡和@@ imaging-controlpanel定义的所有比例。

我相信这种蛮力方法会产生影响。 是否有推荐的方法将一种类型转换为另一种类型?

(如果有人认为,我很乐意为我们的自定义ATImage类型添加源代码 这是相关的。它实际上只是ATImage的一个非常小的调整,有一个 ImageField上不同的大小集合

3 个答案:

答案 0 :(得分:2)

是的,有一种推荐的方法:

http://pypi.python.org/pypi/Products.contentmigration

您唯一需要做的就是编写从FalconImage到Image的自定义迁移。

再见 贾科莫

答案 1 :(得分:1)

您需要使用Products.contentmigration,但那里的文档无处可寻。使用docs at plone.org逐步了解迁移内容。

答案 2 :(得分:1)

感谢贾科莫和罗斯的指示。

为了防止对其他人有用,我的迁移代码最终如下所示:

from Products.contentmigration.walker import CustomQueryWalker
from Products.contentmigration.archetypes import InplaceATItemMigrator

class FalconImageMigrator(InplaceATItemMigrator):
    walker = CustomQueryWalker
    src_meta_type = "FalconImage"
    src_portal_type = "FalconImage"
    dst_meta_type = "ATBlob"
    dst_portal_type = "Image"

    # Following stolen from plone.app.blob.migrations, ATImageToBlobImageMigrator
    # migrate all fields except 'image', which needs special handling...
    fields_map = {
        'image': None,
    }

    def migrate_data(self):
        self.new.getField('image').getMutator(self.new)(self.old)

    # ATFileToBlobMigrator reindexes certain fields. Otherwise we
    # need to clear and rebuild the entire catalog.
    def last_migrate_reindex(self):
        self.new.reindexObject(idxs=['object_provides', 'portal_type',
           'Type', 'UID'])

migrator = FalconImageMigrator
walker   = migrator.walker(portal, FalconImageMigrator)

walker.go()
print walker.getOutput()

并发症:

  1. 当数据迁移到blob存储区时,Image作为目标类型有点奇怪。

  2. 我们需要更新目录,以便TinyMCE生成“resolveuid / UID”链接 继续工作。 Migrator类的last_migrate_reindex()方法应该比从头开始清理和重建整个目录更快。