Uso dei documenti ODT con relatorio

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

Relatorio - Modelli di documento ODT

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.

Struttura e origine dei dati

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.

Uso di relatorio nei modelli OpenOffice

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]

Uso della direttiva genshi if

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

Uso della direttiva genshi for

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

Uso delle direttiva genshi choose, when e otherwise

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

Uso delle direttiva genshi with

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.