[Plone-IT] cercatori (o smart folder)

Giacomo Zanobini g.zanobini a arpat.toscana.it
Lun 19 Ott 2009 13:03:37 UTC


a conclusione del dibattito, volevo riassumere ciò che ho fatto, perchè 
penso che potrebbe tornare utile a qualcuno, in futuro.

come ha detto Yuri:
>
> Con i cercatori puoi usare solo criteri in AND, mi pare, quindi non 
> puoi fare questo tipo di ricerche.

>
> Ti conviene fare una query al catalogo direttamente (usando la 
> sintassi che trovi qui: 
> http://www.dieter.handshake.de/pyprojects/zope/AdvancedQuery.html) che 
> è supportata da Plone, copiare il folder_view passandogli gli elementi 
> risultanti.
>
> Oppure segui la dritta qui:
>
> http://groups.google.it/group/plone-users/browse_thread/thread/7435080ae6c5fb6d 
>
>
> cioè crei un indice specializzato che dica si o no (risultato di uno 
> script) a seconda del fatto che debba o meno essere incluso nei 
> risultati. Dopo di che, alla query che include cani e gatti, aggiungi 
> un criterio booleano su quell'indice.
mi pare che entrambe le soluzioni non siano facili per un utente di 
bassa lega che voglia modificare i criteri di ricerca.

la mia soluzione è con due due external method:
il primo unisce i risultati di due cercatori,
il secondo li ordina (per esempio potrei passare il criterio "Title", 
oppure data di pubblicazione)

in qualsiasi page template, posso quindi definire due liste (popolate 
con i risultati di due cercatori)
che successivamente fondo e riordino sulla base di un campo passato come 
parametro (purché comune a tutti gli elementi delle due liste)



ecco un esempio (ricordo il problema iniziale: avere una lista che 
contenesse l'unione dei risultati di due o piu' cercatori)
siano list1 e list2 due cercatori (uno per i cani e l'altro per i gatti)
ho messo il seguente codice in un page template che mi serve per 
visualizzare
>         <tal:foldercontents define="
>                             folderContents1 
> python:container.list1.queryCatalog();
>                             folderContents2 
> python:container.list2.queryCatalog();
>                             folderContents 
> python:context.list_join(folderContents1, folderContents2);
>                             folderContents 
> python:context.sort_by_attr(folderContents,'Title'); 


DOMANDA:
mi rimane da capire un misterioso comportamento (di python e dei 
cercatori) che mi causava un errore (non sempre, dipendeva da come avevo 
definito i due cercatori)
date due liste folderContents1  e folderContents2 che contengono i 
risultati di due cercatori (simili come criteri, ma non uguali)

python:folderContents1 + folderContents1     NON dà errore
python:folderContents2 + folderContents2     NON dà errore
python:folderContents1 + folderContents2     DA' ERRORE a runtime e dice 
che non posso unire stringhe a liste (eppure sono due liste non vuote)
python:folderContents2 + folderContents1     DA' ERRORE a runtime 
diverso da quello della riga precedente (ovvero cambiando l'ordine degli 
addendi, cambia l'errore)

in sostanza non posso unire due liste usando l'operatore di somma
mi è toccato usare (nel codice python dell'ExternalMethod) l'operatore 
"+=" che è piu' "tollerante".

def list_join(list1, list2):
    intermed = []
    intermed += list1
    intermed += list2
    return intermed


e in questo modo non vengono segnalati errori e tutto sembra funzionare


Giacomo



-----------------------------------------------------

#questa è la funzione che ordina sulla base di un attributo (il cui nome 
viene passato come parametro)
def sort_by_attr(seq, attr, reverse=False):
    intermed = [ (getattr(seq[i], attr), i, seq[i]) for i in 
xrange(len(seq)) ]
    intermed.sort(reverse=reverse)
    return [ tup[-1] for tup in intermed ]
   
#funzione che attacca assieme due liste
def list_join(list1, list2):
    intermed = []
    intermed += list1
    intermed += list2
    return intermed

-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.plone.org/pipermail/plone-plone-it/attachments/20091019/f32b7d6a/attachment.html>


Maggiori informazioni sulla lista Plone-IT