1. Donnez les formations au template
Remplacez le contrôleur par cette version. La première route lit toutes les formations auxquelles l’utilisateur a accès. La seconde cherche une formation précise lorsque son identifiant apparaît dans l’adresse. Les deux recherches passent par l’ORM avec les droits de la personne connectée : il n’y a pas de sudo().
from werkzeug.exceptions import NotFound
from odoo import http
from odoo.http import request
class ElearningPortalController(http.Controller):
@http.route("/formations", type="http", auth="user", website=True, methods=["GET"])
def formations_page(self):
modules = request.env["elearning.module"].search([])
return request.render("elearning_portal.formations_page", {"modules": modules})
@http.route(
"/formations/<int:module_id>",
type="http",
auth="user",
website=True,
methods=["GET"],
)
def formation_detail_page(self, module_id):
module = request.env["elearning.module"].search([("id", "=", module_id)], limit=1)
if not module:
raise NotFound()
return request.render("elearning_portal.formation_detail_page", {"module": module})Dans formations_page, modules contient les formations existantes. Dans formation_detail_page, module désigne la formation choisie. Si l’utilisateur ne peut pas la lire, Odoo ne l’envoie pas au template.
2. Affichez les cartes et la fiche choisie
Remplacez le fichier entier par cette version. La première partie crée une carte pour chaque formation. Le lien de la carte ouvre /formations/<id>. La seconde partie affiche le titre, la description et les notes de la formation choisie.
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<template id="formations_page" name="Liste des formations">
<t t-call="website.layout">
<div id="wrap" class="oe_structure">
<main class="container py-5">
<header class="mb-4">
<h1>Formations à découvrir</h1>
<p>Choisissez une formation pour voir son contenu.</p>
</header>
<div class="row g-3">
<article t-foreach="modules" t-as="module" class="col-12 col-md-6">
<div class="h-100 p-3 border rounded">
<h2 class="h4" t-out="module.name"/>
<p t-if="module.description" t-out="module.description"/>
<a class="btn btn-outline-primary"
t-attf-href="/formations/{{ module.id }}">
Voir cette formation
</a>
</div>
</article>
</div>
</main>
</div>
</t>
</template>
<template id="formation_detail_page" name="Détail d’une formation">
<t t-call="website.layout">
<div id="wrap" class="oe_structure">
<main class="container py-5">
<p><a href="/formations">← Toutes les formations</a></p>
<h1 t-out="module.name"/>
<p t-if="module.description" t-out="module.description"/>
<section class="mt-5" aria-labelledby="notes-title">
<h2 id="notes-title">Notes associées</h2>
<p t-if="not module.note_ids">Aucune note n’est associée à cette formation.</p>
<article t-foreach="module.note_ids" t-as="note" class="mb-3 p-3 border rounded">
<h3 class="h5" t-out="note.title"/>
<p t-if="note.category_id" class="text-muted" t-out="note.category_id.name"/>
<p t-if="note.body" t-out="note.body"/>
</article>
</section>
</main>
</div>
</t>
</template>
</odoo>t-foreach="modules" répète une carte pour chaque formation lue par le contrôleur. La page de détail utilise ensuite module.note_ids : elle suit la relation Many2many créée en section 1 et affiche les notes déjà liées à cette formation.
3. Vérifiez le parcours complet
- Redémarrez Odoo, puis mettez
elearning_portalà niveau. - Ouvrez
/formations. Vous devez voir les formations créées dans la base, pas des exemples écrits dans le template. - Cliquez sur une carte. Vérifiez que la fiche affiche le nom, la description et les notes de la formation choisie.
- Ouvrez une autre carte : son contenu doit être différent lorsque ses notes associées sont différentes.
- Testez au clavier avec Tab et sur une largeur étroite. Les liens et les cartes doivent rester utilisables.
Résultat attendu : vous partez d’un record elearning.module créé dans le back-office, vous le retrouvez dans la liste Website, puis vous ouvrez sa fiche et les notes qui lui sont liées. La page reste réservée aux utilisateurs connectés ayant les droits de lecture ; elle ne rend rien public.
Votre page Website utilise maintenant les données réelles de l’addon : la liste vient de elearning.module et la fiche montre les notes de la formation sélectionnée.