1. Choisissez la bonne actualisation
Pour la modification de cette étape : redémarrez le serveur (ou laissez l'auto-redémarrage agir), mettez le module à niveau pour importer le XML et enregistrer les déclarations modifiées, puis rechargez complètement le navigateur.
Choisissez l'opération en fonction du fichier que vous venez de modifier :
- Manifeste : après une modification de
__manifest__.py, le processus Odoo doit relire ce fichier. Dans le fonctionnement local de ce cours, redémarrez le serveur. Avec--dev=reload, Odoo redémarre automatiquement le processus, car le manifeste est un fichier Python. - XML de données : mettez le module à niveau depuis Applications. Odoo importe alors
views/hello_world_menus.xmlet crée ou met à jour les enregistrements dans la base. Un simple rechargement du navigateur ne suffit pas. - Déclaration d'assets : les assets sont les fichiers utilisés par l'interface, comme JavaScript et les templates XML. La relecture du manifeste fournit leurs chemins dans
web.assets_backend. Quand l'ensemble de fichiers est construit, Odoo lit ces chemins. Ici, la mise à niveau est nécessaire parce quedependsetdataont changé. Rechargez ensuite la page pour que le navigateur demande l'ensemble actualisé. - JavaScript ou XML de l'interface déjà déclaré : avec
?debug=assetset, lorsque cela s'applique aux templates XML,--dev=xml, enregistrez votre modification puis rechargez complètement la page. Vous n'avez alors besoin ni de redémarrer le serveur ni de mettre le module à niveau. En mode normal, les ensembles de fichiers peuvent être conservés dans le cache ; vous devrez parfois vider ce cache ou redémarrer selon votre environnement pour forcer leur régénération.
Odoo ne fonctionne donc pas comme un serveur Angular avec rechargement automatique de l'interface. Une modification de l'interface ne redémarre pas tout le serveur, mais le navigateur doit tout de même être rechargé. Dans Odoo 19, ?debug=assets affiche les assets non minifiés et leurs cartes source, qui relient le code exécuté à vos fichiers, pour faciliter le diagnostic. Avec --dev=xml, lorsque votre méthode de développement concerne des templates XML relus depuis les fichiers, vous pouvez aussi éviter une nouvelle lecture depuis la base. L'option serveur --dev=reload concerne les fichiers Python et le manifeste, pas le rechargement du navigateur.
À observer : vous savez désormais si votre changement demande une relecture du manifeste, une mise à niveau du module, un simple rechargement du navigateur ou aucune action côté serveur.
2. Activez le mode développeur
Dans Odoo, ouvrez Paramètres, faites défiler la page jusqu'aux outils de développement, puis cliquez sur Activer le mode développeur. Si cette option n'est pas visible, ajoutez ?debug=1 à l'adresse après vous être connecté.
3. Mettez le module à niveau
Ouvrez Applications, retirez au besoin le filtre Applications, puis recherchez Hello Odoo. Ouvrez sa fiche et choisissez Mettre à niveau.
Cette opération est différente d'un simple rechargement du navigateur : elle charge views/hello_world_menus.xml dans la base. Odoo relit aussi les chemins d'assets du manifeste pour construire l'ensemble de fichiers. Ici, la mise à niveau est nécessaire parce que depends et data ont changé.
À observer : la mise à niveau se termine sans erreur dans l'interface ni traceback dans les logs de votre environnement.
4. Retrouvez la nouvelle application
Revenez à l'accueil ou ouvrez le sélecteur d'applications. Une nouvelle entrée Hello Odoo doit apparaître. La section 1 a confirmé l'installation ; ce nouveau résultat montre que le menu racine et la client action sont bien chargés.
Ouvrez cette entrée. L'écran affiche le titre Hello Odoo, une courte phrase et le bouton Well, hello Odoo. Ce libellé anglais est celui défini par l'exemple ; gardez-le pour comparer votre écran au résultat attendu.
5. Faites parler le bouton
Cliquez sur Well, hello Odoo. Une notification verte doit apparaître avec le texte Welcome to Odoo. Ce message est une sortie attendue du code fourni ; gardez-le tel quel pendant la vérification.
Le module apparaît sur l'accueil, son action ouvre notre composant, le template affiche le bouton et le service de notification produit la réponse attendue.
Si Odoo refuse de coopérer
Le module n'apparaît pas dans Applications
Vérifiez le dossier custom_addons/training_hello, le nom Hello Odoo dans le manifeste et "application": True. Si vous venez de modifier le manifeste ou d'ajouter le module, faites-le relire par Odoo, puis actualisez la liste des applications.
Odoo ne trouve pas l'action côté client
Dans les deux emplacements suivants, la valeur attendue est training_hello.hello_world :
- Chemin :
static/src/hello_world/— fichier :hello_world.js— expression : premier argument deregistry.category("actions").add()— valeur attendue :training_hello.hello_world. - Chemin :
views/— fichier :hello_world_menus.xml— propriété : contenu de<field name="tag">— valeur attendue :training_hello.hello_world.
L'écran reste vide ou le bouton n'apparaît pas
Dans les deux emplacements suivants, la valeur attendue est training_hello.HelloWorld :
- Chemin :
static/src/hello_world/— fichier :hello_world.js— propriété :static template— valeur attendue :training_hello.HelloWorld. - Chemin :
static/src/hello_world/— fichier :hello_world.xml— propriété :t-name— valeur attendue :training_hello.HelloWorld.
Vérifiez ensuite le chargement des deux fichiers :
- Chemin : racine du module — fichier :
__manifest__.py— propriété : une entrée deassets → web.assets_backend— valeur attendue :training_hello/static/src/hello_world/hello_world.js. - Chemin : racine du module — fichier :
__manifest__.py— propriété : une entrée deassets → web.assets_backend— valeur attendue :training_hello/static/src/hello_world/hello_world.xml.
Une fois ces valeurs corrigées, rechargez complètement la page.
Une erreur XML apparaît
Vérifiez les balises fermantes et les guillemets dans les deux fichiers XML. Regardez aussi les logs de votre environnement : la première erreur donne généralement le fichier et la ligne utiles.
Expériences facultatives pour comprendre les bindings
Notez la valeur d'origine avant chaque modification. Observez le résultat, même lorsque vous provoquez volontairement une erreur, puis restaurez la valeur et vérifiez que l'application fonctionne de nouveau. Vous identifierez ainsi précisément l'effet de chaque modification.
- Utilisez l'identifiant externe complet de l'action. Dans
views/hello_world_menus.xml, remplacezaction="training_hello_action"paraction="training_hello.training_hello_action", puis mettez le module à niveau. L'application doit encore s'ouvrir : dans un fichier du même module, Odoo accepte la forme courte et ajoute implicitement le préfixetraining_hello.. - Rompez volontairement le lien entre le menu et l'action. Dans ce même attribut
action, écrivez temporairementtraining_hello.training_hello_action_inconnue, puis tentez une mise à niveau. Odoo doit signaler que l'identifiant externe est introuvable et annuler la modification dans la base. Restaurez ensuite l'identifiant correct. - Distinguez l'identifiant technique du nom visible. Dans le bloc
record, changez seulement<field name="name">Hello Odoo</field>, sans toucher àid="training_hello_action". Après la mise à niveau, l'identité technique de l'action reste la même ; seul son libellé destiné aux humains change. - Renommez l'entrée visible de l'application. Dans le bloc
menuitem, remplacez temporairementname="Hello Odoo"par un autre libellé, puis mettez le module à niveau. Le nouveau texte doit apparaître dans le menu des applications sans modifier l'action ouverte. - Changez l'ordre de l'application. Dans
menuitem, essayezsequence="1", puissequence="100", en mettant le module à niveau après chaque changement. Observez la position de l'application parmi les autres entrées : plus la valeur est petite, plus l'entrée est prioritaire. - Rompez le lien entre l'action XML et JavaScript. Dans
views/hello_world_menus.xml, changez seulement la valeur du champtag, mettez le module à niveau, puis ouvrez l'application. Odoo trouve bien le menu et l'action, mais le client web ne trouve plus le composant enregistré sous ce nom. Restaurez la valeur avant de continuer. - Renommez correctement l'action côté client. Choisissez un nouveau nom et appliquez-le aux deux emplacements suivants, puis mettez le module à niveau et rechargez complètement la page :
- Chemin :
views/— fichier :hello_world_menus.xml— propriété : contenu de<field name="tag">— valeur attendue : votre nouveau nom. - Chemin :
static/src/hello_world/— fichier :hello_world.js— expression : premier argument deregistry.category("actions").add()— valeur attendue : le même nouveau nom.
- Chemin :
- Rompez le binding entre le composant et son template. Dans
hello_world.js, changez seulementstatic template, puis rechargez complètement la page. Le composant est trouvé, mais OWL ne trouve plus le template demandé. Restaurez la valeur et rechargez la page avant de poursuivre. - Renommez correctement le template. Utilisez un nouveau nom identique aux deux emplacements suivants, puis rechargez complètement la page :
- Chemin :
static/src/hello_world/— fichier :hello_world.js— propriété :static template— valeur attendue : votre nouveau nom. - Chemin :
static/src/hello_world/— fichier :hello_world.xml— propriété :t-name— valeur attendue : le même nouveau nom.
- Chemin :
- Comparez rechargement et mise à niveau. Changez d'abord le texte du bouton dans
hello_world.xmlet celui de la notification danshello_world.js, puis rechargez la page : ces fichiers d'interface ne créent aucun enregistrement dans la base. Changez ensuite le nom dumenuitemdanshello_world_menus.xml: un simple rechargement ne suffit pas, car ce XML alimente la base. Mettez le module à niveau pour voir le nouveau nom.
La suite : les données du module
La section 3 vous fera passer de l'interface aux enregistrements chargés par le module, puis au boilerplate, c'est-à-dire au code de départ généré.
Références officielles, en complément
Après le parcours, vous pouvez comparer vos choix avec les tutoriels développeur officiels d'Odoo 19, le tutoriel « Découvrir le framework web » et le dépôt odoo/tutorials, branche 19.0. Ces ressources sont complémentaires : ne copiez pas leurs extraits sans vérifier leurs dépendances.