NXL Forge.Pendant que le marché rédige — nous livrons
Technique Odoo··4 min de lecture

Odoo 19 déprécie _cr, _context et odoo.osv : préparez vos modules

Le changelog ORM d'Odoo 19 déprécie les accès raccourcis record._cr, ._context et ._uid, ainsi que le module odoo.osv. On fait le point sur les remplacements par env et par la classe Domain, avec une méthode simple pour repérer le code concerné dans vos modules.

Odoo 19ORMMigrationDéveloppement Odoo

Odoo 19 poursuit le nettoyage de l'API bas niveau de l'ORM. Le changelog officiel de la 19.0 tient en quatre entrées, et deux d'entre elles touchent directement du code que beaucoup de modules custom traînent depuis des années. Les accès raccourcis record._cr, record._context et record._uid passent en déprécié, et le module odoo.osv suit le même chemin1. Rien ne casse au chargement, mais les avertissements s'accumulent dans les logs et une prochaine version majeure finira par retirer ces accès. Autant traiter le sujet maintenant, tant que les deux syntaxes cohabitent.

Ce que liste le changelog 19.0

Le changelog ORM de la 19.0 documente quatre changements. Deux sont additifs et ne demandent aucune migration. Deux sont des dépréciations qui concernent le code existant.

EntréeNatureImpact sur vos modules
GROUPING SETS pour les vues pivotAjoutAucun, fonctionnalité en plus
Dates dynamiques dans les domainesAjoutAucun, syntaxe en plus
record._cr, record._context, record._uid dépréciésDépréciationÀ corriger dans le code Python
odoo.osv dépréciéDépréciationÀ corriger dans les imports

Les deux premières lignes élargissent l'ORM sans rien retirer. Ce sont les deux dernières qui demandent une passe de relecture.

Les accès raccourcis à l'environnement

Historiquement, self._cr, self._context et self._uid servaient de raccourcis vers l'objet Environment attaché à chaque recordset. Ils pointaient respectivement vers le curseur de base de données, le dictionnaire de contexte et l'identifiant de l'utilisateur courant. L'accès recommandé passe désormais par self.env, qui expose les mêmes valeurs de façon explicite.

La correction reste mécanique. Le curseur devient self.env.cr, le contexte devient self.env.context et l'utilisateur devient self.env.uid.

# Avant
self._cr.execute("SELECT id FROM res_partner WHERE active = true")
langue = self._context.get('lang')
utilisateur = self._uid

# Après
self.env.cr.execute("SELECT id FROM res_partner WHERE active = true")
langue = self.env.context.get('lang')
utilisateur = self.env.uid

L'intérêt du passage par env n'est pas seulement cosmétique. Il rend visible la dépendance à l'environnement, ce qui aide quand vous manipulez with_context, sudo ou un changement d'utilisateur au sein d'une même méthode. Le raccourci masquait cette dépendance et rendait certains bugs de contexte difficiles à tracer.

odoo.osv et la classe Domain

La dépréciation de odoo.osv concerne surtout la construction de domaines. Beaucoup de modules importaient expression pour combiner des filtres avec AND, OR et NOT. Odoo 19 propose à la place la classe Domain, importée depuis odoo.fields2. Elle se combine avec les opérateurs Python &, | et ~, ce qui rend les expressions plus lisibles que les listes imbriquées.

# Avant
from odoo.osv import expression
domaine = expression.AND([domaine_1, domaine_2])
domaine = expression.OR([domaine_1, domaine_2])

# Après
from odoo.fields import Domain
domaine = Domain(domaine_1) & Domain(domaine_2)   # ET
domaine = Domain(domaine_1) | Domain(domaine_2)   # OU
negation = ~Domain(domaine_1)                     # NON

La classe accepte aussi une écriture directe, Domain('name', '=', 'abc'), et fournit les méthodes statiques Domain.AND([...]) et Domain.OR([...]) pour combiner plusieurs domaines d'un coup. Un objet Domain reste sérialisable vers la liste préfixée classique, donc il s'insère sans friction dans un search ou un champ de vue existant.

Comment repérer les appels concernés

Avant de corriger, il faut recenser. Un grep récursif sur vos addons donne une première liste de travail.

grep -rnE "self\._cr|self\._context|self\._uid" --include=*.py votre_module/
grep -rn "from odoo.osv import expression" --include=*.py votre_module/

Les faux positifs existent, en particulier autour de _context qui apparaît dans d'autres noms de variables. Une relecture reste nécessaire. Lancer la suite de tests du module avec les avertissements de dépréciation activés complète utilement la recherche, car l'ORM émet un message au moment où le code touche un attribut déprécié. Nous avions déjà décrit d'autres ajustements de cette version dans notre article sur les changements ORM qui touchent vos modules.

Ce qui reste sans surprise

Les imports de haut niveau ne bougent pas. from odoo import models, fields, api fonctionne comme avant, et la grande majorité du code métier ne voit aucune différence. Les deux dépréciations visent des habitudes de code plutôt que l'architecture des modules. Une migration bien préparée se limite donc à une recherche ciblée et à des remplacements localisés, sans refonte.

Notre lecture

Ces deux dépréciations ne sont pas urgentes au sens strict, puisque le code continue de tourner en 19.0. Elles sont pourtant à traiter tôt, pour une raison de coût. Un module qui migre régulièrement absorbe ces changements par petites touches, à chaque version. Un module laissé de côté pendant deux ou trois cycles accumule les dettes, et la migration finit par ressembler à une réécriture. Dans nos chantiers, nous traitons ce type de dépréciation dès qu'elle apparaît au changelog, même quand la version en cours ne l'impose pas encore. La classe Domain mérite en plus qu'on s'y attarde, car sa syntaxe à base d'opérateurs simplifie durablement les domaines complexes que l'on trouve dans les règles d'accès et les filtres dynamiques.

Sources

Footnotes

  1. Le changelog ORM de la 19.0 liste explicitement la dépréciation de record._cr, record._context, record._uid et du module odoo.osv.

  2. La référence ORM de la 19.0 documente la classe Domain importée depuis odoo.fields, combinée par les opérateurs &, |, ~ et les méthodes Domain.AND et Domain.OR.

Sur le même thème

Votre idée mérite un vrai logiciel

Une question, un projet Odoo ?

Modules préconfigurés, intégration, sur-mesure — parlons-en sans engagement.