Plone/工作流-为什么门户是工作流工具';什么都不返回?

Plone/工作流-为什么门户是工作流工具';什么都不返回?,plone,plone-4.x,Plone,Plone 4.x,我正在尝试获取灵巧内容类型(my.product.my\u对象)的工作流状态 我的工作流“我的对象工作流”有三种状态: 草案 待批准 批准 在我的浏览视图中,我试图获取我的_对象的状态。 我为我的对象查询门户目录 my_objects = api.portal.get_tool(name='portal_catalog').searchResults( {'portal_type':'my.product.my

我正在尝试获取灵巧内容类型(my.product.my\u对象)的工作流状态

我的工作流“我的对象工作流”有三种状态: 草案 待批准 批准

在我的浏览视图中,我试图获取我的_对象的状态。 我为我的对象查询门户目录

my_objects = api.portal.get_tool(name='portal_catalog').searchResults(
                                           {'portal_type':'my.product.my_object',
                                             ...
                                           })
我得到大脑,然后遍历列表,并尝试使用portal_工作流工具打印状态:

wf_tool = api.portal.get_tool(name='portal_workflow')

for m_obj in my_objects:
    print wf_tool.getStatusOf('my_object_workflow',m_obj.getObject())
不幸的是,它不是打印对象的状态,而是不打印任何状态

我可以使用m_obj['review_state'],因为m_obj是一个大脑,但我更喜欢使用portal_工作流工具

什么会导致这种情况发生?我是否误解了getStatusOf的实际用途


我正在使用Plone 4.3来解决您的问题,您需要知道
getStatusOf
实际上在做什么。 如果调用了
getStatusOf
,则有几种可能的情况可以获取
None

首先看一下实现(
Products.CMFCore.WorkflowTool
):

getStatusOf
获取存储在
workflow\u history
属性中的列表的最后一项

工作流\u历史记录
是一个持久的Dict:

  • 关键点是工作流id-在您的情况下
    my\u object\u工作流
  • 这些值是工作流转换(转换列表)

为什么您的大脑元数据具有错误的值?

通常,如果操作/更改工作流而忘记更新目录,就会发生这种情况


为什么调用
getStatusOf
为None?

如果您更改工作流,并且新工作流的
工作流\u历史记录
存储为空或尚未初始化,则通常会发生这种情况


如果更改类型的工作流配置,如何避免此问题?

我觉得这不是一件容易的事。你需要精通几件事

我个人使用
ftw.upgrade
为我的类型引入新的工作流

浏览自述文件部分或查看

如果更改了类型的工作流,则必须手动执行以下步骤或使用ftw.upgrade:

  • 将每个对象的状态设置为新工作流的初始状态
  • 将工作流历史记录从旧工作流迁移到新工作流
  • 如果从特定类型中删除工作流,则需要手动重置每个受影响对象的权限
  • 使目录保持最新

我很抱歉,但我发现在我的迭代过程中,我使用了错误的对象。我可以删除这个问题吗?我不相信它会有任何用途。Nvm,当这个问题可能出现时,提供了一个冗长的答案。您可以删除它,但我只是写了一个答案,因为很容易意外获得您遇到的问题。感谢您提供了一个深入的答案。这将涵盖我将来在获取工作流状态时可能遇到的任何问题。我很感激。
def getStatusOf(self, wf_id, ob):
    """ Get the last element of a workflow history for a given workflow.
    """
    wfh = self.getHistoryOf(wf_id, ob)
    if wfh:
        return wfh[-1]
    return None

def getHistoryOf(self, wf_id, ob):
    """ Get the history of an object for a given workflow.
    """
    if hasattr(aq_base(ob), 'workflow_history'):
        wfh = ob.workflow_history
        return wfh.get(wf_id, None)
    return ()