На одном из моих сайтов 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
It отлично работает для полей ввода текста, но я не могу заставить его работать для поля «получатели». Метод для генерации значений по умолчанию следующий (с некоторой отладочной информацией с уродливой печатью, но они будут удалены позже ;) ):
@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['recipients'].value» я получаю этот тип данных) их UID, но ни одно из решений не оказывает никакого эффекта.
Я также пробовал возвращать кортежи вместо списков или даже генераторов, но все равно безрезультатно.
Метод вызывается наверняка, т.к. я вижу следы в логе инстанса.