Plone 普隆:(原型)使新闻项目和事件成为民俗

Plone 普隆:(原型)使新闻项目和事件成为民俗,plone,plone-4.x,Plone,Plone 4.x,我知道我可以使用collective.folderishtypes添加新类型(folderish)来代替默认的新闻项和事件。但我希望将现有的新闻项目和事件转换为folderish内容类型,并尽可能使其简单。是否可以用简单的方式覆盖(monkey patching?)默认类型(从而使现有对象具有folderish行为) 或者解决这个问题的好方法是什么?我只需要解决现有的对象,也没有混淆重复的内容类型,如:添加新的新闻项目,新闻项目Folderish。。。还有,如果可能的话,保持现有列表(如最新事件

我知道我可以使用collective.folderishtypes添加新类型(folderish)来代替默认的新闻项和事件。但我希望将现有的新闻项目和事件转换为folderish内容类型,并尽可能使其简单。是否可以用简单的方式覆盖(monkey patching?)默认类型(从而使现有对象具有folderish行为)


或者解决这个问题的好方法是什么?我只需要解决现有的对象,也没有混淆重复的内容类型,如:添加新的新闻项目,新闻项目Folderish。。。还有,如果可能的话,保持现有列表(如最新事件)工作。

我没有测试过这一点,但基于
集合.folderishtypes
(“如何将非folderishtypes迁移到folderish类型”)您应该能够在Plone站点根目录上调用
@@migrate btrees
视图,将非folderish内容类型迁移到folderish


警告:在尝试迁移之前对数据库进行备份,并在将其应用于生产数据之前先在开发环境中进行测试。

我没有使用collective.folderish的经验,虽然描述听起来很有希望,但太糟糕了,它似乎不适合您

如果我需要解决这个问题,并且不需要保留历史记录(工作流和内容历史记录),我会创建一个具有相同字段的新folderish类型,为每个事件和新闻创建一个新类型的实例,并复制字段值

这将改变修改日期,但可以通过将修改日期复制到发布日期字段(如果尚未使用)并执行“最新新闻/事件”——按发布日期排序的集合列表来克服

但是,如果您希望保留历史记录并保持mod date不变,则可以为每个新闻/事件项创建一个文件夹,将该项放入该文件夹,将该项设置为文件夹的默认视图,并将该文件夹重命名为与该项相同的id。这将使文件夹和项目在UI中显示为一个项目,并且指向该项目的链接不会中断,因为文件夹位于目标位置

我用浏览器视图脚本对此进行了测试。唉,在一次脚本运行中添加文件夹和移动项目都不起作用,因为我无法在短时间内找到原因。因此,需要调用浏览器视图三次:

from Acquisition import aq_parent, aq_inner
from Products.Five.browser import BrowserView


class View(BrowserView):

    report = ''

    def __call__(self):
        portal = self.context
        catalog = portal.portal_catalog
        news_items = catalog.searchResults(portal_type='News Item')
        event_items = catalog.searchResults(portal_type='Event')
        items = news_items + event_items
        for i, item in enumerate(items):
            self.processItem(item, i, len(items))
        return self.report


    def processItem(self, item, i, itemsAmount):
        item      = item.getObject()
        item_id   = item.id
        parent    = aq_parent(aq_inner(item))
        folder = None
        folder_id = item_id + '-container'


        if item_id == parent.id:

            if i == itemsAmount-1: self.report += '\
Nothing to do, all ' +  str(itemsAmount) + ' items have the same id as their parent.'


        else:
            if parent.id == folder_id:
                parent = getParent(parent)
                folder = parent[folder_id]
                folder.setDefaultPage(item_id)
                parent.manage_renameObject(folder.id, item_id)
                if i == itemsAmount-1: self.report += '\
Step 3/3: Renamed ' +  str(itemsAmount) + ' folder-ids.'

            else:
                try:
                    folder = addFolder(parent, folder_id)
                    if i == itemsAmount-1: self.report += '\
Step 1/3: Added ' +  str(itemsAmount) + ' folders.'

                    folder.setTitle(item_id) # set same title as item has
                    folder.reindexObject()
                except:
                    folder = parent[folder_id]
                try:
                    cutAndPaste(item, folder)
                    if i == itemsAmount-1: self.report += '\
Step 2/3: Moved ' +  str(itemsAmount) + ' items into folders.'
                except:
                    pass

def addFolder(parent, folder_id):
    parent.invokeFactory('Folder', folder_id)
    folder = parent[folder_id]
    folder.setTitle(folder_id)
    folder.reindexObject()
    return folder

def cutAndPaste(item, folder):
    """ Move item into folder. """
    parent = aq_parent(aq_inner(item))
    clipboard = parent.manage_cutObjects([item.id])
    folder.manage_pasteObjects(clipboard)
    folder.reindexObject()

def getParent(item):
    return aq_parent(aq_inner(item))
免责声明:

  • 您还需要在每次创建新事件/新闻项时使用事件侦听器执行此过程
  • 最好为流程的每个步骤创建新的事件侦听器,并在前一个步骤结束时启动下一个事件侦听器
  • 假定文件夹的临时id(由项id和任意后缀“-container”组成)在项的父项中不存在。虽然这不太可能发生,但您可能也希望在脚本中捕获该异常

  • 2017/11/23-14:24:52从以下位置迁移基于btree的文件夹:2017/11/23-14:24:54中间提交(已处理0个对象,最后一批为2.336s)。。。2017/11/23-14:24:54以2.336秒(0.968秒cpu时间)处理了0个对象。我会检查文件的。看来我别无选择。因此,我将使用collective.folderishtypes。谢谢。已处理0个对象->旧对象不是文件夹格式。奇怪。。。可能是因为
    collective.folderishtypes
    中的错误,或者我误解了文档。在任何情况下,如果您可以创建一个bug报告,这将非常有用:这样问题就可以得到解决,文档也可以得到澄清。。。它现在似乎对我有用。很好,这些类型被替换了-在添加新菜单中,我没有复制类似的内容类型。我必须更新listings查询以包含folderish对象。也许我会暂时摆脱对旧对象的迁移——我看到我们也可以编辑它们(作为旧的非folderish类型)。如果不进行迁移,我们可以用新项目替换旧项目,以防我们需要它,但很可能旧新闻和事件不需要它。:)