Introduction
Chaque fois qu'un utilisateur choisit une priorité de lead, sélectionne un mode de paiement ou marque un produit comme actif ou archivé dans Odoo, il interagit très probablement avec un champ de sélection. C'est l'un des types de champs les plus pratiques dans le cadre d'Odoo, et l'un des plus importants à comprendre si vous souhaitez construire des modèles de données propres et fiables.
Contrairement à un champ de texte libre où les utilisateurs peuvent taper n'importe quoi, le champ de sélection limite l'entrée à une liste prédéfinie de choix. Cette contrainte est tout l'intérêt. Elle maintient vos données cohérentes, rend le filtrage et les rapports plus précis, et empêche les fautes de frappe et les variations qui, au fil du temps, perturbent silencieusement les agrégations et les tableaux de bord.
Ce guide couvre tout, de ce que le champ stocke et comment il apparaît dans l'interface, à sa création et sa personnalisation via Odoo Studio, des modules Python ou l'API XML-RPC. Vous trouverez également des exemples pratiques provenant de flux de travail commerciaux réels et une liste d'erreurs courantes à éviter.
Qu'est-ce que le champ de sélection dans Odoo
Dans l'ORM Odoo, le champ de sélection stocke une valeur de chaîne choisie parmi une liste fixe d'options. Chaque option est définie comme une paire clé-valeur : la clé est ce qui est enregistré dans la base de données, et l'étiquette est ce que l'utilisateur voit dans l'interface.
Par exemple, un champ de priorité pourrait être défini avec les options suivantes :
priority = fields.Selection([
('0', 'Normal'),
('1', 'Faible'),
('2', 'Élevé'),
('3', 'Très Élevé'),
], string='Priorité', default='0')
Dans cet exemple, '0', '1', '2', et '3' sont les clés stockées dans la base de données. Les étiquettes Normal, Faible, Élevé, et Très Élevé sont ce que les utilisateurs voient à l'écran. Cette séparation est très importante lorsqu'il s'agit de changer les étiquettes plus tard sans casser les enregistrements existants.
Dans l'interface, un champ de sélection apparaît sous forme de liste déroulante dans les vues de formulaire. Dans les vues de liste, il affiche l'étiquette lisible par l'homme. Lors de l'utilisation du widget badge, chaque option est rendue sous forme d'étiquette colorée, ce qui rend la valeur immédiatement visible dans des vues de liste denses.
Dans Odoo Studio, ce type de champ est appelé un champ Sélection. Lorsqu'il est créé via Studio, il obtient un préfixe x_studio_. Lorsqu'il est créé via du code ou l'API XML-RPC, vous choisissez le nom technique.
Comment fonctionne le champ
Dans le modèle de données Odoo, les champs de sélection sont stockés dans PostgreSQL en tant que colonne VARCHAR. La base de données ne stocke jamais que la clé, jamais l'étiquette. Il est important de garder cela à l'esprit lors de l'écriture de filtres de domaine ou d'actions serveur, car vous devez utiliser la clé, pas la valeur lisible par l'homme.
Par exemple, pour rechercher tous les prospects avec une priorité élevée, votre domaine serait [('priority', '=', '2')], pas [('priority', '=', 'Élevé')].
Attributs clés du champ
Voici les propriétés les plus importantes d'un champ de sélection dans le cadre Odoo :
- selection : La liste des tuples
(clé, étiquette)définissant les options disponibles. Cela peut également être un nom de méthode (chaîne) qui renvoie une liste dynamiquement. - default : La clé de l'option à utiliser lorsque aucune valeur n'a encore été définie. Si omis, le champ commence vide.
- required : Force l'utilisateur à choisir une option avant de sauvegarder. Combiné avec une valeur par défaut, c'est un modèle courant pour les champs d'état.
- selection_add : Utilisé dans l'héritage de module pour ajouter de nouvelles options à un champ de sélection existant sans redéfinir toute la liste. C'est l'approche correcte lors de l'extension d'un champ natif.
- ondelete : Fonctionne avec
selection_addpour définir ce qui se passe avec les enregistrements ayant une option supprimée lorsque le module qui l'a ajoutée est désinstallé.
Listes de Sélection Statique vs Dynamique
Par défaut, la liste des options est définie de manière statique dans la déclaration du champ. Mais vous pouvez également passer un nom de méthode sous forme de chaîne au paramètre selection. Odoo appellera cette méthode à l'exécution pour construire la liste, ce qui vous permet d'afficher différentes options en fonction de l'utilisateur actuel, de l'entreprise actuelle ou de tout autre contexte.
contract_type = fields.Selection(
selection='_get_contract_types',
string='Type de Contrat'
)
def _get_contract_types(self):
if self.env.user.has_group('hr.group_hr_manager'):
return [('permanent', 'Permanent'), ('fixed', 'Contrat à Durée Déterminée'), ('interim', 'Intérim')]
return [('permanent', 'Permanent'), ('fixed', 'Contrat à Durée Déterminée')]
Comment Cela Apparaît dans les Vues
Dans une vue de formulaire, un champ de sélection se rend sous forme de menu déroulant standard. Vous pouvez également utiliser l'attribut widget="badge" pour le rendre sous forme d'étiquette colorée, ce qui fonctionne bien dans les vues liste et kanban pour les champs de statut. L'attribut widget="radio" rend les options sous forme de boutons radio en ligne, ce qui convient aux champs avec un petit nombre de choix où vous souhaitez que toutes les options soient visibles en même temps.
Interaction avec l'ORM Odoo
Lire et écrire des champs de sélection dans l'ORM Odoo fonctionne de manière simple. Vous assignez la clé directement, et le framework gère automatiquement le mappage d'affichage. Lors de la lecture d'un enregistrement via l'API XML-RPC avec fields_get, l'attribut selection du champ inclut la liste complète des paires [clé, étiquette], que vous pouvez utiliser pour construire votre propre logique d'affichage dans des outils externes.
Cas d'utilisation commerciale
Le champ de sélection apparaît dans pratiquement tous les modules d'une implémentation standard d'Odoo. Voici cinq exemples concrets issus de workflows commerciaux courants.
CRM : Priorité des Leads et Type de Phase de Pipeline
Le champ de priorité sur les leads CRM est un champ de sélection natif avec quatre niveaux : Normal, Faible, Élevé et Très Élevé. Les équipes de vente l'utilisent pour concentrer leur attention sur les opportunités les plus prometteuses. Il alimente directement le codage couleur de la vue Kanban et peut être utilisé dans des actions automatisées pour déclencher des tâches de suivi lorsqu'un lead est escaladé. Obtenir la bonne distribution des priorités est l'une des premières améliorations de la qualité des données que la plupart des équipes CRM mettent en œuvre après le lancement.
Ventes : Conditions de paiement et politique de facturation
Le champ invoice_policy sur les produits est un champ de sélection qui détermine si la facturation est basée sur les quantités commandées ou les quantités livrées. Ce champ unique détermine l'ensemble du flux de facturation pour un produit. De même, le mode de facturation sur les contrats d'abonnement utilise un champ de sélection pour distinguer entre les cycles de facturation prépayés et postpayés. Ces deux exemples sont de bons exemples de champs de sélection qui ont des conséquences significatives sur les flux de travail financiers.
Inventaire : États de qualité des produits et des lots
Dans les flux de travail de fabrication et de contrôle qualité, les champs de sélection sont utilisés pour suivre l'état des lots, des numéros de série et des ordres de réparation. Par exemple, le champ d'état de l'ordre de réparation passe par des valeurs telles que brouillon, confirmé, en réparation, prêt et terminé. Chaque transition peut déclencher des e-mails automatisés, des mouvements d'inventaire ou des écritures comptables. Le champ de sélection agit comme le point de contrôle autour duquel l'ensemble du flux de travail est construit.
Comptabilité : Méthode de paiement et type de journal
Le champ de type de journal dans Odoo Comptabilité est un champ de sélection qui distingue entre les journaux de vente, les journaux d'achat, les journaux de caisse et les journaux bancaires. Odoo utilise cette valeur pour appliquer la logique de publication correcte, déterminer quels comptes sont disponibles et restreindre certaines opérations aux bons types de journaux. C'est un bon exemple d'un champ de sélection qui contrôle les règles commerciales plutôt que de simplement étiqueter un enregistrement.
RH : Type d'emploi et statut du contrat
Les équipes RH utilisent des champs de sélection pour suivre les types d'emploi, les statuts de contrat et les états des demandes de congé. Le statut du contrat, par exemple, passe de nouveau à ouvert, puis à expiré ou annulé. Les automatisations peuvent notifier le responsable RH un mois avant l'expiration d'un contrat, déclencher des listes de contrôle d'intégration lorsqu'un nouvel employé commence et mettre à jour les règles de paie en fonction du type d'emploi. Le champ de sélection contient l'état qui pilote toute cette logique.
Créer ou personnaliser le champ de sélection
Il existe trois principales façons d'ajouter un champ de sélection à un modèle Odoo, en fonction de votre configuration et de la nécessité que le changement soit contrôlé par version ou appliqué de manière programmatique.
Utiliser Odoo Studio (sans code)
Odoo Studio est l'outil intégré à faible code pour ajouter des champs sans écrire de Python. Pour ajouter un champ de sélection via Studio :
- Ouvrez Odoo Studio depuis le menu principal.
- Naviguez vers le formulaire où vous souhaitez ajouter le champ.
- Faites glisser un champ Sélection depuis la barre latérale vers le formulaire.
- Ajoutez vos options dans le panneau des propriétés du champ, en saisissant une étiquette pour chaque choix.
- Optionnellement, définissez une valeur par défaut et marquez le champ comme requis.
- Enregistrez et fermez Studio.
Studio stocke chaque option avec une clé générée automatiquement et l'étiquette que vous avez fournie. Le champ reçoit un préfixe x_studio_ et est ajouté automatiquement à la vue du formulaire. C'est l'approche la plus rapide pour ajouter un champ de Sélection lors d'une session d'analyse commerciale avec un client.
Utiliser Python dans un Module Personnalisé
Pour les développeurs construisant des modules Odoo, les champs de Sélection sont définis dans des fichiers de modèle Python. C'est l'approche recommandée pour les personnalisations qui doivent être contrôlées par version et déployées sur plusieurs environnements :
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
x_delivery_slot = fields.Selection([
('morning', 'Matin (8h - 12h)'),
('afternoon', 'Après-midi (13h - 17h)'),
('evening', 'Soir (18h - 20h)'),
], string='Créneau de Livraison', default='morning')
Après avoir défini le champ, vous l'ajoutez au fichier XML de vue pertinent afin qu'il apparaisse dans l'interface. Odoo gère la création de la colonne de base de données lorsque vous installez ou mettez à jour le module.
Lorsque vous étendez un champ natif avec de nouvelles options, utilisez selection_add au lieu de redéfinir le champ :
class SaleOrder(models.Model):
_inherit = 'sale.order'
state = fields.Selection(
selection_add=[('custom_approval', 'En attente d'approbation')],
ondelete={'custom_approval': 'définir par défaut'}
)
Utiliser l'API XML-RPC
Si vous gérez des personnalisations Odoo de manière programmatique, par exemple dans le cadre d'un pipeline de déploiement ou d'un carnet de configuration à distance, vous pouvez créer des champs de sélection via l'API XML-RPC :
field_id = models.execute_kw(
ODOO_DB, uid, ODOO_API_KEY,
'ir.model.fields', 'create',
[{
'name': 'x_contract_category',
'field_description': 'Catégorie de contrat',
'model_id': model_id,
'ttype': 'selection',
'selection': "[('standard', 'Standard'), ('premium', 'Premium'), ('custom', 'Personnalisé')]",
'state': 'manual',
}]
)
Notez que lors de la création d'un champ de sélection via l'API, la valeur selection est passée sous forme de représentation chaîne de la liste Python. La valeur state: manual indique à Odoo que ce champ a été créé manuellement, ce qui est le bon paramètre pour les champs créés via Studio ou l'API. C'est ainsi que Dasolo gère la création de champs à distance pour les clients dans le cadre de scripts de configuration automatisés.
Meilleures pratiques
1. Utilisez des clés significatives et stables
La clé est ce qui est stocké dans la base de données et utilisé dans les filtres de domaine, les actions automatisées et la logique côté serveur. Choisissez une clé qui décrit clairement l'option et que vous n'aurez pas besoin de changer plus tard. Des chaînes courtes en minuscules fonctionnent bien : 'draft', 'confirmed', 'cancelled'. Évitez les clés numériques à moins que la séquence ne soit réellement importante, car elles rendent votre code plus difficile à lire et à comprendre des mois plus tard.
2. Gardez la liste courte et exhaustive
Un champ de sélection avec plus de huit ou dix options est généralement un signal que le champ essaie de faire trop de choses. Si la liste continue de croître, envisagez si une relation Many2one avec un modèle de configuration serait plus appropriée. Cela donne aux utilisateurs la possibilité de gérer eux-mêmes les options via l'interface, sans nécessiter qu'un développeur mette à jour le code ou la définition d'un champ de base de données.
3. Toujours définir une valeur par défaut pour les champs requis
Si un champ de sélection est requis, définissez également une valeur par défaut raisonnable. Cela évite les erreurs de validation lors de la création de dossiers de manière programmatique, par le biais d'importations ou via l'API, où l'utilisateur n'est pas présent pour faire une sélection. La valeur par défaut doit représenter l'état le plus courant ou le moins engagé dans le flux de travail.
4. Utilisez selection_add lors de l'extension des champs natifs
Si vous devez ajouter des options à un champ Odoo existant dans un module personnalisé, utilisez selection_add plutôt que de redéfinir le champ complet. C'est plus sûr et plus compatible avec d'autres modules qui peuvent également étendre le même champ. Associez-le toujours au paramètre ondelete pour gérer ce qui se passe lorsque votre module est désinstallé.
5. Utilisez le widget badge pour la visibilité dans les vues de liste
Dans les vues de liste et kanban, le rendu par défaut d'un champ de sélection est simplement du texte. Ajouter l'attribut widget="badge" dans le XML de la vue transforme chaque valeur en une étiquette colorée, rendant le champ beaucoup plus facile à scanner d'un coup d'œil. Cela est particulièrement utile pour les champs de statut où les utilisateurs doivent rapidement identifier les enregistrements nécessitant une attention.
Pièges courants
Changer une clé casse les données existantes
L'étiquette d'une option de sélection peut être changée en toute sécurité à tout moment, car seule la clé est stockée dans la base de données. Cependant, la clé ne doit jamais changer une fois que des enregistrements existent avec cette valeur. Si vous renommez une clé, tous les enregistrements existants avec l'ancienne clé afficheront une valeur vide ou invalide dans l'interface, et tous les filtres de domaine ou automatisations utilisant l'ancienne clé cesseront silencieusement de fonctionner. Si une clé doit réellement changer, vous devez exécuter un script de migration de données pour mettre à jour tous les enregistrements existants d'abord.
Supprimer une option laisse des enregistrements orphelins
Si vous supprimez une option de la liste alors que des enregistrements conservent cette clé, ces enregistrements afficheront une valeur manquante ou cassée. Avant de supprimer une option, recherchez les enregistrements qui l'utilisent encore et mettez-les à jour avec une valeur valide ou archivez-les. C'est un problème courant lors des projets de nettoyage de données lorsque la liste des options a été conçue sans suffisamment d'analyse au préalable.
Utiliser l'étiquette au lieu de la clé dans les filtres de domaine
Une erreur très courante, surtout pour les utilisateurs moins techniques rédigeant des règles d'automatisation dans l'interface Odoo, est de filtrer par l'étiquette lisible par l'homme plutôt que par la clé stockée. Cela produit un domaine qui renvoie zéro résultat sans générer d'erreur, ce qui peut être difficile à diagnostiquer. Vérifiez toujours la définition du champ pour confirmer quelle clé correspond à quelle étiquette avant d'écrire un filtre.
Utiliser un champ de sélection là où un Many2one est plus approprié
Si la liste des options change fréquemment, si les utilisateurs doivent la gérer eux-mêmes sans intervention des développeurs, ou si les options portent des attributs supplémentaires comme une couleur, une séquence ou un compte lié, alors une relation Many2one avec un modèle de configuration est le meilleur choix. Les champs de sélection sont idéaux pour des listes stables gérées par des développeurs. Pour tout ce qui est plus dynamique, Many2one est plus maintenable à long terme.
Ne pas gérer la valeur vide dans la logique côté serveur
Un champ de sélection qui n'est pas requis peut contenir une valeur False lorsque aucune option n'a été sélectionnée. Si votre code Python ou action automatisée compare la valeur du champ à une chaîne sans d'abord vérifier pour False, vous obtiendrez un comportement inattendu ou des erreurs. Gérez toujours explicitement le cas vide dans les actions serveur et les champs calculés qui dépendent d'un champ de sélection.
Conclusion
Le champ de sélection est l'un de ces types de champs qui semble simple mais qui a une réelle profondeur une fois que vous comprenez comment il fonctionne en coulisses. Connaître la différence entre une clé et une étiquette, comprendre quand utiliser selection_add par rapport à la redéfinition d'un champ, et reconnaître quand un Many2one vous servirait mieux sont les types de distinctions qui séparent une implémentation Odoo bien conçue de celle qui pose des problèmes un an plus tard.
Que vous ajoutiez un type de contrat via Odoo Studio, que vous définissiez un champ de créneau de livraison dans un module Python personnalisé, ou que vous créiez un champ d'état de qualité via l'API, les modèles décrits dans ce guide vous donnent ce dont vous avez besoin pour prendre la bonne décision pour votre cas d'utilisation.
Dans le modèle de données Odoo, le champ de sélection est l'un des principaux outils pour garantir la qualité des données à la source. Bien utilisé, il garde vos enregistrements propres, vos rapports précis et vos automatisations fiables.
Chez Dasolo, nous aidons les entreprises à mettre en œuvre, personnaliser et optimiser Odoo dans tous les départements. Que vous ayez besoin d'aide pour concevoir un modèle de données propre, ajouter des champs personnalisés à vos flux de travail, ou construire un module Odoo complet à partir de zéro, notre équipe est là pour vous aider. Contactez-nous et parlons de votre projet Odoo.