Depuis la sortie d'Odoo 19, plusieurs billets techniques affirment que la directive t-esc provoque désormais une erreur bloquante dans les templates, et qu'il faut tout réécrire avant de migrer. La consigne circule assez pour inquiéter les équipes qui maintiennent des modules riches en QWeb. En pratique, la documentation officielle d'Odoo 19 raconte une histoire plus nuancée, et le vrai chantier ne porte pas sur la directive que ces billets pointent du doigt.
Ce que dit vraiment la doc officielle
La référence QWeb d'Odoo 19 décrit la directive de sortie out comme le point d'entrée standard. Elle échappe automatiquement le HTML de son entrée, évalue une expression et injecte le résultat dans le document 1. Cet échappement automatique limite le risque d'injection quand on affiche un contenu saisi par un utilisateur.
Sur esc, la même page est explicite : c'est un alias pour out, qui à l'origine échappait le HTML, et elle précise qu'il n'est « pas encore formellement déprécié » 1. Autrement dit, un t-esc dans vos templates continue de fonctionner en Odoo 19, avec le même comportement d'échappement que t-out. Rien dans la documentation ne décrit d'erreur bloquante. L'affirmation selon laquelle t-esc casse le rendu vient de guides tiers, pas de la source officielle 2. Je la classe donc comme non confirmée.
La directive qui pose vraiment problème, c'est t-raw. La doc la présente comme une version de out qui n'échappe jamais son contenu, dépréciée depuis la version 15.0, à remplacer par out avec une valeur markupsafe.Markup 1. La raison tient en une phrase : quand le code qui produit le contenu évolue, il devient difficile de savoir si ce contenu reste sûr à injecter tel quel. t-raw ouvre donc la porte aux failles XSS, et c'est pour cela qu'Odoo pousse à l'abandonner depuis plusieurs versions.
Deux moteurs, un même piège
QWeb sert à deux endroits dans Odoo, et la confusion vient souvent de là. Côté serveur, il rend les rapports PDF et les pages du site web en Python. Côté client, le framework Owl l'utilise pour l'interface web, en JavaScript. Les directives out, esc et raw existent des deux côtés, avec la même logique d'échappement.
Le mécanisme qui marque un contenu comme sûr diffère selon le moteur. En Python, on enveloppe la chaîne dans markupsafe.Markup, ce que recommande la doc officielle 1. Côté Owl, les guides de migration conseillent d'envelopper le HTML de confiance dans l'utilitaire markup(), au niveau du JavaScript plutôt que dans le XML 2. L'idée reste la même : le choix d'injecter du HTML brut remonte dans le code, où il est tracé, au lieu d'être caché dans un attribut de template.
Sur Owl 3 lui-même, qui arrive avec Odoo 20, nous avons déjà regardé les ruptures d'API côté composants dans un autre article. La question des directives de sortie est distincte : elle touche vos templates, pas vos classes de composants.
Le vrai plan de migration
Pour une base de modules existante, l'ordre des priorités s'inverse par rapport à ce que suggèrent les billets alarmistes.
| Directive | Statut en Odoo 19 | Action |
|---|---|---|
t-raw | Dépréciée depuis la 15.0 | À réécrire en priorité |
t-esc | Alias, pas formellement déprécié | Standardiser quand c'est pratique |
t-out | Directive recommandée | Rien à faire |
Concrètement, commencez par chercher t-raw dans tous vos fichiers XML, y compris ceux rangés sous static/src. Chaque occurrence demande un arbitrage : le contenu est-il de confiance ? Si oui, passez à t-out avec un Markup explicite côté Python ou markup() côté Owl, et vérifiez que la source est assainie en amont. Si le contenu peut venir d'un utilisateur, ne le marquez jamais comme sûr sans nettoyage serveur.
Les t-esc peuvent attendre. Les remplacer par t-out relève de la bonne hygiène, parce que le code converge alors vers une seule directive, mais cela ne bloque aucune migration en Odoo 19. Traiter ce lot en dernier, voire au fil de l'eau, évite de mobiliser une équipe sur un chantier cosmétique pendant qu'un vrai risque de sécurité dort encore dans le code.
Notre lecture
Sur nos projets, nous auditons d'abord les t-raw, parce que c'est là que se cachent les failles d'injection et la dette technique réelle. Un grep sur t-raw donne en quelques secondes la liste des points à arbitrer, et cette liste est presque toujours plus courte que ce que les équipes redoutent.
Nous appliquons aussi une règle simple face aux guides de migration : une directive annoncée comme « supprimée » ou « cassée » se vérifie dans la référence officielle avant d'ouvrir le moindre ticket. Dans ce cas précis, la doc d'Odoo 19 contredit l'alerte la plus répandue. Réécrire des centaines de t-esc sous la pression d'un billet de blog, c'est du temps pris sur la correction des t-raw, qui eux méritent vraiment l'attention. La prudence consiste à lire la source plutôt qu'à suivre la rumeur.
Sources
- QWeb Templates, documentation Odoo 19.0 : https://www.odoo.com/documentation/19.0/developer/reference/frontend/qweb.html
- Migration de t-esc vers t-out dans Owl 3 (Odoo 19), Octura Solutions : https://octurasolutions.com/fr/resources/migration-t-esc-vers-t-out-owl-3-odoo-19
- Overview of what developers need to know in Odoo 19 technical changes, Cybrosys : https://www.cybrosys.com/blog/overview-of-what-developers-need-to-know-in-odoo-19-technical-changes
Footnotes
-
Documentation officielle Odoo 19.0, référence QWeb Templates : la directive
outéchappe le HTML automatiquement ;escen est un alias « pas encore formellement déprécié » ;rawn'échappe jamais son contenu et est dépréciée depuis la 15.0, au profit deoutavec une valeurmarkupsafe.Markup. ↩ ↩2 ↩3 ↩4 -
Guides tiers (Octura Solutions, Cybrosys) affirmant que
t-escdéclenche une erreur en Owl 3 / Odoo 19 et recommandant l'utilitairemarkup()côté JavaScript. Affirmation non confirmée par la documentation officielle au moment de la rédaction. ↩ ↩2