如何使用rt.bulkmodify在Plone中搜索和替换敏捷内容

时间:2015-02-18 18:44:28

标签: python regex replace plone zope

我们正在从旧的现有静态站点迁移到Plone 4.3。我们从旧网站导入了几个HTML页面,现在面向需要在我们的Plone系统中更新的8000多个硬编码链接,以匹配我们的新网址标准。这些页面使用自定义灵巧类型构建。我们不想手工编辑这些内容。

我们想在Plone中使用批量修改工具。我们正在尝试使用它来使用正则表达式替换所有链接。不幸的是,无论我们使用此工具在Plone中搜索什么,都无法找到单个结果。

我觉得我们错过了一步或正在以错误的方式解决这个问题。

是否有我们缺少的程序或是否有更好的搜索方式和在我们的敏捷类型内容中替换我们的硬编码链接?我们认为我们可能需要以某种方式索引灵巧内容,以便可以搜索。

如果确实如此,我们似乎无法找到相关文档。

以下是我们用来尝试实现此功能的参考资料:

Plone.org - rt.bulkmodify

Python - rt.bulkmodify

Plone.org - catalog-indexing-strategies

1 个答案:

答案 0 :(得分:2)

对不起,rt.bulkmodify现在不支持Dexterity。您必须提供适当的IBulkModifyContentChanger适配器。

这里是我们为plone.app.contenttypes / Plone 5兼容性开发的未发行版本(由于不可能使其真正适用于Plone 5而未经过真正测试)。也应该适用于Plone 4上的纯灵巧自定义类型:

from ..interfaces import IBulkModifyContentChanger
from zope.interface import implements


class TextContentAdapters(object):
    """This is OK for every know plone.app.contenttypes dexterity item"""

    implements(IBulkModifyContentChanger)

    def __init__(self, context):
        self.context = context

    def _get_text(self):
        return self._get_utext().encode('utf-8')

    def _set_text(self, text):
        raise NotImplementedError("%s doesn't implements setter for 8-bit string" % self.context.portal_type)

    def _get_utext(self):
        text_data = getattr(self.context, 'text', None)
        if text_data:
            return text_data.raw

    def _set_utext(self, text):
        self.context.text = text
        self.context.reindexObject(idxs=['SearchableText'])

    text = property(_get_text, _set_text)
    utext = property(_get_utext, _set_utext)