Introduzione
Ogni volta che qualcuno assegna la priorità a un lead, sceglie un metodo di pagamento o marca un prodotto come attivo o archiviato, molto spesso sta interagendo con un campo Selection in Odoo. Questo tipo di campo è tra i più pratici e frequenti nella piattaforma: padroneggiarlo aiuta a progettare modelli dati più stabili e facili da gestire.
A differenza di un campo testuale libero, che permette qualunque stringa, il Selection limita le scelte a un elenco predefinito. Questo vincolo è voluto: uniforma i valori, facilita filtri e report e riduce gli errori di battitura o le varianti che col tempo possono compromettere statistiche e dashboard.
Questa guida spiega cosa memorizza il campo, come viene mostrato nell'interfaccia e come crearne uno con Odoo Studio, tramite codice Python o usando l'API XML-RPC. Troverai inoltre esempi pratici presi da flussi aziendali reali e un elenco di errori ricorrenti da evitare.
Cos'è il campo Selection in Odoo
Nell'ORM di Odoo, un campo Selection memorizza una stringa scelta tra opzioni fissate. Ogni opzione è una coppia chiave-label: la chiave è il valore persistente nel database, la label è il testo leggibile mostrato all'utente.
Per spiegare il concetto, considera un campo che definisce la priorità di una segnalazione con diverse fasce:
priority = fields.Selection([
('0', 'Normal'),
('1', 'Low'),
('2', 'High'),
('3', 'Very High'),
], string='Priority', default='0')
Nel frammento sopra, '0', '1', '2' e '3' sono le chiavi che vanno in database. Le etichette Normal, Low, High e Very High sono invece ciò che vede l'utente. Separare chiave e label permette di cambiare il testo visualizzato in seguito senza compromettere i dati esistenti.
Nell'interfaccia il Selection si presenta come un menu a discesa nei form e come la label leggibile nelle viste lista. Usando il widget badge ogni opzione diventa un tag colorato, utile per rendere subito evidente lo stato negli elenchi densi.
In Odoo Studio questo tipo di campo è chiamato Selection. I campi creati da Studio ricevono un prefisso x_studio_; se li definiamo in codice o via API, decidiamo noi il nome tecnico.
Come funziona il campo
Nel modello dati di Odoo il Selection è memorizzato in PostgreSQL come una colonna VARCHAR. Nel database si salva sempre la chiave, mai la label: è un dettaglio cruciale quando scrivi domini o azioni server, perché devi confrontare la chiave e non il testo leggibile.
Per esempio, per cercare tutti i lead ad alta priorità il dominio corretto è [('priority', '=', '2')], non [('priority', '=', 'High')].
Attributi chiave del campo
Ecco le proprietà più rilevanti di un campo Selection in Odoo:
- selection: La lista di tuple
(key, label)che definisce le opzioni disponibili. Può anche essere il nome di un metodo (stringa) che restituisce dinamicamente la lista. - default: La chiave da usare quando non è stato impostato alcun valore. Se assente, il campo rimane vuoto inizialmente.
- required: Obbliga l'utente a scegliere un'opzione prima di salvare. Abbinato a un default è lo schema tipico per i campi di stato.
- selection_add: Permette, in eredità di modulo, di aggiungere opzioni a un Selection esistente senza ridefinire l'intera lista. È l'approccio corretto quando si estende un campo nativo.
- ondelete: Utilizzato con
selection_addper stabilire cosa succede ai record che usano un'opzione quando il modulo che l'ha aggiunta viene disinstallato.
Liste di opzioni statiche vs dinamiche
Per impostazione predefinita la lista di opzioni è dichiarata staticamente nella definizione del campo. In alternativa si può passare il nome di un metodo nella proprietà selection; Odoo chiamerà quel metodo a runtime e costruirà la lista in base al contesto, mostrando opzioni diverse per utente, azienda o situazioni specifiche.
contract_type = fields.Selection(
selection='_get_contract_types',
string='Contract Type'
)
def _get_contract_types(self):
if self.env.user.has_group('hr.group_hr_manager'):
return [('permanent', 'Permanent'), ('fixed', 'Fixed Term'), ('interim', 'Interim')]
return [('permanent', 'Permanent'), ('fixed', 'Fixed Term')]
Come appare nelle viste
In un form il Selection si mostra come dropdown standard. Puoi aggiungere widget="badge" per trasformarlo in etichette colorate nelle viste lista e kanban, ideale per gli stati. widget="radio" lo visualizza come radio button inline, utile quando le scelte sono poche e vuoi mostrarle tutte contemporaneamente.
Interazione con l'ORM di Odoo
Leggere e scrivere campi Selection tramite l'ORM è semplice: assegni direttamente la chiave e Odoo si occupa della traduzione in label per l'interfaccia. Se leggi un record via XML-RPC con fields_get, l'attributo selection restituisce la lista completa di [key, label] che puoi usare per ricostruire l'interfaccia o logiche esterne.
Casi d'uso aziendali
Il campo Selection è presente in quasi tutti i moduli standard di Odoo. Di seguito cinque esempi concreti tratti da processi aziendali comuni.
CRM: Priorità del lead e tipo di fase in pipeline
Il campo priorità nei lead del CRM è un Selection con quattro livelli: Normal, Low, High e Very High. Le squadre commerciali lo usano per concentrarsi sulle opportunità più importanti; influisce sul colore in Kanban e può attivare azioni automatiche quando un lead viene scalato. Sistemare la distribuzione delle priorità è spesso uno dei primi interventi di qualità dati dopo il go-live.
Vendite: Condizioni di pagamento e politica di fatturazione
Il campo invoice_policy sui prodotti è un Selection che decide se fatturare sulla base della quantità ordinata o di quella consegnata, condizionando l'intero flusso di fatturazione. Allo stesso modo il metodo di fatturazione nei contratti di abbonamento usa un Selection per distinguere tra cicli prepagati e postpagati. Sono esempi di campi Selection che hanno impatti significativi sui processi finanziari.
Magazzino: Stati qualità di prodotto e lotto
Nella produzione e nel controllo qualità i Selection tracciano lo stato di lotti, numeri di serie e ordini di riparazione. Lo stato di un ordine di riparazione passa per fasi come draft, confirmed, under repair, ready e done; ogni transizione può generare email automatiche, movimenti di magazzino o scritture contabili. Il Selection funge da nodo di controllo attorno al quale costruire il workflow.
Contabilità: Metodo di pagamento e tipo di giornale
Il campo tipo di giornale in Contabilità è un Selection che distingue tra giornali vendite, acquisti, cassa e banca. Odoo usa questo valore per applicare la logica di registrazione corretta, limitare le operazioni disponibili e stabilire quali conti sono utilizzabili. È un esempio di Selection che regola regole di business, non solo un'etichetta.
Risorse Umane: Tipo di impiego e stato del contratto
Nei processi HR i Selection tengono traccia di tipo di contratto, stato contrattuale e stato delle richieste di permesso. Lo stato di un contratto può passare da new a open a expired o cancelled. Le automazioni possono avvisare il responsabile HR prima della scadenza, attivare checklist di onboarding o aggiornare regole paghe in base al tipo di impiego: il Selection è il valore che guida queste operazioni.
Creare o personalizzare un campo Selection
Esistono tre vie principali per aggiungere un campo Selection a un model Odoo, a seconda del contesto e del bisogno di versione e automazione.
Usare Odoo Studio (No Code)
Odoo Studio è lo strumento low-code integrato per aggiungere campi senza scrivere Python. Per creare un Selection con Studio:
- Apri Odoo Studio dal menu principale.
- Vai al form dove vuoi inserire il campo.
- Trascina un campo Selection dalla barra laterale nel form.
- Inserisci le opzioni nel pannello proprietà, definendo una label per ogni scelta.
- Eventualmente imposta un valore di default e rendi il campo obbligatorio.
- Salva e chiudi Studio.
Studio salva ogni opzione con una chiave generata automaticamente e la label che hai indicato. Il campo riceve il prefisso x_studio_ ed è aggiunto automaticamente alla vista. È il modo più rapido per inserire un Selection durante un'analisi con il cliente.
Usare Python in un modulo personalizzato
Per gli sviluppatori i campi Selection si definiscono nei file Python del modulo. Questo approccio è consigliato quando le personalizzazioni devono essere sotto controllo versione e distribuite su più ambienti:
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
x_delivery_slot = fields.Selection([
('morning', 'Morning (8h - 12h)'),
('afternoon', 'Afternoon (13h - 17h)'),
('evening', 'Evening (18h - 20h)'),
], string='Delivery Slot', default='morning')
Dopo la definizione del campo va aggiunto l'elemento corrispondente nella vista XML perché compaia nell'interfaccia. Odoo crea la colonna in database al momento dell'installazione o dell'aggiornamento del modulo.
Quando estendi un campo nativo con nuove opzioni, usa selection_add invece di ridefinire tutto il campo:
class SaleOrder(models.Model):
_inherit = 'sale.order'
state = fields.Selection(
selection_add=[('custom_approval', 'Pending Approval')],
ondelete={'custom_approval': 'set default'}
)
Usare l'API XML-RPC
Se gestisci personalizzazioni in modo programmatico — per esempio in pipeline di deployment o script remoti — puoi creare campi Selection anche via XML-RPC:
field_id = models.execute_kw(
ODOO_DB, uid, ODOO_API_KEY,
'ir.model.fields', 'create',
[{
'name': 'x_contract_category',
'field_description': 'Contract Category',
'model_id': model_id,
'ttype': 'selection',
'selection': "[('standard', 'Standard'), ('premium', 'Premium'), ('custom', 'Custom')]",
'state': 'manual',
}]
)
Quando crei un Selection via API, il valore selection va fornito come stringa che rappresenta una lista Python. Impostare state: 'manual' indica che il campo è stato creato manualmente — scelta appropriata per campi generati da Studio o dall'API. Questo è il metodo che noi di Dasolo usiamo per creare campi a distanza nei progetti automatizzati dei clienti.
Buone pratiche
1. Usa chiavi significative e stabili
La chiave è ciò che resta nel database e viene usata in domini, azioni automatiche e logica server-side. Scegli chiavi descrittive che non dovrai cambiare: stringhe corte e in minuscolo sono pratiche ('draft', 'confirmed', 'cancelled'). Evita chiavi numeriche a meno che l'ordine non sia realmente importante, perché rendono il codice meno leggibile col passare del tempo.
2. Mantieni la lista corta e completa
Un Selection con più di otto-dieci opzioni spesso significa che il campo sta facendo troppo. Se l'elenco cresce, valuta un Many2one verso un modello di configurazione: così gli utenti possono amministrare le opzioni dall'interfaccia senza coinvolgere uno sviluppatore.
3. Imposta sempre un default per i campi obbligatori
Se un Selection è required, definisci anche un valore di default sensato. Eviti così errori di validazione quando i record vengono creati via import, API o script senza intervento umano. Il default dovrebbe rappresentare lo stato più comune o il meno vincolante nel processo.
4. Usa selection_add per estendere campi nativi
Per aggiungere opzioni a un campo Odoo esistente in un modulo personalizzato, preferisci selection_add alla ridefinizione completa. È più sicuro e compatibile con altri moduli che possono estendere lo stesso campo. Abbina sempre selection_add a ondelete per gestire la disinstallazione del modulo.
5. Visualizza con il badge per aumentare la leggibilità nelle liste
Nelle viste lista e kanban il Selection di default mostra solo testo. Aggiungendo widget="badge" nel XML ogni valore diventa un'etichetta colorata, molto più veloce da scansionare. È particolarmente utile per campi di stato che richiedono attenzione immediata.
Trappole comuni
Cambiare una chiave rompe i dati esistenti
La label dell'opzione si può modificare in sicurezza perché nel DB resta la chiave. La chiave però non va cambiata dopo che esistono record con quel valore: se la rinomini, i record esistenti mostreranno un valore vuoto o invalido e i domini/automazioni che cercavano la vecchia chiave smetteranno di funzionare. Se devi proprio cambiare una chiave, esegui prima una migrazione sui dati per aggiornare tutti i record.
Rimuovere un'opzione lascia record orfani
Se elimini un'opzione mentre dei record la stanno ancora usando, quei record mostreranno un valore mancante o rotto. Prima di rimuovere un'opzione, cerca i record che la usano e aggiornali a un valore valido o archiviali. È un problema tipico durante i progetti di pulizia dati quando la lista iniziale non era stata sufficientemente analizzata.
Usare la label invece della chiave nei filtri
Errore molto comune, soprattutto per utenti non tecnici che impostano regole di automazione: filtrare per la label visibile invece che per la chiave memorizzata. Questo genera domini che non restituiscono nulla senza segnalare un errore, rendendo il problema difficile da diagnosticare. Controlla sempre la definizione del campo per sapere quale chiave corrisponde a quale label prima di scrivere i filtri.
Usare un Selection dove servirebbe un Many2one
Se le opzioni cambiano spesso, se gli utenti devono poterle gestire autonomamente o se le opzioni hanno attributi aggiuntivi (colore, sequenza, conto collegato), allora un Many2one verso un modello di configurazione è più adatto. I Selection sono ottimi per liste stabili gestite dallo sviluppatore; per scenari dinamici, il Many2one è più sostenibile nel tempo.
Non gestire il valore vuoto nella logica server-side
Un Selection non obbligatorio può assumere valore False quando nessuna opzione è stata scelta. Se il tuo codice Python o un'azione automatica confronta il campo con una stringa senza prima verificare False, potresti ottenere comportamenti inattesi o errori. Gestisci sempre esplicitamente il caso vuoto in computati e azioni server che dipendono da quel campo.
Conclusione
Il campo Selection può sembrare semplice ma diventa cruciale quando capisci il funzionamento interno. Conoscere la differenza tra chiave e label, sapere quando usare selection_add invece di ridefinire un campo e riconoscere quando passare a un Many2one sono dettagli che distinguono un'implementazione Odoo solida da una che causa problemi dopo qualche mese.
Che tu stia aggiungendo un tipo di contratto con Odoo Studio, definendo un campo fascia di consegna in un modulo Python o creando uno stato qualità tramite API, gli schemi illustrati in questa guida ti aiutano a scegliere la soluzione giusta per il tuo caso.
Nel modello dati Odoo il campo Selection è uno degli strumenti principali per imporre qualità dei dati alla sorgente. Usato correttamente mantiene i record puliti, i report affidabili e le automazioni stabili.
Da Dasolo aiutiamo le aziende a implementare, personalizzare e ottimizzare Odoo in tutti i reparti. Se hai bisogno di progettare un modello dati ordinato, aggiungere campi su misura ai tuoi flussi o sviluppare un modulo Odoo completo, il nostro team può supportarti. Contattaci e parliamo del tuo progetto Odoo.