Ограничение одного элемента контента на участника в папке на Plone 4 - PullRequest
7 голосов
/ 29 апреля 2011

Я создал пользовательский тип контента Archetypes под названием «Résumé» и хотел бы ввести ограничение, позволяющее Участнику добавлять только один элемент этого типа в папку. Еще лучше перенаправить участника на страницу edit его или ее элемента, если он уже существует в этой папке.

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

Ответы [ 3 ]

5 голосов
/ 29 апреля 2011

Решение аналогичного варианта использования для Plone 3 можно найти в eestec.base.Мы сделали это, переопределив createObject.cpy и добавив специальную проверку для этого.

Код находится в коллективном SVN, в http://dev.plone.org/collective/browser/eestec.base/trunk/eestec/base/skins/eestec_base_templates/createObject.cpy, строки 20-32.

2 голосов
/ 30 апреля 2011

Ну, это своего рода ограничение валидации, так что, может быть, добавить валидатор в поле заголовка, который в действительности не беспокоится о заголовке, но проверяет пользователя и т. Д.? (Я думаю, что валидатору поля передается достаточно информации, чтобы это осуществить, если нет, переопределение метода post_validate или прослушивание соответствующего события должно работать.)

Если вы попробуете это, имейте в виду, что post_validate уже вызывается во время редактирования пользователем (т.е. при перемещении фокуса из поля).

1 голос
/ 29 апреля 2011

Я не знаю, будет ли это лучше, но вы можете подключить def at_post_create_script из базового объекта при создании и manage_beforeDelete при удалении.

например:

from Products.ATContentTypes.lib import constraintypes

class YourContentype(folder.ATFolder)
[...]

    def at_post_create(self):
        origin = aq_parent(aq_inner(self))
        origin.setConstrainTypesMode(constraintypes.ENABLED)  # enable constrain types
        org_types = origin.getLocallyAllowedTypes()           # returns an immutable tuple
        new_types = [x for x in org_types if x! = self.portal_type]       # filter tuple into a list
        origin.setLocallyAllowedTypes(new_types)

    def manage_beforeDelete(self, item, container)          
        BaseObject.manage_beforeDelete(self, item, container)     # from baseObject
        self._v_cp_refs = None                                    # from baseObject
        origin = aq_parent(aq_inner(self))
        origin.setConstrainTypesMode(constraintypes.ENABLED)  # enable constrain types
        org_types = origin.getLocallyAllowedTypes()           # returns an immutable tuple
        new_types = [x for x in org_types].append(self.portal_type)
        origin.setLocallyAllowedTypes(new_types)

Примечание. Существует также метод с именем setImmediatelyAddableTypes(), который вы можете изучить. Примечание II: Это не переживает миграцию контента.

...