Невозможно программно создать тип контента Dexterity в Plone 4.3.1

Я создал новый тип контента с помощью менеджера ловкости в настройках сайта. Я могу успешно добавлять контент через пользовательский интерфейс Plone, но я пришел к тому, что мне нужно создать тот же объект с помощью скрипта Python.

Моя первая попытка была с invokeFactory:

context.invokeFactory("mycontenttype", id="test", Title="Test")

Этот же код работает для объектов "Папка", но не работает с моим типом ловкости:

Traceback (innermost last):
  Module ZPublisher.Publish, line 60, in publish
  Module ZPublisher.mapply, line 77, in mapply
  Module ZPublisher.Publish, line 46, in call_object
  Module Shared.DC.Scripts.Bindings, line 322, in __call__
  Module Products.PloneHotfix20130618.spamProtect, line 35, in _patched_bindAndExec
  Module Shared.DC.Scripts.Bindings, line 359, in _bindAndExec
  Module Products.PythonScripts.PythonScript, line 344, in _exec
  Module script, line 7, in test
   - <PythonScript at /three-year-plan/test>
   - Line 7
TypeError: invokeFactory() takes at least 3 arguments (2 given)

Проведя еще несколько поисков, я нашел несколько мест, относящихся к следующей функции:

from plone.dexterity.utils import createContentInContainer

Любая попытка импорта из plone.dexterity.utils в мои скрипты Python заканчивается ошибкой прав доступа:

Traceback (innermost last):

  Module ZPublisher.Publish, line 60, in publish
  Module ZPublisher.mapply, line 77, in mapply
  zModule ZPublisher.Publish, line 46, in call_object
  Module Shared.DC.Scripts.Bindings, line 322, in __call__
  Module Products.PloneHotfix20130618.spamProtect, line 35, in _patched_bindAndExec
  Module Shared.DC.Scripts.Bindings, line 359, in _bindAndExec
  Module Products.PythonScripts.PythonScript, line 344, in _exec
  Module script, line 1, in test
    - <PythonScript at /my-site/test>
    - Line 1
  Module AccessControl.ZopeGuards, line 305, in guarded_import
  Unauthorized: import of 'plone.dexterity.utils' is unauthorized

Мы будем очень признательны за любую помощь в устранении вышеуказанных ошибок или альтернативных методов. Подробная информация о версии размещена ниже для справки.

Обзор версии

Plone 4.3.1 (4306)
CMF 2.2.7
Zope 2.13.19
Python 2.7.3 (default, Aug 1 2012, 05:14:39) [GCC 4.6.3]
PIL 1.7.8 (Pillow)
Dexterity Content Types 2.0.8

person ngraves    schedule 05.08.2013    source источник


Ответы (2)


Для этой цели вы должны иметь возможность использовать «invokeFactory». Вы вызываете его в контейнере и передаете ему имя типа в виде строки.

Я не уверен, где ваша попытка использовать метод invokeFactory пошла наперекосяк, но он работает. См. http://developer.plone.org/reference_manuals/external/plone.app.dexterity/reference/manipulating-content-objects.html?highlight=invokefactory#adding-an-object-to-a-контейнер для получения подробной информации.

person SteveM    schedule 06.08.2013

Ваше предположение верно: вам нужно использовать createContentInContainer. Но вы не можете использовать его в сценарии Python, потому что разрешен только так называемый ограниченный Python [1]. Поместите его в представление [2].

В качестве справки взгляните на:

  1. http://developer.plone.org/reference_manuals/active/helloworld/extend/view.html
  2. http://plone.org/documentation/faq/restricted-python-scripts
person alepisa    schedule 05.08.2013
comment
Мы должны подумать о том, следует ли помечать вспомогательные функции Dexterity как безопасные для сценариев. Отправьте заявку на запрос функции на dev.plone.org. Если вы хотите попробовать сделать это самостоятельно, github.com/collective/collective.localfunctions может помочь. - person SteveM; 06.08.2013