In uno dei miei siti Plone, ho alcuni modelli di destrezza che uso per generare lettere. I modelli sono: "Modello" (il contenuto di base della lettera), "Contatto" (che contiene le informazioni di contatto, come nome, indirizzo ecc.) E "Unisci" (che è un oggetto Modello reso, in cui sostituiamo alcuni parti del modello con le informazioni sui destinatari). Lo schema dell'oggetto "Merge" è la seguente:Plone e Dexterity: valori predefiniti per il campo "relazione"
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'),
)
Quando si crea una nuova "Merge" oggetto, voglio avere i "destinatari" campi essere state preimpostate con tutti i contatti disponibili nella cartella in cui il nuovo l'oggetto è stato creato. Ho seguito la guida di Martin Aspelli per aggiungere un valore predefinito per un campo: http://plone.org/products/dexterity/documentation/manual/developer-manual/reference/default-value-validator-adaptors
Funziona bene per i campi di inserimento testo, ma non posso farlo funzionare per il campo "destinatari". Il metodo per generare i valori di default è il seguente (con alcune informazioni di debug con brutto stampa, ma continuerà a essere rimosso dopo;)):
@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
ho cercato di restituire gli oggetti direttamente, il loro percorso relativo (in la vista aggiunta, quando si accede a "self.widgets ['destinatari']. valore", ottengo questo tipo di dati) i loro UID ma nessuna soluzione come nessun effetto.
Ho anche provato a restituire tuple anziché elenchi o anche generatori, ma ancora nessun effetto.
Il metodo viene chiamato di sicuro, come vedo tracce nel registro di istanza.