Plone / Workflow-为什么portal_workflow工具的getStatusOf返回None?

时间:2016-10-04 13:37:49

标签: plone plone-4.x

我正在尝试获取灵活内容类型的工作流状态(my.product.my_object)

我的工作流程'my_object_workflow'有三种状态: 草案 PENDING_APPROVAL 批准

在我的浏览器视图中,我试图获取my_objects的状态。 我在my_objects中查询portal_catalog。

my_objects = api.portal.get_tool(name='portal_catalog').searchResults(
                                           {'portal_type':'my.product.my_object',
                                             ...
                                           })

我得到了大脑然后遍历列表并尝试使用portal_workflow工具打印状态。:

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())

不幸的是,它不是打印对象的状态,而是打印None。

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

可能导致这种情况发生的原因是什么?我误解了getStatusOf实际上是为了什么?

我正在使用Plone 4.3

1 个答案:

答案 0 :(得分:3)

要解决您的问题,您需要知道getStatusOf实际上在做什么。 如果调用None,有几种情况可以获得getStatusOf

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

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 ()

getStatusOf获取存储在workflow_history属性中的列表的最后一个条目。

workflow_history是一个持久的Dict:

  • 密钥是工作流ID [在您的情况下为my_object_workflow
  • 值是工作流转换(转换列表)

为什么您的大脑元数据的值不正确?

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

为什么呼叫getStatusOf为无?

如果您更改工作流程并且新工作流程的workflow_history存储空白或尚未初始化,则通常会发生这种情况。

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

恕我直言,这不是一件容易的事。你需要做几件事。

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

通过自述文件的Workflow Chain Updater部分或查看implementation

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

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