Bookmark and Share
You are here: Home Blog Giorgio Borelli Con tutti questi tubi rischio di non capirci un tubo

Con tutti questi tubi rischio di non capirci un tubo

Dolci momenti di configurazione: collective.transmogrifier un prodotto per creare sistemi di importazione ed esportazione di oggetti in Plone.

by Giorgio Borelli - 2009-04-14
Con tutti questi tubi rischio di non capirci un tubo

Kasimir Malevich, Suprematism (Supremus No. 58)

Carneade chi era costui?: transmogrifier il nome è strano e impronunciabile però qualcosa vorrà pur dire.

Ma partiamo con ordine, alla storia occorre un minimo di introduzione altrimenti avrei scritto un howto e non un post nel mio nuovo e fantastico blog.

Era una giornata di grigio sviluppo su un Plone2.5 in cui Generic Setup non voleva funzionare e non c'era modo di farmi ascoltare da portal_setup. Tra un caffé e l'altro (in Redomino è ottimo), trasalii al pensiero di un problema che avrei dovuto affrontare di lì a poco.

Il problema in oggetto è uno di quei problemi che si ripropongono a scadenza fissa ma la cui soluzione spesso viene affidata all'ispirazione del momento.

Il problema è semplice: devo dismettere un vecchio sito realizzato con Php e Mysql ed importare qualche tonnellata di contenuti in Plone; a quanti non è mai capitato?

Turbato mi accingo alla ricerca di una soluzione e, come prima cosa (la mia pigrizia è assoluta), mi rivolgo a un amico... mi hanno insegnato che gli amici si vedono, scappano o si cercano disperatamente nel momento del bisogno.

Cerco di spiegare a Maurizio il mio problema esistenziale e lui:

>> Maurizio: fermo li
>> Maurizio: li conosci i blueprint di transmogrify?
>> Maurizio: se  no, vatti a studiare quelli, prima di continuare :D
>> Giorgio:  lo sapevo che avevi qualcosa di utile per me!!!!! ;)
>> Giorgio:  il nome però sembra una parolaccia

Lì per lì ero entusiasta... però, quando Maurizio pontifica in quel modo, c'è sempre qualcosa sotto! Ovvero mi tocca nuovamente studiare una tonnellata di documentazione!

Bene, decido che se devo sporcarmi le mani è utile partire dalla base.

Cosa vogliono dire quelle brutte parole 'pronunciate' in chat dall'Uomo del monte?

Il wikizionario mi viene in aiuto:

transmogrify
alterare completamente la forma di qualcosa
blueprint
cianografia, riproduzione di disegni/progetti fatti su carta trasparente usando carte sensibili a base di sali di ferro

Bene, le parole promettono bene, vediamo se anche plone.org non mi delude.

Purtroppo su plone.org non trovo niente di speciale per me, solo il riferimento ad un intervento di Martijn Pieters alla plone conference del 2008 a Washington. Anche qui il titolo promette bene "Collective.transmogrifier: Plone migrations and more!". Non resisto passo al mio repository preferito e cerco direttamente tra i prodotti disponibili.

Collective transmogrifier; ci sono, passo dal README ai vari txt esplicativi (adoro queste amene letture serali) passo una buona mezz'ora a leggere e scopro cose interessanti ma non sono soddisfatto. A parte una crescente passione per l'idraulica, non ho ottenuto molto, mi occorre qualcosa da provare e pasticciare.

Ho trovato tanto codice interessante ma pochi how-to. Torno su google, ricerco ancora un po' e finalmente trovo il matto che fa per me; un nuovo pezzo di codice con un "esempio concreto da seguire". Un matto fulminato vuole importare wikipedia dentro plone -> collective.blueprint.wikipedia

Non ho capito bene le intenzioni di garbas ma trovo ancora del buon codice e questa volta lo scopo è immediatamente comprensibile.

Ok, installo collective.transmogrifier, plone.app.transmogrifier (in verità ci litigo un po' ma fa parte del gioco ormai) creo un prodottino ad-hoc e tento di emulare quello che ho deciso essere il mio esempio da seguire.

Fantastico! Un'avvitatina lì una, cacciavitata là, uno studio del contenuto del modulo sections di transmogrifier, una spinta alla tartaruga ed io, piccolo "Mario bros", riesco a crearmi una sorgente di dati che, una volta manipolati (per ora un po' a casaccio), vengono importati all'interno di un'istanza Plone.

Una volta capite le regole il gioco è semplice!

L'importazione dei contenuti, così come la loro esportazione, consiste in una serie di operazioni semplici che, una volta concatenate correttamente, "trasformano" la natura dei dati originali affinché essi possano essere inseriti in un altro contesto mantenendo inalterato il significato.

Per quanto riguarda il mio caso specifico:

  • i miei contenuti sono record all'interno di un database Mysql e la loro consistenza è data dalle informazioni contenute in varie tabelle relazionate tra loro
  • per ognuno di questi contenuti posso trovare una corrispondenza con uno specifico content type all'interno di Plone
  • la manipolazione dei dati consiste nel trasformare i vari attributi dei contenuti originali in uno schema archetype, nonché verificarne la consistenza all'interno del nuovo contesto
  • l'azione finale consiste nella creazione dei dati all'interno di Plone e l'impostazione di tutte le proprietà necessarie per ogni oggetto.

Con transmogrifier posso ricreare questa concatenazione di azioni all'interno di un semplice file di configurazione simile al seguente:

 1. [transmogrifier]
 2. pipeline =
 3.    sqlsource
 4.    transform-bodytext
 5.    constructor
 6.    schemaupdater
 7.    workflowupdater    
 8.
 9. [sqlsource]
10. blueprint=transmogrify.sqlalchemy
11. dsn=mysql://utente:passowrd@dbms.host/cms_db
12. query = SELECT 'Document' AS _type, 'publish' as _transitions, concat('folder/', id) AS _path, title, text FROM content
13.
14. [transform-bodytext]
15. blueprint = plone.app.transmogrifier.portaltransforms
16. target = text/x-html-safe
17. from = text/html
18. keys = text
19.
20. [constructor]
21. blueprint = collective.transmogrifier.sections.constructor
22.
23. [schemaupdater]
24. blueprint = plone.app.transmogrifier.atschemaupdater
25.
26. [workflowupdater]
27. blueprint = plone.app.transmogrifier.workflowupdater

Righe 1-7: definisco la sequenza di operazioni da eseguire. Ognuna di esse fa riferimento ad una sezione particolare il cui nome è racchiuso tra parentesi quadre. Ogni sezione contiene per lo meno il parametro blueprint che si riferisce al "modulo" da utilizzare in quella sezione.

Righe 9-12: con due banali parametri definisco,grazie al prodotto transmogrify.sqlalchemy, una sorgente dati per l'importazione

Righe 14-18: trasformo il testo dell'oggetto da importare in x-html-safe, l'output classico del corpo del testo di un documento Plone.

Righe: 20-21: creo gli oggetti nel portale secondo l'attributo _type e la loro posizione presa dall'attributo _path

Righe 23-24: modifico lo schema dei miei content type appena creati inserendo text e title

Righe 26-27: come chicca finale, grazie all'attributo _transitions, eseguo una transizione del workfolw sugli oggetti appena modificati in modo tale da renderli pubblicati

Bhe, un solo file di configurazione, nemmeno una riga di codice, e la gioia infinita di non dover più scrivere context.invokeFactory(type_name='...', id='...')

Calvin e Hobbes e il loro Transmogrifier

Posted by Silvio at 2009-09-21 10:30
Probabilmente gli sviluppatori di Transmogrifier hanno letto qualche striscia di Calvin e Hobbes:
http://www.s-anand.net/calvinandhobbes.html#19870323
...
«Keep in mind that transmogrification is a new technology»
http://www.s-anand.net/calvinandhobbes.html#19870328