Plone 普隆:(原型)使新闻项目和事件成为民俗
我知道我可以使用collective.folderishtypes添加新类型(folderish)来代替默认的新闻项和事件。但我希望将现有的新闻项目和事件转换为folderish内容类型,并尽可能使其简单。是否可以用简单的方式覆盖(monkey patching?)默认类型(从而使现有对象具有folderish行为)Plone 普隆:(原型)使新闻项目和事件成为民俗,plone,plone-4.x,Plone,Plone 4.x,我知道我可以使用collective.folderishtypes添加新类型(folderish)来代替默认的新闻项和事件。但我希望将现有的新闻项目和事件转换为folderish内容类型,并尽可能使其简单。是否可以用简单的方式覆盖(monkey patching?)默认类型(从而使现有对象具有folderish行为) 或者解决这个问题的好方法是什么?我只需要解决现有的对象,也没有混淆重复的内容类型,如:添加新的新闻项目,新闻项目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))
免责声明:
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类型)。如果不进行迁移,我们可以用新项目替换旧项目,以防我们需要它,但很可能旧新闻和事件不需要它。:)