Étape 1 sur 2 · environ 20 min

Donnez un premier accès local aux notes

Une autre interface doit pouvoir lire quelques notes du cours sans connaître les écrans internes d’Odoo. Commencez par une réponse courte et fixe : vous verrez tout de suite le résultat obtenu.

1. Partez du besoin

Imaginez un petit tableau de bord utilisé sur votre machine. Il doit afficher deux notes de formation. Il ne doit pas ouvrir l’interface d’administration ni connaître la table PostgreSQL. Il demande simplement les notes à Odoo à l’adresse locale /training/api/notes.

Pour ce premier essai, Odoo renverra deux notes écrites directement dans le contrôleur. Cette étape permet de vérifier le passage entre une autre interface et Odoo sans interroger le modèle.

Premier échange à obtenir
Autre interface
    │
    │  /training/api/notes
    ▼
Odoo
    │
    │  deux notes et leur nombre
    ▼
Autre interface

2. Créez le contrôleur

Dans le module training_hello, créez le fichier controllers/notes_api.py avec le contenu complet suivant.

custom_addons/training_hello/controllers/notes_api.py
from odoo import http
from odoo.http import request


class TrainingNotesApiController(http.Controller):
    @http.route(
        "/training/api/notes",
        type="http",
        auth="public",
        methods=["GET"],
    )
    def list_notes(self):
        payload = {
            "notes": [
                {
                    "id": 1,
                    "title": "Bienvenue",
                    "body": "Découvrez les notes depuis une API locale.",
                },
                {
                    "id": 2,
                    "title": "À tester",
                    "body": "Appelez cette route avec cURL.",
                },
            ],
            "count": 2,
        }
        return request.make_json_response(payload)

Gardez cette version volontairement petite. Elle ne contient ni request.env, ni recherche ORM, ni sudo(). Les deux notes sont des données de démonstration locales, pas des données de production.

auth="public" permet ici d’appeler l’adresse sans ouvrir une session utilisateur. Cette première version est donc anonyme. Vous étudierez la protection de ce point d’accès plus tard dans la journée.

3. Importez le nouveau fichier

Créer le fichier ne suffit pas : Python doit aussi le charger. Dans controllers/__init__.py, conservez les imports déjà présents et ajoutez la ligne suivante.

custom_addons/training_hello/controllers/__init__.py · ligne à ajouter
from . import notes_api

Le fichier __init__.py à la racine de training_hello importe déjà le dossier controllers. Gardez cette ligne existante ; n’en ajoutez pas une seconde.

4. Redémarrez Odoo et observez la réponse

Action qui redémarre Odoo : arrêtez puis relancez votre processus Odoo selon la méthode habituelle de votre environnement. Attendez que les journaux indiquent que le serveur est de nouveau prêt. Une simple actualisation du navigateur ne suffit pas, car vous avez ajouté un fichier Python et un import.

Vous n’avez modifié ni champ, ni fichier XML, ni manifeste. Il n’est donc pas nécessaire de mettre le module à niveau pour cette étape : le redémarrage suffit.

Ouvrez ensuite http://127.0.0.1:8069/training/api/notes dans votre navigateur. La section 2 vous montrera comment appeler la même adresse depuis un terminal avec cURL.

Le corps de la réponse doit contenir exactement ces valeurs. Les espaces et les retours à la ligne peuvent différer selon l’outil qui l’affiche.

Réponse attendue
{
  "notes": [
    {
      "id": 1,
      "title": "Bienvenue",
      "body": "Découvrez les notes depuis une API locale."
    },
    {
      "id": 2,
      "title": "À tester",
      "body": "Appelez cette route avec cURL."
    }
  ],
  "count": 2
}
Point de contrôle — vérifiez la réponse

Après le redémarrage, vérifiez concrètement que la réponse contient deux objets dans notes, que count vaut 2 et que chaque objet contient uniquement id, title et body.