1. Retrouvez les données déjà présentes
Ouvrez Notes de formation → Notes dans votre base d’exercice. Repérez deux ou trois titres créés au Jour 2. Ce sont ces mêmes enregistrements que la route doit maintenant renvoyer.
Le contrôleur ne va pas écrire une requête SQL. Il passe par le modèle training.note, afin de conserver les noms de champs et le comportement définis dans Odoo. L’ORM se charge ensuite de lire les lignes correspondantes dans PostgreSQL.
2. Remplacez les valeurs fixes par une lecture ORM
Dans controllers/notes_api.py, remplacez tout le contenu du fichier par cette version.
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):
notes = request.env["training.note"].sudo().search_read(
fields=["id", "title", "body"],
order="id desc",
limit=20,
)
for note in notes:
note["body"] = note["body"] or ""
return request.make_json_response({
"notes": notes,
"count": len(notes),
})3. Suivez l’appel ligne par ligne
request.env["training.note"]ouvre le modèle créé au Jour 2.requestreprésente la requête HTTP en cours. Sonenv, pour environment, réunit la base utilisée, l’utilisateur courant, son contexte et l’accès à l’ORM.- Les crochets choisissent le modèle par son nom technique. Cette expression renvoie un recordset vide lié à
training.note: ce n’est pas encore une note, mais le point de départ sur lequelsearch_read()va chercher des records. sudo()fait fonctionner ce recordset sans appliquer les droits de l’utilisateur public. Il est nécessaire ici parce que la route est encore anonyme ; il sert uniquement à cette démonstration locale et disparaîtra dès la route Bearer de la section 3.
search_read()demande à l’ORM de chercher les enregistrements et de lire leurs valeurs en une seule opération.fieldslimite la réponse àid,titleetbody. Le client ne reçoit aucun autre champ du modèle.order="id desc"place les notes les plus récentes en premier.limit=20évite qu’un simple appel renvoie une liste sans limite.request.make_json_response()transforme la liste de dictionnaires produite par l’ORM en une réponse JSON.
Un champ Text vide peut être lu sous la forme false par l’ORM. La petite boucle le remplace par une chaîne vide pour que body garde toujours le même type dans la réponse.
4. Redémarrez et observez les vraies notes
Action qui redémarre Odoo : arrêtez puis relancez votre processus Odoo. Attendez que les journaux indiquent que le serveur est prêt.
Ouvrez ensuite http://127.0.0.1:8069/training/api/notes. Les titres doivent maintenant correspondre aux notes visibles dans Notes de formation → Notes. Les identifiants et le nombre obtenu dépendent de votre base.
{
"notes": [
{
"id": 12,
"title": "Observer avant de modifier",
"body": "La même note vient maintenant de l’ORM."
}
],
"count": 1
}La route est encore anonyme. L’utilisateur public ne possède pas les droits du groupe interne configuré au Jour 2 ; sudo() contourne donc provisoirement ces contrôles pour rendre l’aller-retour visible. Ne déployez pas cette version. La section 3 remplacera auth="public" par auth="bearer" et supprimera sudo() afin que l’ORM applique les droits de l’utilisateur authentifié.
Point de contrôle — reliez la réponse au modèle
Choisissez un titre dans la réponse JSON, retrouvez-le dans la liste Odoo et vérifiez que chaque objet expose seulement id, title et body.