Doc

Ci si riferisce con doc ad un layout più interno rispetto a page , che contiene la stampa vera e propria che andremo a definire nella risorsa.

Il doc è in un elemento layout ottenuto come risultato del metodo mainLayout.

Se questo metodo non viene ridefinito, questo layout viene poi suddiviso internamente in tre fasce.

  • Una fascia superiore detta header

  • Una fascia centrale destinata a contenere la griglia delle righe

  • Una fascia inferiore detta footer

Sia l’header che il footer solitamente vengono usati per contenere i dati del record primario, in una stampa di tipo riga/fattura.

Nota

L’intera struttura così composta, viene ripetuta su ogni pagina, nel caso la stampa avesse un numero tale di righe da richiedere uno sviluppo su più pagine.

mainLayoutParameters

Se lo sviluppatore desidera variare i parametri del layout generale della stampa, in tal caso la soluzione migliore è implementare il metodo mainLayoutParameters, il quale dovrà restituire un dizionario con i parametri desiderati.

def mainLayoutParameters(self):
      style = """font-family:"Arial Narrow";
                  text-align:left;
                  line-height:4mm;
                  font-size:9pt;
                  """
      return dict(name='pageLayout',
                          bottom=0,
                          um='mm',top=0,
                          left=0,right=0,
                          border_width=0,
                          lbl_height=4,lbl_class='caption',
                          style=style)

doc_header ed il metodo docHeader

Indichiamo con il termine doc_header o testata del documento quella parte soprastante la griglia, che di norma ospita i dati del record primario nel caso di una stampa master/detail, oppure può mostrare il titolo della stampa o altre informazioni.

Nell’esempio dell’estratto conto, mostrerà i dati del cliente e il periodo di riferimento, nel caso di una stampa ordine o fattura, troveremo la data e il numero di protocollo del documento.

Tutta la definizione della testata di documento avviene nel metodo di hook: docHeader, il quale riceve la cella contenitore, all’interno della quale lo sviluppatore può definire i layout necessari per realizzare la grafica desiderata.

Vediamo come viene implementato il metodo docHeader nella stampa mia_fattura del package fatt definito nel progetto Sandbox.

def docHeader(self, header):
    layout = header.layout(name='doc_header', margin='5mm', border_width=0)

    row = layout.row()
    left_cell = row.cell(width=80)
    center_cell = row.cell()
    right_cell = row.cell(width=80)

    #DATI FATTURA
    fatt_layout = left_cell.layout('dati_fattura',
                   lbl_class='cell_label',
                   border_width=0)

    r = fatt_layout.row(height=8)
    r.cell(self.field('data'), lbl='Data')
    r = fatt_layout.row(height=8)
    r.cell(self.field('protocollo'), lbl='N.Fattura')

    #DATI CLIENTE
    cli_layout = right_cell.layout('dati_cliente', border_width=0)

    cli_layout.row(height=5).cell('Spett.')
    cli_layout.row(height=5).cell(self.field('@cliente_id.ragione_sociale'))
    cli_layout.row(height=5).cell(self.field('@cliente_id.indirizzo'))

    comune = self.field('@cliente_id.@comune_id.denominazione')
    provincia = self.field('@cliente_id.provincia')
    cli_layout.row(height=5).cell('%s (%s)' % (comune, provincia))

Notiamo come facendo uso degli elementi layout , row e cell si sia definita una semplice testata di documento con i dati del cliente e della fattura.

Suggerimento

Si noti che nel record saranno sempre disponibili solo le colonne «vere» del database, ad esclusione quindi di quelle virtuali che non siano state staticizzate. Per utilizzare quindi le colonne virtuali nell’header del documento, ad esempio, sarà quindi necessario specificare nel Main della risorsa di stampa il parametro virtual_columns con le colonne da caricare per la stampa. Fa eccezione la struttura della griglia , dove invece le colonne virtuali saranno sempre automaticamente disponibili.

doc_header_height e calcDocHeaderHeight

Abbiamo detto che il layout generale della stampa (mainLayout) ha una superiore chiamata doc_header. L’altezza del doc_header deve essere specificata affinché l’header venga visualizzato, o tramite l’attributo di classe doc_header_height, o tramite un apposita procedura di calcolo.

Nel caso in cui l’altezza dovesse essere calcolata in funzione dei dati, si può implementare nella risorsa il metodo di hook calcDocHeaderHeight il quale deve ritornare un valore numerico che rappresenterà l’altezza in millimetri.

Ecco un esempio molto semplice di come si può far dipendere l’altezza dai dati.

def calcDocHeaderHeight(self):
    if self.record['mostra_indirizzo']:
        return self.doc_header_height + 80