Personal tools
LinguaPlone e siti già popolati: trattare con attenzione!

dove sono le mie portlet?!?!?!

Nov 19, 2013

LinguaPlone e siti già popolati: trattare con attenzione!

Introdurre LinguaPlone in un sito già popolato è tutto sommato semplice. Basta non dimenticare alcuni piccoli dettagli, soprattutto riguardanti le portlet!

Una cosa a cui non avevo mai dato molta importanza è il modo con cui UberSelectionWidget (contenuto in plone.app.form) salva il riferimento all'oggetto tramite il suo path.

Non ho ancora approfondito il motivo di questa scelta, ma è decisamente poco felice, almeno in combinazione con la possibilità di inserire LinguaPlone nel sito.

 

Installando e configurando LinguaPlone, di solito il primo passo da fare è quello di spostare tutti i documenti del sito nella sezione dell'italiano. "Unico" problema è che tutto quello che si riferisce ad altri elementi tramite un path perde il riferimento, dal momento che si passerà da:


/sitename/my/old/path
 

a:


/sitename/it/my/old/path
 

L'effetto indesiderato è che componenti come le portlet che usano riferimenti per path, non possiedono più una configurazione corretta e, nella migliore delle ipotesi, scompaiono alla vista.

Se siamo davanti a un sito con poche portlet, sanare la situazione a mano può essere molto più veloce che procedere in modo programmatico, reimpostando i percorsi sbagliati.

Ma se gli elementi sono tanti, bisogna pensare a procedere in un modo diverso. Stessa cosa se non si ha assolutamente idea di quante portlet ci possono essere nel sito.

Come procedere?

La prima cosa che si può fare è ispezionare il sito. Il modo più comodo che conosco per verificare le portlet presenti è quello di usare redturtle.portlets.inspector, richiamando la vista "@@inspect-portlets" sulla radice del sito. Una volta scoperto quali portlet sono state create, bisogna verificare se fra i loro campi sono presenti quelli di tipo "Choice" che utilizzano lo UberSelectionWidget (oppure, ovviamente, altri campi con riferimenti basati su path).

Una volta identificate le portlet che possono presentare problemi, siamo già a un ottimo punto per poter sanare il sito. La vista di redturtle.portlet.inspector presenta la parte più importante nel seguente metodo:

    
def assignments(self, obj): ''' Get assignments for object ''' all_assignments = {} for manager_name, manager in self.portlet_managers: manager_assignments = getMultiAdapter((obj, manager)) try: keys = manager_assignments.keys() except: keys = [] if keys: all_assignments[manager_name] = [type(manager_assignments[x]) for x in keys] return all_assignments

Con questo metodo, per ogni oggetto si verifica quali portlet contiene ogni manager associato al contesto.

Quello che possiamo fare è cambiare l'ultimo list comprehension:


all_assignments[manager_name] = [type(manager_assignments[x]) for x in keys]

con:

 
fix_these = ['plone.app.portlets.portlets.navigation', 'rer.portlet.er_navigation.erportletnavigation']: for key in keys: if manager_assignments[key].__module__ in fix_these: if not manager_assignments[key].root.startswith('/it/'): manager_assignments[key].root = "/it%s" % manager_assignments[key].root print "fix navigation in %s" % obj.absolute_url() return all_assignments

In questo caso si verifica se la portlet è un navigatore e si va a sostituire il valore corrente della radice del navigatore con il percorso corretto.

Lo stesso approccio si può usare con tutte le portlet che presentano problemi di questo tipo (plone.portlet.collection, redturtle.portlet.collection, rer.portlet.advanced_static, ecc.).

 

Immagine in testata: http://www.flickr.com/photos/mag3737/5480814627/

Immagine per Facebook: http://www.flickr.com/photos/mig/15964697/

Filed under: , ,
comments powered by Disqus