Étape 2 sur 4

Créer le squelette

Odoo va créer l'organisation standard d'un module nommé training_hello. Nous ne garderons que les éléments utiles à notre premier résultat.

1. Choisissez votre environnement et créez la structure

Scaffold est le terme technique qu'Odoo utilise pour cette génération : la commande crée les dossiers et les fichiers de départ. training_hello est le nom technique du module ; le dernier argument indique l'emplacement où le créer.

Choisissez une seule des deux options ci-dessous. Sur un hôte Linux où Odoo est installé depuis les sources, une commande abrégée comme odoo-bin peut fonctionner, car le fichier et son environnement Python sont accessibles sur l'hôte. Avec Docker, l'exécutable odoo et son environnement Python se trouvent dans le conteneur : une commande odoo-bin lancée directement sur votre Mac ne peut donc pas les trouver.

Option A — Odoo est installé depuis les sources

Placez-vous à la racine du workspace préparé pendant la formation d'installation, puis utilisez la commande adaptée à votre système.

Linux/macOS · racine du workspace
.venv/bin/python src/odoo/odoo-bin scaffold training_hello custom_addons
PowerShell · racine du workspace
.\.venv\Scripts\python.exe .\src\odoo\odoo-bin scaffold training_hello .\custom_addons

À observer : Odoo crée custom_addons/training_hello/ directement dans votre workspace.

Option B — Odoo fonctionne avec Docker Compose

Placez-vous dans le dossier qui contient le fichier Compose, puis exécutez la commande dans le service Odoo.

Docker Compose · dossier du fichier Compose
docker compose exec odoo odoo scaffold training_hello /mnt/extra-addons

Le premier odoo désigne le service Compose : remplacez-le uniquement si votre service porte un autre nom. Le second odoo est l'exécutable fourni par l'image officielle.

Dans le conteneur, /mnt/extra-addons doit correspondre au bind mount inscriptible qui relie votre dossier d'addons local. Le résultat apparaît donc dans le dossier source monté à cet endroit, par exemple custom_addons/training_hello/ ou addons/training_hello/ sur votre machine.

Docker Compose · vérification sans modification
docker compose exec odoo ls -ld /mnt/extra-addons/training_hello

À observer : le dossier existe sous /mnt/extra-addons/training_hello dans le conteneur et dans le dossier source correspondant sur votre machine.

Avant de relancer la commande

Si training_hello/ existe déjà, ne relancez pas le scaffold : ouvrez le dossier existant. Avec Docker, une erreur de permission signifie que le bind mount n'est pas inscriptible. Corrigez la préparation de l'environnement ; n'utilisez pas sudo ou chmod sans savoir exactement pourquoi.

Dans les deux cas, scaffold ne se connecte pas à la base de données et n'installe pas le module. Il crée seulement des fichiers.

2. Observez le résultat

Dans l'explorateur de fichiers de votre éditeur, ouvrez le dossier créé sur votre machine : custom_addons/training_hello/ avec l'installation depuis les sources, ou le dossier hôte monté vers /mnt/extra-addons avec Docker. Le nom technique reste en minuscules, sans espace ni accent : les commandes et les autres modules reprendront ce nom tel quel.

  • __manifest__.py présente le module à Odoo ;
  • __init__.py signale qu'il s'agit d'un package Python et importe ses subpackages ;
  • models/ accueillera les objets métier écrits en Python ;
  • controllers/ accueillera des routes web si le module en a besoin ;
  • views/ contient des exemples d'interfaces XML ;
  • security/ et demo/ préparent les règles d'accès et les données d'exemple.

À observer : le dossier existe bien sur le disque. Rien n'a encore changé dans Odoo : la création de fichiers ne les installe pas dans la base.

Pour qu'Odoo le reconnaisse : le dossier doit se trouver dans un répertoire déclaré dans addons_path et contenir un fichier __manifest__.py valide. L'action « Mettre à jour la liste des applications » parcourt ces répertoires et recense le module dans la base ; l'installation chargera ensuite son contenu.

3. Ne décommentez pas tout par réflexe

Le scaffold présente plusieurs possibilités, mais un module n'a pas besoin de toutes les utiliser. Pour ce premier module, nous allons rédiger un manifeste minimal et laisser les exemples inactifs.

Nous reparlerons de views/views.xml et views/templates.xml dans la section 3, consacrée au boilerplate et aux données. Vous choisirez alors ce qu'il est utile de conserver.

Le bon réflexe

Avant de modifier un fichier généré, demandez-vous quel rôle il joue et si le résultat visé en a réellement besoin.