En uno de mis sitios Plone, tengo algunos modelos de destreza que utilizo para generar letras. Los modelos son: "Modelo" (el contenido base de la carta), "Contacto" (que contiene la información de contacto, como nombre, dirección, etc.) y "Fusionar" (que es un objeto Modelo presentado, en el cual sustituimos algunos partes del modelo con la información de los destinatarios). El esquema del objeto "Combinar" es el siguiente:Plone and Dexterity: valores predeterminados para el campo "relación"
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'),
)
Al crear un nuevo "Combinar" objeto, quiero tener los "receptores" campos haya preestablecido con todos los contactos disponibles en la carpeta en la nueva el objeto es creado Seguí la guía de Martin Aspelli para agregar un valor predeterminado para un campo: http://plone.org/products/dexterity/documentation/manual/developer-manual/reference/default-value-validator-adaptors
Funciona bien para campos de entrada de texto, pero no puedo hacerlo funcionar para el campo "destinatarios". El método para generar los valores por defecto es la siguiente (con alguna información de depuración con la impresión feo, pero van a ser retirado después;)):
@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
Traté de devolver los objetos directamente, su ruta relativa (en la vista de agregar, al acceder a "self.widgets ['recipients']. value", obtengo este tipo de datos) sus UID, pero ninguna de las soluciones tiene ningún efecto.
También traté de devolver tuplas en lugar de listas o incluso generadores, pero todavía ningún efecto en absoluto.
El método se llama seguro, ya que veo rastros en el registro de instancia.