Les champs en lecture seule sont l'une de ces fonctionnalités dans Odoo qui semblent simples au premier abord mais jouent un rôle beaucoup plus important que ce que la plupart des utilisateurs attendent.
Que vous soyez un utilisateur commercial vous demandant pourquoi certains champs sont grisés, ou un développeur cherchant à contrôler le comportement des champs dans votre personnalisation Odoo, ce guide couvre tout ce que vous devez savoir.
Comprendre comment fonctionnent les champs en lecture seule est essentiel pour construire des flux de travail fiables, protéger l'intégrité des données et offrir une expérience plus fluide à votre équipe.
Ce tutoriel sur les champs Odoo aborde à la fois les aspects commerciaux et techniques des champs en lecture seule, donc que vous configuriez Odoo ou que vous construisiez dessus, vous trouverez ici ce dont vous avez besoin.
Qu'est-ce que le champ en lecture seule dans Odoo
Un champ en lecture seule dans Odoo est un champ qui affiche une valeur mais ne peut pas être modifié directement par l'utilisateur via l'interface. Les données sont visibles, mais l'entrée est verrouillée.
Dans la vue de formulaire, les champs en lecture seule apparaissent généralement comme du texte simple plutôt que comme des zones de saisie interactives. Selon le thème Odoo, ils peuvent avoir un aspect légèrement grisé ou simplement plat par rapport aux champs modifiables.
Dans le modèle de données Odoo, le comportement en lecture seule peut être appliqué à deux niveaux distincts :
- Au niveau du champ (Python/ORM) : le champ est toujours en lecture seule dans toutes les vues et contextes.
- Au niveau de la vue (XML) : le champ est en lecture seule dans une vue spécifique ou sous des conditions spécifiques.
Cette distinction est importante. Un champ marqué comme en lecture seule au niveau de l'ORM ne peut pas être modifié via une interface utilisateur. Un champ marqué en lecture seule au niveau de la vue est protégé dans ce contexte particulier mais peut encore être modifiable dans d'autres vues ou via du code côté serveur.
Readonly n'est pas un type de champ en soi. C'est un attribut qui peut être appliqué à n'importe lequel des types de champs standard d'Odoo : Char, Integer, Float, Many2one, Date, et d'autres. C'est une partie essentielle du cadre Odoo pour contrôler le comportement des champs à l'exécution.
Comment fonctionne le champ en lecture seule
Pour comprendre comment les champs en lecture seule se comportent, il est utile de regarder les deux côtés : l'ORM Odoo (Python) et la couche de vue (XML).
Readonly au niveau de l'ORM
Dans l'ORM Odoo, un champ peut être déclaré comme définitivement en lecture seule directement dans le modèle Python. C'est le plus courant pour les champs calculés qui dérivent leur valeur d'autres données. La définition du champ inclut readonly=True comme paramètre, et Odoo ne permettra jamais à l'utilisateur de le modifier via l'interface utilisateur.
Ce niveau de lecture seule fait partie de l'API des champs Python d'Odoo et est documenté dans le guide officiel des développeurs Odoo. Il s'applique globalement, peu importe quelle vue est utilisée.
Readonly basé sur l'état
Un des modèles les plus courants dans le développement Odoo consiste à rendre un champ en lecture seule en fonction de l'état actuel d'un document. C'est ainsi que des modules standard comme Ventes, Achats et Comptabilité verrouillent leurs données une fois qu'un document passe au-delà de l'étape de brouillon.
Dans Odoo 16 et les versions antérieures, cela se faisait en utilisant l'attribut attrs dans le XML de la vue, combinant une condition de domaine avec l'élément de champ. Dans Odoo 17 et les versions ultérieures, la syntaxe est plus concise et écrite directement comme une expression en ligne sur l'élément de champ.
Les deux approches atteignent le même résultat : le champ est modifiable tant que le document est en brouillon, et devient verrouillé une fois qu'il progresse dans le flux de travail. C'est un concept fondamental dans tout tutoriel technique Odoo couvrant la configuration des champs.
Champs Calculés et Lecture Seule
Les champs calculés d'Odoo sont en lecture seule par défaut. Lorsque vous définissez un champ avec une méthode compute, Odoo suppose qu'il ne doit pas être modifié directement car sa valeur est dérivée automatiquement d'autres champs.
Si vous souhaitez qu'un champ calculé soit également stocké, vous définissez à la fois le paramètre compute et store=True. Ces champs de base de données Odoo stockés sont un modèle courant pour l'optimisation des performances, car ils peuvent être utilisés dans des filtres de recherche et triés efficacement au niveau de la base de données sans recalculer les valeurs à la volée.
Rendre un Champ Calculé Éditable
Si vous avez besoin qu'un champ calculé accepte également une saisie manuelle, vous pouvez définir une méthode inverse à côté. La méthode inverse indique à Odoo quoi faire lorsqu'un utilisateur écrit une valeur dans le champ calculé. Sans inverse, le champ reste en lecture seule par défaut. Cela fait partie des types de champs ORM Odoo plus avancés et est couvert en profondeur dans le guide des développeurs Odoo.
Cas d'utilisation commerciale
Les champs en lecture seule apparaissent dans chaque module Odoo. Voici cinq exemples pratiques issus de véritables flux de travail commerciaux.
1. CRM : Verrouillage des Données d'Opportunités Gagnées et Perdues
Dans le module CRM, le revenu attendu et la date de clôture sont modifiables tant qu'un prospect est en cours de traitement. Une fois qu'une opportunité est marquée comme Gagnée ou Perdue, ces champs sont définis comme en lecture seule pour préserver un enregistrement précis de ce qui a été clôturé et à quelle valeur.
Cela empêche quiconque de revenir en arrière et d'ajuster les chiffres après coup, ce qui déformerait les rapports de vente et les analyses de pipeline.
2. Ventes : Protection des Lignes de Commande Confirmées
Lorsque un bon de commande passe de Brouillon à Confirmé, les lignes de commande deviennent en lecture seule. Les utilisateurs ne peuvent plus changer le produit, la quantité ou le prix après que le client a reçu une confirmation.
Si des modifications sont réellement nécessaires, la commande doit être explicitement réinitialisée à l'état de brouillon, ce qui crée une trace d'audit et rend la correction intentionnelle plutôt qu'accidentelle.
3. Inventaire : Quantités de Mouvement de Stock Validées
Dans les opérations d'entrepôt, une fois qu'une livraison ou une réception est validée, les quantités effectuées sont verrouillées. Cela protège l'intégrité de l'évaluation des stocks et garantit que les enregistrements correspondent à ce qui a physiquement circulé dans l'entrepôt.
Des quantités modifiables après validation pourraient silencieusement corrompre les niveaux de stock à travers plusieurs emplacements.
4. Comptabilité : Lignes de Journal Comptable Publiées
En comptabilité, une fois qu'une écriture de journal est publiée, toutes ses lignes deviennent en lecture seule. C'est à la fois une exigence légale dans de nombreux pays et un principe fondamental de la comptabilité en partie double.
Permettre des modifications après publication compromettrait la fiabilité des états financiers et créerait de sérieux risques de conformité.
5. Fabrication : Données de Bon de Travail Complété
Dans le module de Fabrication, une fois qu'un bon de travail est marqué comme terminé, la durée réelle et les quantités produites sont définies comme en lecture seule. Cela préserve des enregistrements de production précis qui alimentent l'analyse des coûts et le suivi des performances.
Créer ou personnaliser un champ en lecture seule
Il existe deux principales méthodes pour configurer des champs en lecture seule dans Odoo : utiliser Odoo Studio pour une approche sans code, ou écrire directement en Python et XML pour un contrôle technique complet.
Utiliser Odoo Studio
Les champs Odoo Studio facilitent l'ajout ou la modification du comportement en lecture seule sans écrire de code. Pour configurer un champ en lecture seule à l'aide de Studio :
- Ouvrez Odoo Studio depuis le menu principal (l'icône de crayon)
- Naviguez vers la vue de formulaire où vous souhaitez configurer le champ
- Cliquez sur le champ que vous souhaitez modifier
- Dans le panneau de propriétés à droite, activez l'option "Lecture seule"
- Enregistrez et fermez Studio
Studio permet également de définir un comportement conditionnel en lecture seule à l'aide d'expressions de domaine. Par exemple, vous pouvez rendre un champ en lecture seule uniquement lorsque un champ de statut est égal à une valeur spécifique, sans écrire une seule ligne de code.
L'approche de création de champs Odoo Studio est le bon choix pour les consultants et les administrateurs qui doivent appliquer rapidement et en toute sécurité des règles de données. Les modifications apportées via Studio sont stockées dans la base de données et ne seront pas écrasées par les mises à jour de module.
Utilisation de Python pour la personnalisation technique
Pour les développeurs construisant des modules Odoo personnalisés, l'attribut en lecture seule est défini directement sur la définition du champ dans le modèle Python. C'est l'utilisation standard des champs Python d'Odoo et cela est couvert dans chaque guide de développement Odoo.
Vous pouvez définir readonly=True comme un paramètre statique sur n'importe quel type de champ, le rendant ainsi non modifiable de manière permanente. Pour un contrôle plus flexible, le paramètre states vous permet de définir dans quels états de document le champ doit être modifiable ou en lecture seule.
Cette approche est particulièrement utile lorsque vous ajoutez des champs personnalisés à des modèles Odoo existants dans le cadre d'un projet de personnalisation Odoo. Elle maintient la logique des champs proche du modèle de données plutôt que dispersée à travers plusieurs fichiers de vue.
Utilisation des attributs de vue XML
Pour un comportement en lecture seule au niveau de la vue, vous ajoutez l'attribut readonly directement à l'élément de champ dans votre XML de vue. Cela fait partie du flux de travail standard de développement Odoo pour toute personnalisation technique.
L'avantage de la lecture seule au niveau de la vue est la flexibilité : le même champ peut se comporter différemment dans différentes vues, ou sous différentes conditions, sans changer la définition sous-jacente du champ. C'est souvent l'approche préférée lorsque vous devez ajouter des restrictions aux champs standard existants sans modifier leur définition Python.
Dans Odoo 17, la syntaxe d'expression en ligne pour les conditions de lecture seule est plus claire et plus lisible que l'ancienne syntaxe de dictionnaire attrs utilisée dans les versions précédentes. Les deux approches sont valides selon la version d'Odoo que vous utilisez.
Meilleures pratiques
Utiliser correctement les champs en lecture seule revient à les appliquer au bon niveau, pour la bonne raison. Voici les directives les plus importantes d'un point de vue de conseil Odoo.
1. Préférez la lecture seule au niveau de la vue lorsque le contexte varie
Si un champ doit être en lecture seule uniquement dans certains états de document ou dans des vues spécifiques, appliquez la lecture seule au niveau de la vue plutôt qu'au niveau du modèle. Cela garde votre modèle de données Odoo flexible et permet aux processus backend ou aux intégrations API d'écrire toujours dans le champ si nécessaire.
2. Alignez les conditions de lecture seule avec le cycle de vie du document
Vos conditions de lecture seule doivent correspondre au flux naturel de vos documents. Les champs doivent se verrouiller lorsque le document atteint un état où d'autres modifications pourraient poser problème. Cela crée une expérience prévisible et intuitive pour les utilisateurs, ce qui est l'une des caractéristiques d'une personnalisation Odoo bien mise en œuvre.
3. Testez à travers les rôles d'utilisateur
Le comportement en lecture seule peut interagir avec les droits d'accès de manière inattendue. Testez toujours votre configuration à la fois en tant qu'utilisateur standard et en tant qu'administrateur pour vérifier que le champ se comporte correctement pour chaque rôle. Ce qui semble en lecture seule pour un groupe d'utilisateurs peut encore être modifiable pour un autre en fonction de leur profil.
4. Combinez la lecture seule avec requis là où cela a du sens
Dans les formulaires à plusieurs étapes, un champ peut être requis dans l'ébauche mais en lecture seule dans les états ultérieurs. Vous pouvez combiner les deux attributs dans votre XML de vue pour appliquer ce modèle de manière claire. Cela est courant pour des champs comme les dates de livraison ou les numéros de référence qui doivent être remplis avant qu'un document ne soit confirmé.
5. Documentez votre logique de lecture seule
Dans le développement Odoo personnalisé, en particulier sur des modèles de données complexes, ajoutez toujours un commentaire expliquant pourquoi un champ est en lecture seule. Les futurs développeurs qui maintiennent le code doivent comprendre la raison commerciale derrière la restriction, pas seulement l'implémentation technique.
6. Utilisez des champs Studio pour des modifications rapides et sécurisées lors des mises à jour
Pour des cas d'utilisation simples, les champs Odoo Studio offrent un moyen rapide et sécurisé lors des mises à jour d'ajouter un comportement en lecture seule. Réservez la personnalisation Python pour les cas où Studio ne peut pas fournir la logique requise, comme des conditions complexes entre champs ou une intégration avec des champs calculés personnalisés.
Pièges courants
Même les utilisateurs et développeurs Odoo expérimentés rencontrent les mêmes problèmes avec les champs en lecture seule. Voici ceux qu'il vaut la peine de connaître avant qu'ils ne vous prennent au dépourvu.
Confondre la lecture seule au niveau de la vue avec une frontière de sécurité
Un champ défini comme en lecture seule dans une vue ne prévient pas les mises à jour via l'API XML-RPC, les appels d'écriture ORM en Python ou les actions serveur. La lecture seule au niveau de la vue est une restriction de l'interface utilisateur, pas un contrôle de sécurité. Si vous devez vraiment empêcher toutes les écritures sur un champ, vous devez l'imposer au niveau de l'ORM ou par le biais de règles de contrôle d'accès, pas seulement dans la vue.
Rendre les champs définitivement en lecture seule quand conditionnel serait mieux
Il est tentant de verrouiller complètement un champ lorsque vous souhaitez le protéger. Mais si les utilisateurs ont légitimement besoin de le modifier dans certaines situations, comme lors de la réinitialisation d'un document à l'ébauche, un champ en lecture seule au niveau de l'ORM les bloquera complètement, y compris tout flux de travail de correction. Pensez toujours à l'ensemble du cycle de vie avant de choisir le permanent plutôt que le conditionnel.
Oublier les méthodes Onchange
Si un champ en lecture seule est également référencé dans une méthode onchange, cette méthode peut toujours tenter de lui assigner une valeur. Cela peut produire un comportement déroutant où le champ semble se mettre à jour lors de l'interaction de l'utilisateur, mais revient ensuite ou déclenche une erreur. Assurez-vous que votre logique onchange prend en compte les champs en lecture seule.
Ne pas appliquer la propriété en lecture seule de manière cohérente dans toutes les vues
Un champ marqué comme en lecture seule dans la vue de formulaire peut encore être modifiable dans la vue liste ou la vue kanban si ces vues n'incluent pas la même restriction. Vérifiez toujours que votre configuration en lecture seule est appliquée de manière cohérente dans chaque vue où le champ apparaît.
Effets secondaires lors de l'héritage des modèles standards
Lors de l'héritage d'un modèle Odoo standard et de l'ajout de readonly=True à un champ existant, ce changement affecte toutes les vues qui affichent ce champ, y compris les standards. Assurez-vous que cela est intentionnel et que cela ne perturbera pas le comportement standard d'Odoo ou ne sera pas en conflit avec d'autres personnalisations sur le même modèle.
Conclusion
Les champs en lecture seule sont un outil fondamental dans Odoo pour guider les utilisateurs à travers les flux de travail, protéger l'intégrité des données et faire respecter les règles commerciales sans se fier uniquement à la formation.
La clé est de savoir quand appliquer la propriété en lecture seule au niveau de la vue par rapport au niveau du modèle, et de s'assurer que les conditions s'alignent avec la manière dont votre équipe travaille réellement. Un modèle de données Odoo bien configuré utilise toujours de manière réfléchie les champs en lecture seule aux bons moments dans le cycle de vie du document.
Que vous les configuriez via Odoo Studio pour une approche sans code ou que vous les définissiez directement en Python et XML dans le cadre d'un projet de développement Odoo plus large, la logique derrière les champs en lecture seule reste cohérente : montrer les données, mais les protéger contre les modifications non intentionnelles.
Ils ne sont peut-être pas le sujet le plus discuté dans la personnalisation d'Odoo, mais ils sont discrètement l'un des plus impactants.
Chez Dasolo, nous aidons les entreprises à mettre en œuvre, personnaliser et optimiser Odoo dans tous les modules et secteurs. Si vous avez besoin d'aide pour configurer des champs, concevoir des flux de travail fiables ou améliorer votre modèle de données Odoo, notre équipe est prête à vous soutenir. Contactez-nous et parlez-nous de votre projet.