2012-03-21 11 views
5

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.

Respuesta

3

Creo que debe obtener el "int_id" del contenido relacionado. Así es como los campos de relaciones de destreza almacenan información de relación ::

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 
Cuestiones relacionadas