Как программно управлять списком разрешенных типов содержимого в меню добавления объектов? - PullRequest
2 голосов
/ 04 марта 2011

Я хотел бы прагматично управлять списком разрешенных типов контента отдельных объектов.

Я создаю коллекцию типов контента с помощью archgenxml.В одном случае у меня есть класс моделирования, состоящий из класса RangeBase, который имеет три реализации: valueRange, vectorRange иiformRange.Симуляция может содержать ровно один диапазон, т. Е. Кратность RangeBase равна единице, поэтому в меню добавления симуляции должны быть предложены либо все три типа диапазонов, либо ни одного.и события IObjectRemovedEvent;помещая их соответствующие обработчики, initializedHook и removeHook, в класс RangeBase.Обработчики запрашивают список объектов локально разрешенных типов и соответственно удаляют или добавляют три диапазона.Изучив «Документацию разработчика сообщества» Plone, я подумал, что код initializedHook может выглядеть примерно так:

  # Set allowed content types
  from Products.ATContentTypes.lib import constraintypes

  def initializedHook(obj, event):

    # Get this range's parent simulation
    parent = obj.aq_parent

    # Enable constraining
    parent.setConstrainTypesMode(constraintypes.ENABLED)

    # Remove the three ranges 
    allowedTypes = parent.getLocallyAllowedTypes()
    ranges = ('valueRange','vectorRange','uniformRange')
    for range in ranges:
      allowedTypes.remove(range)

    # Tweak the menu
    parent.setLocallyAllowedTypes(allowedTypes)
    parent.setImmediatelyAddableTypes(allowedTypes)

К сожалению, мой класс моделирования не имеет ни одной из этих функций.

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

Ответы [ 4 ]

4 голосов
/ 04 марта 2011

Возможно.

Полагаю, вам нужно переопределить getLocallyAllowedType ()

http://svn.plone.org/svn/collective/Products.ATContentTypes/trunk/Products/ATContentTypes/lib/constraintypes.py

AT было записано за время до адаптеров, поэтому AT не использует его.

Я полагаю, вы также можете обновить документацию, касающуюся этого ... это довольно распространенный вариант использования.

http://web.archive.org/web/20101010142032/http://collective-docs.plone.org/content/creating.html

1 голос
/ 11 марта 2011

После нескольких неудачных попыток настройки _allowedTypes () я последовал последнему предложению на http://plone.org/documentation/kb/restrict-addable-types и настроил getNotAddableTypes.py. Моя настройка просто перечисляет фильтрацию содержимого папки для трех диапазонов. Если полученный массив не пустой, я добавляю в список три типа диапазона:

 # customize this script to filter addable portal types based on
 # context, the current user or other criteria

 ranges = []
 ranges = context.listFolderContents(contentFilter={'portal_type':
                     ('VectorRange','ValueRange','UniformRange')})
 return {True:  ('Favorite', 'VectorRange', 'ValueRange', 'UniformRange'),
         False: ('Favorite')}[len(ranges)]
0 голосов
/ 13 марта 2011

Метод

foo.getLocallyAllowedTypes()

возвращает кортеж, который вам просто нужно скопировать / отфильтровать в другой кортеж / список, потому что он неизменен.

allowed_types = parent.getLocallyAllowedTypes()
filtered_types = []
for v in allowed_types:
    if not v in ranges:
        filtered_types.append(v)

Тогда вы можете просто передать этот кортеж методу setter

parent.setLocallyAllowedTypes(filtered_types)

и все готово.Но если вы хотите получить доступ к родителю во время создания объекта, чтобы ограничить типы содержимого папки, вы создаете объект в, вы можете подключить в at_post_create_script () и manage_beforeDelete () из BaseObject.Это прекрасно работает для меня, ограничивая количество определенных типов контента в папке, а также исправляет AllowedTypes, когда объект удаляется.

0 голосов
/ 05 марта 2011

См. Последний пост здесь для двух возможностей: http://plone.293351.n2.nabble.com/Folder-constraints-not-applicable-to-custom-content-types-td6073100.html

...