Le librerie Relatorio consentono la generazione di file ODT (OpenDocument di tipo testo e altri formati) direttamente da oggetti python.
La sintassi utilizzata nei modelli di documento è quella delle librerie genshi
Per generare un report in formato ODT con le librerie Relatorio è necessario predisporre un modello con le istruzioni per il trattamento e la formattazione dei dati ricavati dal database.
La documentazione è assai scarna ma la semplicità del sistema lo giustifica. Una volta compresa la specifica sintassi è infatti banale l’uso delle direttive [1] per introdurre nel documento le espressioni che saranno sostituite dinamicamente dai dati. Nei pochi esempi originali [2] ne vengono utilizzate solo alcune: if, for e choose.
I dati vengono estratti dal database tramite un apposito proxy che li passa al modello. La struttura è quella dei retrostanti oggetti e quindi, dentro le singole direttive del modello, sono disponibili i metodi predefiniti python.
Nel nostro caso il proxy [3] ricava e passa al modello una entità o. Questa è un oggetto python e precisamente una determinata istanza di una classe SQLAlchemy.
Rimandando ai manuali di OO per una indagine approfondita sull’uso degli hyperlink nei documento di testo, qui di seguito vengono spiegati i singoli passaggi per inserire in un modello alcuni collegamenti a relatorio. [4]
Esempio: inserimento in un documento ODT di un hyperlink a relatorio con la direttiva genshi if per stampare/eseguire condizionatamente qualcosa.
![]() |
|
Per modificare un hyperlink, posizionarsi sul testo dell’hyperlink e usare il menù Modifica > Hyperlink
Cancellare l’hyperlink assicurandosi di non rimanere in modalità edit (Ctrl-Shift-Space)
Nell’esempio che segue vogliamo inserire del testo in un campo solo se vale una certa condizione:
if test="o.cliente.partitaiva"
Partita I.V.A. Cliente
/if
if test="not o.cliente.partitaiva"
Codice Fiscale Cliente
/if
Nell’esempio che segue vogliamo ciclare sugli elementi schedemovimentazioni, dettagli dell’entità ricevuta dal proxy e per ciascuno stampare alcuni campi nel modello. Nel modello ciascuna riga dell’esempio sarà inserita in una riga di una tabella:
for each="scheda in o.schedemovimentazioni"
${scheda.materiale.descrizione} ${scheda.quantita} ${scheda.totaleValuta}
/for
Nell’esempio che segue vogliamo stampare dei dati se ricorrono certe condizioni altrimenti stamparne altri:
choose test=""
when test="o.cliente"
${o.cliente.partitaiva} .......
/when
otherwise test=""
${o.fascicolo.clientefornitore.partitaiva} .......
/otherwise
/choose
Nell’esempio che segue registriamo in una variabile il contenuto di un oggetto python per poter utilizzare dinamicamente i valori di alcuni attributi`.
with vars="ci=o.castellettoIva"
Imponibile 4% Imponibile 10% Imponibile 20%
${ci[4][0]} ${ci[10][0]} ${ci[20][0]}
/with
| [1] | http://genshi.edgewall.org/wiki/Documentation/xml-templates.html#directives, http://genshi.edgewall.org/wiki/Documentation/text-templates.html#directives |
| [2] | http://relatorio.openhex.org/browser/examples/invoice.odt |
| [3] | http://tracs.artiemestieri.tn.it/gam/browser/gam/apps/pylgam/pylgam/controllers/stampe.py |
| [4] | Gli esempi sono tratti da modello fattura generica In OO anche l’operazione più semplice può diventare di difficile uso stante la complessità e la ridondanza di opportunità e di possibilità collegate ad ogni azione. Il sistema di gestione degli hyperlink ne è un esempio. |