Blog

Come definire le queryBySample

Come definire le queryBySample per impostare criteri di ricerca predefiniti

In questo tutorial proseguiremo con il miglioramento dell’applicativo che abbiamo generato automaticamente nella Genropill 4: “Dal database alla web app in meno di 2 minuti” e che abbiamo cominciato a modificare nel Tutorial: “Definire classi view e form diverse in base alle necessità”.

Nel caso precedente avevamo creato classi View e Form differenti in base a differenti scenari d’uso. Tra le personalizzazioni effettuate avevamo visto velocemente l’uso del metodo th_queryBySample, per definire nella pagina uno strumento di ricerca più immediato e semplice per l’utente finale.

Infatti rispetto allo strumento query di default, che permette all’ utente di comporre ogni aspetto dell’interrogazione, qui abbiamo invece dei campi di ricerca fissi, scelti fra quelli che sarà più logico aspettarsi nell’ambito della specifica table.

Non ci siamo però soffermati a vedere nel dettaglio come definire le queryBySample, perciò vedremo in questo articolo ulteriori dettagli su questa funzionalità. In particolare il video presenterà alcuni esempi di utilizzo di queryBySample e la loro composizione.

Clicca su CC per attivare i sottotitoli

Innanzitutto una piccola premessa. Il metodo th_queryBySample restituisce un dizionario Python costituito da 3 elementi:

  • un field, che è a sua volta un dizionario che ci permette di specificare le colonne (ed eventualmente la table) su cui effettuare la ricerca, i widget da utilizzare, la larghezza di ogni campo e la relativa etichetta;
  • l’attributo cols, che serve a indicare su quante colonne distribuire la nostra queryBySample;
  • l’attributo isDefault, uguale a True o a False, che serve per indicare se la queryBySample sarà lo strumento di ricerca di default oppure no (l’utente potrà comunque cambiare il criterio di ricerca in qualsiasi momento).

Definendo questo dizionario si va quindi a specificare quali campi inserire e come posizionarli all’interno di in un’apposita form che ha gli stessi parametri di un formbuilder: di conseguenza cols va a indicare il numero di celle che compongono una riga di form (cols=2 per due celle, cols=3 per 3 celle e così via).

Per un approfondimento in merito alla queryBySample rimandiamo alla documentazione relativa, mentre in questa sede procediamo con la realizzazione di due esempi pratici.

Nel primo caso sostituiamo la semplice casella di testo “Artist”, che ci richiede di digitare “alla cieca” almeno parte dell’elemento per la sua selezione, con una dbselect in grado di fornirci un’anteprima dei valori disponibili. L’anteprima viene visualizzata perché la dbselect è uno strumento che permette di effettuare ricerche su campi specifici, nel nostro caso l’id dell’Artista, restituendoci però come suggerimento il nome dell’artista (che è il caption field della tabella in oggetto). Tramite questo meccanismo la ricerca viene condotta su record specifici, azzerando le possibilità di errore e risultati “vaghi”.

Facciamo lo stesso anche su “Genre”, ma in questo caso, trattandosi di pochi valori, scegliamo di mostrare direttamente tutti i valori disponibili anche senza alcuna digitazione: con l’attributo “hasDownArrow” assegniamo alla dbselect la linguetta laterale a triangolo, trasformandola in un classico menu a tendina che ci presenta tutti i generi disponibili per la scelta.

Ecco le poche righe di codice responsabili di questo risultato:

def th_queryBySample(self):
    return dict(fields=[dict(field='@albumid.artistid', 
                            lbl='Artist', width='20em',
                            tag='dbselect',
                            table='mu.artists'),
                            dict(field='genreid', lbl='Genre', 
                            width='20em',
                            tag='dbselect',
                            table='mu.genres',
                            hasDownArrow=True)],
                            cols=2, isDefault=True)

Questa prima opzione ci permette però di scegliere un valore specifico per quanto riguarda il genere musicale, ma non ci permette di effettuare selezioni multiple (es: tutte le canzoni del genere “pop”, “rock”, “jazz”). Nel secondo scenario, quindi, sostituiamo la dbselect con un elenco di checkbox:

def th_queryBySample(self):
        return dict(fields=[dict(field='@albumid.artistid', 
                            lbl='Artist', width='20em',
                            tag='dbselect',
                            table='mu.artists'),
                            dict(field='genreid', lbl='Genre', 
                            width='20em',
                            tag='checkboxtext',
                            table='mu.genres',
                            popup=False,
                            cols=10)],
                            cols=2, isDefault=True)

La scelta del widget (i dbselect e checkboxtext visti nell’esempio, ma anche datetextbox, radiobuttontext, numbertextbox) è puramente arbitraria e solo esemplificativa: come abbiamo visto, modificando pochissime righe di codice in Genropy è possibile ottenere i risultati più svariati, permettendoci di offrire all’utilizzatore finale dell’applicativo un vasto range di funzionalità ed eventualmente modificarle su richiesta in un batter d’occhio.

Vuoi approfondire in autonomia? Scarica il progetto e testalo in locale sulla tua installazione Genropy o consulta la documentazione sui tablehandler:

Oppure clonalo da git:

git clone git@bitbucket.org:dgpaci/musicproject.git

Ti stai avvicinando al mondo Genropy e desideri saperne di più? Seguici sui social per tenerti in contatto con le ultime novità che Genropy ha da offrire:

Genropy Seguici su Facebook
Pagina Facebook

 

Genropy Seguici Gruppo Facebook
Gruppo Facebook

 

Genropy Gruppo Telegram
Gruppo Telegram