Trasformare i contenuti Plone usando il servizio portal_transform
medio
Problema
Ho caricato delle immagini TIFF in Plone, ma i miei utenti normalmente vogliono visualizzarne degli anteprima nel loro browser, e sebbene il sistema riesca a fare la scalatura di immagini TIFF (grazie a PIL - http://www.pythonware.com/products/pil/, il suo motore dietro le quinte), queste non vengono visualizzate da buona parte dei browser.
Se avete un problema simile al seguente, o qualcosa che concettualmente gli assomiglia, probabilmente, prima di partire all'arrembaggio e fare voi "tutto" quel che serve, fareste bene a dare uno sguardo al servizio Plone in oggetto: portal_transforms, appunto.
Capire portal_transforms
Di fatto, il servizio portal_transforms contiene una serie di script, che possono essere invocati da codice in modo diretto o trasparente, per operare le trasformazioni più disparate sui nostri contenuti.
Tra le trasformazioni di base troviamo quelle che operano sui testi, tra cui "safe_html" (che elimina dal testo quelli che riconosce come tag HTML potenzialmente "pericolosi", chiaramente decisi dal manager del portale) e "html_to_text" (che trasforma il testo in formato HTML in un suo equivalente solo testuale, eliminando adeguatamente i tag HTML). Ma ci sono anche una serie di altre trasformazioni possibili, come ad esempio, tra quelle inerenti le immagini, "image_to_jpeg". Chissà che non sia proprio quella che fa al caso nostro!
Chiaramente, non è affatto complesso costruire ulteriori plugin per estendere il numero di trasformazioni disponibili a sistema. Ma questo esula dagli scopi di questo rapido howto.
Essendo uno strumento che agisce dietro le quinte, buona parte delle sue funzioni sono in realtà trasparenti per l'utente finale, e a volte anche per lo sviluppatore Plone meno sprovveduto, che potrebbe non avergli mai dedicato il giusto spazio nella sua attività quotidiana.
Tanto per capirci, portal_transforms è completamente asservito ad Archetypes, infatti, considerando un campo testuale (un TextField), esso dispone di parametri sia per impostare i content_types permessi (ad es. "text/structured" se vogliamo caricare contenuti nel formato reStructuredText - , o "text/plain" per caricare del testo semplice), come pure per indicare il content_type di uscita, ad es. "text/html". Nel mezzo sarà Archetypes a richiedere in fase di presentazione la trasformazione in base al content_type corrente e a quello desiderato in uscita, che chiaramente devono averne una disponibile nel portal_transforms.
Ma possiamo anche pensare di usare portal_transforms nel nostro codice python, ad es. come vediamo nell'esempio seguente.
Un breve esempio
Facciamo conto di voler rapidamente costruire uno script Python direttamente nella cartella Custom di portal_skins per ottenere sempre e comunque l'immagine che noi sappiamo essere TIFF in versione JPEG.
Ecco un esempio di codice che potrebbe fare al caso nostro:
from Products.CMFCore.utils import getToolByName
portal_transforms = getToolByName(context, 'portal_transforms')
image = context.getImage()
file_data = portal_transforms.convert('image_to_jpeg', str(image))
filename = context.getFilename() + '.jpg'
context.REQUEST.RESPONSE.setHeader("Content-Type", "image/jpeg")
context.REQUEST.RESPONSE.setHeader("Content-Disposition",
"filename=%s;disposition=inline" % filename)
return file_data
andate in portal_skins/custom, create un oggetto "Script (Python)", chiamatelo come volete, e incollateci dentro quanto sopra.
Cosa fa lo script?
Diamo per scontato di applicarlo a un oggetto di tipo immagine, con immagine presente, e diamo per scontato che il sistema abbia il plugin a basso livello disponibile: c'è solo il minimo indispensabile.
Di fatto, dopo aver ottenuto il portal_transforms da contesto corrente e l'immagine da trasformare, si limita a richiamare il metodo "convert" di portal_transforms, indicando la conversione che ci interessa, e passando il contenuto binario dell'immagine.
Quindi imposta la response per restituire un file di tipo jpeg, con disposition "inline", e infine restituisce il file convertito.
Ulteriori Informazioni
..Le potrete reperire leggendo la documentazione presente nel pacchetto sorgente PortalTransforms,e anche leggendo il tutorial in lingua inglese sul sito plone.org (http://plone.org/documentation/tutorial/portal-transforms).
Re: Errore
potresti descrivere quando e come si verifica l'errore?
Tipo numero di linea, ecc.
davide
dettagli
caricando un immagine tiff e applicando lo script menzionata con Plone 3.2.1 mi da il seguente errore:
Request URL http://prova.it:8091/prova3/prove/imagine/tifftojpeg.py
Exception Type IOError
Exception Value cannot identify image file
Traceback (innermost last):
Module ZPublisher.Publish, line 119, in publish
Module ZPublisher.mapply, line 88, in mapply
Module ZPublisher.Publish, line 42, in call_object
Module Shared.DC.Scripts.Bindings, line 313, in __call__
Module Shared.DC.Scripts.Bindings, line 350, in _bindAndExec
Module Products.PythonScripts.PythonScript, line 327, in _exec
Module None, line 5, in tifftojpeg
<PythonScript at /prova3/tifftojpeg.py used for /prova3/prove/imagine>
Line 5
Module Products.PortalTransforms.TransformEngine, line 219, in convert
Module Products.PortalTransforms.Transform, line 192, in convert
Module Products.PortalTransforms.libtransforms.piltransform, line 20, in convert
Module PIL.Image, line 1916, in open
IOError: cannot identify image file
dettagli
Con che compressione è stata inclusa?

Errore