Plone/Workflow. Почему getStatusOf инструмента portal_workflow возвращает None?

Я пытаюсь получить состояние рабочего процесса типа содержимого ловкости (my.product.my_object)

Мой рабочий процесс my_object_workflow имеет три состояния: черновик pending_approval утвержден

В моем браузере я пытаюсь получить статус my_objects. Я запрашиваю portal_catalog для my_objects.

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.


person Patrick Downey    schedule 04.10.2016    source источник
comment
Прошу прощения, но я понял, что во время моей итерации я использовал не тот объект. Могу я удалить этот вопрос? Я не верю, что это послужит какой-либо цели.   -  person Patrick Downey    schedule 04.10.2016
comment
Nvm, был предоставлен пространный ответ, когда эта проблема может возникнуть.   -  person Patrick Downey    schedule 04.10.2016
comment
Вы можете удалить его, но я только что написал ответ, потому что легко получить проблемы, которые у вас были случайно.   -  person Mathias    schedule 04.10.2016


Ответы (1)


Чтобы решить вашу проблему, вам нужно знать, что на самом деле делает 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:

  • Ключи - это идентификатор рабочего процесса - в вашем случае my_object_workflow
  • Значения представляют собой переходы рабочего процесса (список переходов)

Почему метаданные вашего мозга имеют неправильное значение?

Обычно это происходит, если вы манипулируете/изменяете рабочий процесс и забываете обновить каталог.


Почему вызов getStatusOf не имеет значения?

Обычно это происходит, если вы меняете рабочий процесс, а хранилище workflow_history для нового рабочего процесса пусто или еще не инициализировано.


Как избежать этой проблемы, если я изменю конфигурацию рабочего процесса для своего типа?

ИМХО задача не из легких. Вы должны быть осведомлены о нескольких вещах.

Я лично использую ftw.upgrade, чтобы представить новый рабочий процесс для моего типа.

Перейдите к разделу Workflow Chain Updater в файле Readme или ознакомьтесь с реализация

Вы должны выполнить следующие шаги вручную или использовать ftw.upgrade, если вы изменили рабочий процесс для своего типа:

  • Установить состояние каждого объекта в начальное состояние нового рабочего процесса
  • Перенос истории рабочего процесса из старого в новый рабочий процесс
  • Если вы удаляете рабочий процесс из определенного типа, вам необходимо вручную сбросить разрешения для каждого затронутого объекта.
  • Держите каталог в актуальном состоянии.
person Mathias    schedule 04.10.2016
comment
Спасибо за подробный ответ. Это покроет любые проблемы, которые могут возникнуть у меня в будущем при получении статуса рабочего процесса. Я ценю это. - person Patrick Downey; 04.10.2016