2014-10-01 4 views
3

Я создаю элемент контента из адаптера пользовательского сценария PloneFormGen Form, используя invokeFactory. Пока все работает нормально, однако мы хотим начать генерировать комментарий для включения в действие для истории элемента. Сам комментарий будет сгенерирован с использованием полей из формы и некоторого предварительно заданного текста.Включить «Замечание об изменении» при создании контента из InvokeFactory

Возможно ли это из PFG?

Тип контента - это нестандартный тип, и он доступен для версий. Использование Plone 4.3.2, PFG 1.7.14

EDIT

Мой текущий код:

from Products.CMFPlone.utils import normalizeString 

portal_root = context.portal_url.getPortalObject() 
target = portal_root['first-folder']['my-folder'] 
form = request.form 
title = "My Title: "+form['title-1'] 
id = normalizeString(title) 
id = id+"_"+str(DateTime().millis()) 

target.invokeFactory(
    "MyCustomType", 
    id=id, 
    title=title, 
    text=form['comments'], 
    relatedItems=form['uid'] 
    ) 

Я попытался с помощью клавиш, как comments, comment, message, и даже cmfeditions_version_comment в аргументах target.invokeFactory. Пока не повезло.

ответ

2

Я не уверен, что это возможно в пользовательском адаптере сценария.

Действие первой записи: None. История автоматически показывает Create, если действие None. Это реализуется here (plone.app.layout.viewlets.content)

# On a default Plone site you got the following 
>>> item.workflow_history 
{'simple_publication_workflow': ({'action': None, 'review_state': 'private', 'actor': 'admin', 'comments': '', 'time': DateTime('2014/10/02 08:08:53.659345 GMT+2')},)} 

Ключа в Словаре является идентификатор рабочего процесса, а значение кортежа всех записей. Итак, вы можете манипулировать записью, как хотите. Но я не знаю, возможно ли это с помощью ограниченного python (пользовательский скриптовый адаптер может использовать только ограниченный питон).

Но вы также можете добавить новую запись, расширяя вам сценарий с:

... 

new_object = target.get(id) 
workflow_tool = getToolByName(new_object, 'portal_workflow') 

workflows = workflow_tool.getWorkflowsFor(new_object) 

if not workflows: 
    return 

workflow_id = workflows[0].id # Grap first workflow, if you have more, take the the one you need 
review_state = workflow_tool.getInfoFor(new_object, 'review_state', None) 

history_entry = { 
       'action' : action, # Your action 
       'review_state' : review_state, 
       'comments' : comment, # Your comment 
       'actor' : actor, # Probably you could get the logged in user 
       'time' : time, 
       } 

workflow_tool.setStatusOf(workflow_id, context, history_entry) 
+0

Я попробовал ваше предложение в CSA. Я получил эту ошибку: «Неавторизованный: вам не разрешен доступ к« setStatusOf »в этом контексте» Тип контента имеет функцию 'at_post_create_script' и' at_post_edit_script' в файле своего питона типа контента. Интересно, могу ли я применить там силу? Я заметил, что эти функции не вызываются при создании элементов из 'invokeFactory', но, возможно, я могу это получить? – rain2o

+1

Я смог получить 'workflow_tool.doActionFor()', чтобы работать. Мне просто нужно было создать новый рабочий процесс с именем действия, которое я хотел. – rain2o

+0

Вы должны запустить скрипт с правильным разрешением. afaik вы можете использовать роль прокси (например, менеджер) для запуска скрипта. Таким образом, вы можете избежать проблемы с разрешением (новый рабочий процесс также может быть решением). Вы также можете добавить это в свой скрипт 'at_post_create_script'. Но и там вы можете убедиться, что у вас есть права. – Mathias

 Смежные вопросы

  • Нет связанных вопросов^_^