Plone и Dexterity: значения по умолчанию для поля "отношение" - PullRequest
5 голосов
/ 21 марта 2012

На одном из моих сайтов Plone у меня есть несколько моделей ловкости, которые я использую для генерации писем.Модели: «Модель» (базовое содержание письма), «Контакт» (который содержит контактную информацию, такую ​​как имя, адрес и т. Д.) И «Слияние» (который представляет собой объект «Модель», в котором мы подставляем некоторыечасти модели с информацией о получателях).Схема объекта «Слияние» следующая:

class IMergeSchema(form.Schema):
    """
    """
    title = schema.TextLine(
        title=_p(u"Title"),
        )

    form.widget(text='plone.app.z3cform.wysiwyg.WysiwygFieldWidget')
    text = schema.Text(
        title=_p(u"Text"),
        required=False,
        )

    form.widget(recipients=MultiContentTreeFieldWidget)
    recipients = schema.List(
        title=_('label_recipients',
                 default='Recipients'),
        value_type=schema.Choice(
            title=_('label_recipients',
                      default='Recipients'),
            # Note that when you change the source, a plone.reload is
            # not enough, as the source gets initialized on startup.
            source=UUIDSourceBinder(portal_type='Contact')),
        )

    form.widget(model=ContentTreeFieldWidget)
    form.mode(model='display')
    model = schema.Choice(
        title=_('label_model',
                  default='Model'),
        source=UUIDSourceBinder(portal_type='Model'),
        )

При создании нового объекта «Слияние» я хочу, чтобы поля «получатели» были предварительно настроены со всеми контактами, доступными в папке, гденовый объект создан.Я следовал руководству Мартина Аспелли, чтобы добавить значение по умолчанию для поля: http://plone.org/products/dexterity/documentation/manual/developer-manual/reference/default-value-validator-adaptors

Это отлично работает для полей ввода текста, но я не могу заставить его работать для поля "получатели".Метод генерирования значений по умолчанию следующий (с некоторой отладочной информацией с уродливой печатью, но они будут удалены позже;)):

@form.default_value(field=IMergeSchema['recipients'])
def all_recipients(data):
    contacts =  [x for x in data.context.contentValues()
                 if IContact.providedBy(x)]
    paths =  [u'/'.join(c.getPhysicalPath()) for c in contacts]
    uids = [IUUID(c, None) for c in contacts]

    print 'Contacts: %s' % contacts
    print 'Paths: %s' % paths
    print 'UIDs: %s' % uids

    return paths

Я пытался вернуть объекты напрямую, их относительный путь(в представлении добавления при доступе к "self.widgets ['receients']. value" я получаю данные этого типа) их UID, но ни одно из решений не дает никакого эффекта.

Я также пытался вернутькортежи вместо списков или даже генераторов, но все равно никакого эффекта.

Метод вызывается наверняка, как я вижу следы в журнале экземпляров.

1 Ответ

3 голосов
/ 02 декабря 2013

Я думаю, вам нужно получить "int_id" соответствующего контента. Вот как поля отношений ловкости хранят информацию об отношениях ::

from zope.component import getUtility
from zope.intid.interfaces import IIntIds

@form.default_value(field=IMergeSchema['recipients'])
def all_recipients(data):
    contacts =  [x for x in data.context.contentValues()
                 if IContact.providedBy(x)]
    intids = getUtility(IIntIds)
    # The following gets the int_id of the object and turns it into
    # RelationValue
    values = [RelationValue(intids.getId(c)) for c in contacts]

    print 'Contacts: %s' % contacts
    print 'Values: %s' % values

    return values
...