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

Odoo 19 : vos t-esc survivent, vos t-raw sont à réécrire

Plusieurs guides annoncent que t-esc casse les templates en Odoo 19. La documentation officielle dit l'inverse : t-esc reste un alias de t-out, et c'est t-raw, déprécié depuis la 15.0, qui demande vraiment une réécriture. Comment prioriser votre migration QWeb sans perdre de temps.

Odoo 19QWebt-outmigrationdéveloppement

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.

DirectiveStatut en Odoo 19Action
t-rawDépréciée depuis la 15.0À réécrire en priorité
t-escAlias, pas formellement dépréciéStandardiser quand c'est pratique
t-outDirective recommandéeRien à 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

Footnotes

  1. Documentation officielle Odoo 19.0, référence QWeb Templates : la directive out échappe le HTML automatiquement ; esc en est un alias « pas encore formellement déprécié » ; raw n'échappe jamais son contenu et est dépréciée depuis la 15.0, au profit de out avec une valeur markupsafe.Markup. ↩ ↩2 ↩3 ↩4

  2. Guides tiers (Octura Solutions, Cybrosys) affirmant que t-esc déclenche une erreur en Owl 3 / Odoo 19 et recommandant l'utilitaire markup() côté JavaScript. Affirmation non confirmée par la documentation officielle au moment de la rédaction. ↩ ↩2

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.