Metodo th_sections

Partizionare i dati con delle bottoniere ed azioni predefinite

Nella normale gestione di una tabella possono nascere esigenze funzionali per cui l’utente abbia la necessità di effettuare selezioni con condizioni preimpostate in modo da rendere veloce partizionare i dati in base a determinati criteri. Per esempio la tabella cliente di Sandbox , contiene un toolbar superiore con dei pulsanti:

../../_images/th_sections_cliente_01.png

e sul lato destro della stessa toolbar companiono altri pulsanti

../../_images/th_sections_cliente_02.png

Il funzionamento dei pulsanti è abbastanza esplicito.

Nel primo caso è possibile selezionare i clienti in base a tre criteri:

  • tutti i clienti (senza alcuna restrizione)
  • solo i clienti che abbiano almeno una fattura
  • solo i clienti senza alcuna fattura registrata

Nel secondo caso è possibile visualizzare i clienti per tipologia:

  • tutti
  • i clienti definiti «importanti»
  • i clienti «normali»

Vediamo ora come si realizza tutto questo.

Prerequisiti

Come si può facilmente notare dalla prima immagine, è stata aggiunta una barra per ospitare i pulsanti nella nuova toolbar, per fare ciò consultare la sezione Metodo th_top definizione toolbar aggiuntive

Sections manuali e sections automatiche

Una volta creata la toolbar (superiore o inferiore) per ospitare i pulsanti per partizionare la tabella, vediamo ora come riepire la toolbar creata, iniziando con una section manuale

Riprendiamo il codice della view cliente:

def th_sections_acquisti(self):
    return [dict(code='tutti',caption='Tutti'),
            dict(code='con_acquisti',caption='Con Acquisti',
                    condition='$n_fatture>0'),
            dict(code='senza_acquisti',caption='Senza Acquisti',condition='$n_fatture=0')]
def th_top_toolbarsuperiore(self,top):
            top.slotToolbar('5,sections@acquisti,10,sections@volumeacquisti,*,sections@cliente_tipo_codice,5',
                    childname='superiore',_position='<bar',
                    gradient_from='#999',gradient_to='#666')

Tralasciando quanto già trattato nella sezione Metodo th_top definizione toolbar aggiuntive , concentriamoci sugli altri elementi che legano le due funzioni:

../../_images/th_sections_cliente_03.png
  1. tramite il nome si lega la funzione th_section_acquisti con uno dei pulsanti definiti nella toolbar.
  2. il pulsante prenderà dalla sections il nome (code) e l’etichetta visualizzata (caption)
  3. anche la condition ovvero la condizione che filtrerà i dati verrà presa dallaa section specificando una colonna fisica della tabella ed una condizione che deve essere soddisfatta, in questo caso «$n_fatture > 0» ovvero che il cliente abbia almeno una fattura.

Per il dettaglio della colonna vedere il model cliente del progetto Sandbox .

  1. definizione del contenuto dei bottoni: 5 pixel a sx, disegna una prima pulsantiera in base alla definizione della sections_acquisti, «*» indica uno spazio «elastico», disegna una seconda pulsantiera «automatica», vedi prossimo paragrafo, e infine lascia 5 px sul lato destro
  2. si tratta di una section «automatica» trattata nel prossimo paragrafo.

Sections automatiche

Oltre a poter definire delle sections nel modo appena descritto, che partizionano i dati con delle sezioni create ad hoc, esiste la possibilità di «selezionare» i dati in base al contenuto di una colonna della tabella.

Nel precedente esempio, non esiste una section cliente_tipo_codice in questo caso «magicamente», dato che non esiste una section specifica, ma che la section si riferisce ad una colonna della tabella, viene eseguita una select distinct che prendendo il codice e la descrizione della tabella cliente_tipo (in relazione con la tabella cliente) costruisce i pulsanti che consentono di poter filtrare i clienti in base al tipo:

../../_images/th_sections_cliente_02.png

Questo si ottiene in modo «automatico»; ovviamente dovrà essere analizzata con attenzione la colonna su cui fare questa operazione dato che i pulsanti vengono creati dal sistema.

Naturalmente esistono anche altri modi di creare dei «sezionatori» dei dati in base ai criteri limitati solo dalla fantasia. Vediamo un esempio di codice che crea una bottom bar con le lettere dell’alfabeto che selezionano i clienti in base alla lettera scelta:

@metadata(multivalue=True)
def th_sections_iniziali(self):
    result = [dict(code='tutti',caption='Tutti')]
    for c in 'ABCDEFGHILMNOPQRSTUVZ':
        result.append(dict(code=f'inizio_{c}',caption=c,
                        condition="$ragione_sociale ILIKE :inizio || '%%'",
                        condition_inizio=c))
    return result

def th_bottom_bottoniera(self,bottom):
    bar = bottom.slotToolbar('*,sections@iniziali,*')

con questo risultato

../../_images/th_bottom_cliente_01.png

la direttiva @medatata(multivalue=True) consente di poter fare in modo che i pulsanti non siano mutamente esclusivi, ma che se premuti con shift, la lettera selezionata andrà ad aggiungersi all’eventuale selezione già presente; per fare questo andrà inoltre importato il relativo decoratore dalla libreria:

from gnr.core.gnrdecorator import metadata

Il codice sorgente usato per gli esempi è scaricabile da questa pagina

Attachments:

Autore della sezione: Valter Vettorello