Configurar Seleccionable / Autocomplete de Grupos / Empresas o Contactos

Para configurar un campo relación asociado a una selección de grupos o empresas (o contactos), realizamos los siguientes pasos:

Para configurar una lista seleccionable (un select box)

- Agregar un Widget al layout : "KMKey Relation Select Widget"

- en el campo AdvancedQuery Expression (TALES) , utilizamos una expresión python que utlizará AdvancedQuery para ejecutar la consulta. Un ejemplo de filtro típico es filtrar los grupos de determinada categoría :
python:Eq('meta_type', 'KM Group')&In('categories',['customer','provider','lo que sea'])

o contactos

python:Eq('meta_type', 'KM Contact')

- Value to Show (TALES from the brain) : Aquí ponemos la expresión que se encarga de mostrar el valor :
python:brain.Title

Ya tenemos configurado nuestro seleccionable de empresas (o contactos)

En el caso de que haya muchos registros , no es conveniente, por motivos de rendimiento y de usabilidad, utilizar un seleccionable. Para ello podemos utilizar un autocomplete , con el mismo control, de la siguiente manera :

Para configurar un autocomplete:

- Realizamos exactamente los mismos pasos que antes
- Creamos , dentro de zmi/portal_skins/custom/ un python script. Lo llamaremos , por ejemplo "autocomplete_for_arquitectos"
- Establecemos el campo "Parameter list" a "value"
- El código del script deberá ser más o menos como el siguiente :

from Products.AdvancedQuery import MatchGlob, Eq, Le, Ge, In, Between, Generic

REQUEST = context.REQUEST
value = "*" + unicode(value, 'utf-8').encode('iso-8859-15') + "*"
catalog = context.portal_catalog

query = MatchGlob('Title', value) & Eq('meta_type', 'KM Group') & In('categories', 'Arquitecto')
brains = catalog.evalAdvancedQuery(query, ('Title' , ) )
result = ['< id="%s">%s< / li >' % (b.getDocid, b.Title) for b in brains]
result = ' <> ' + chr(10).join(result) + '< / ul >'
result = unicode(result, 'iso-8859-15')

REQUEST.RESPONSE.setHeader('Content-Type', 'text/xml;;charset=%s' % 'utf-8')
return result

- Finalmente, otra vez en el widget, establecemos el campo "Server method for autocompletation" con el nombre del script que hemos configurado antes (autocomplete_for_arquitecto, en el ejemplo)

Una vez hecho esto, en la pantalla de alta o edición, podemos establecer el campo utilizando la técnica del auto completado, escribiremos parte del nombre de la empresa a buscar, y la lista mostrará los elementos que coincidan, debiendo seleccionar uno de ellos

En caso de no aparecer ningún valor, revisar el script o mirar el error_log para localizar posibles errores

en el directorio de skins de KMKeyDefault, ya tenemos varios scipts por defecto que filtran grupos o contactos :

- auto_complete_for_contacts
- auto_complete_for_customers
- auto_complete_for_providers
- auto_complete_for_groups
- auto_complete_for_users_or_groups

Lo mismo que hemos hecho para grupos lo podemos hacer también para usuarios u otros objetos, simplemente cambiando las condiciones del query