Starter 4 — Suivi pédagogique¶
Starter Forge · Niveau 4
Application Suivi pédagogique
Vitrine Forge complète : authentification, routes protégées, plusieurs entités, relations SQL visibles, dashboard et seed de démonstration.
-
Objectif
Démontrer Forge sur une mini-application métier avec authentification, relations et vues de synthèse.
-
Niveau
Application vitrine. Plusieurs entités, deux relations
many_to_one, CSRF actif. -
Temps estimé
2 h à 3 h en suivant le guide.
-
Résultat attendu
Dashboard, gestion d'élèves, de cours et d'observations, données persistées dans MariaDB.
Ce que ce starter doit faire comprendre
Le starter 4 est une vitrine technique de Forge. Il ne vise pas à être un logiciel de suivi scolaire complet. Il vise à montrer comment Forge gère authentification, routes protégées, plusieurs entités et relations SQL dans une application cohérente et maîtrisée.
Génération automatique disponible
Ce starter est générable avec forge starter:build 4, forge starter:build suivi ou forge starter:build suivi-comportement-eleves. Voir la section Génération du starter pour les détails.
Prérequis¶
Prérequis généraux¶
- Python 3.11 ou supérieur
- Git
pipx(recommandé) ou environnement virtuel Python- MariaDB installé et démarré
- Accès à un compte administrateur MariaDB (pour
forge db:init) - Fichier
env/devconfiguré avec les identifiants MariaDB
Prérequis spécifiques au starter¶
- Starters 1 à 3 compris, ou expérience équivalente avec Forge
- Projet Forge vierge
- Authentification Forge : sessions (
core.security.session), hachage (core.security.hashing), CSRF actif - Support des routes protégées et des relations
many_to_one - Scripts
scripts/create_auth_user.pyetscripts/seed_suivi.pyfournis automatiquement parforge starter:build 4
Partie 1 — Installer Forge sur une VM Debian vierge¶
Si Forge est déjà installé et configuré sur votre machine, passez directement à la Partie 2 — Construire l'application starter.
La procédure complète est documentée sur la page Installation sur VM Debian vierge.
Elle couvre en 7 étapes : mise à jour du système, dépendances Python/MariaDB, Node.js optionnel, configuration de pipx, démarrage de MariaDB, vérification de l'accès administrateur et installation de Forge via pipx.
Une fois que forge --version s'affiche correctement, revenez ici pour construire l'application.
Partie 2 — Construire l'application starter¶
1. Objectif du starter¶
Construire une application de suivi pédagogique minimaliste :
- un enseignant se connecte ;
- il consulte un dashboard de ses cours récents ;
- il gère une liste d'élèves ;
- il crée et consulte des cours ;
- il saisit des observations pour un élève lors d'un cours ;
- il consulte et corrige ses observations.
Le tout avec authentification, sessions, CSRF actif et routes protégées — comme dans une application Forge réelle.
2. Ce que ce starter démontre dans Forge¶
-
Authentification complète
Login, logout, session utilisateur, routes protégées par défaut.
-
CSRF actif
Protection CSRF sur tous les formulaires
POST— comportement par défaut Forge. -
Plusieurs entités
Trois entités indépendantes (
Eleve,Cours,ObservationCours) générées depuis leurs JSON canoniques. -
Relations SQL visibles
Deux relations
many_to_onedéclarées dansrelations.json, SQL visible dansrelations.sql. -
Dashboard
Vue d'accueil protégée après connexion, point d'entrée de l'application.
-
Seed de démonstration
scripts/seed_suivi.pypeuple la base avec des données réalistes pour tester immédiatement. -
Séparation généré / applicatif
Entités générées par Forge, contrôleurs et vues métier écrits à la main — la frontière est explicite.
-
Templates Jinja structurés
Héritage de layout, inclusion partielle, conditions sur les données liées.
Flux de navigation¶
flowchart TD
A([Navigateur]) -->|"POST /login"| B[AuthController]
B --> C["/suivi — Dashboard"]
C --> D["/eleves"]
C --> E["/cours"]
E --> F["/observations/new"]
F --> G["ObservationCoursController"]
G --> H[(MariaDB)]
H --> I["/observations/{id}"]
3. Installation du framework¶
Les deux méthodes produisent le même résultat : un projet Forge local avec forge disponible.
Si vous avez suivi la Partie 1
forge est déjà installé via pipx install forge-mvc. Dans l'onglet "Installation automatique" ci-dessous, ignorez la ligne pipx install ... et commencez directement par forge new SuiviApp.
4. Génération du starter¶
Depuis un projet Forge vierge, après configuration de env/dev :
Alias équivalents :
Pour prévisualiser sans écrire :
Pour initialiser la base et construire le starter en une seule commande :
Le flux manuel équivalent reste :
# Créer les entités
forge make:entity Eleve --no-input
forge make:entity Cours --no-input
forge make:entity ObservationCours --no-input
# Remplacer les trois JSON par les modèles de la section 9
# Puis générer et appliquer
forge check:model
forge build:model
forge db:apply
# Générer les CRUD de base
forge make:crud Eleve
forge make:crud Cours
# Copier les fichiers applicatifs manuels (contrôleurs, vues métier, routes)
# Voir rebuild.md pour le détail complet
5. Initialisation de la base¶
Configurer env/dev avec les identifiants MariaDB, puis :
Compte administrateur MariaDB
La procédure utilise root avec mot de passe. Pour un environnement plus sécurisé, remplacer root par un compte dédié, par exemple forge_admin.
DB_ADMIN_LOGIN crée la base et l'utilisateur applicatif. DB_APP_LOGIN est utilisé ensuite par l'application.
Avant de continuer
Vérifier que MariaDB est démarré et que DB_ADMIN_LOGIN, DB_ADMIN_PWD, DB_APP_LOGIN, DB_APP_PWD et DB_NAME sont renseignés dans env/dev.
6. Création de l'utilisateur de test¶
Ce script crée un compte de test avec les identifiants affichés dans le terminal.
7. Seed de démonstration¶
Le script insère de manière idempotente des élèves, des cours et quelques observations de démonstration. Il peut être relancé sans risque sur une base déjà peuplée.
8. Routes disponibles¶
| Méthode | Route | Rôle |
|---|---|---|
GET |
/login |
Formulaire de connexion |
POST |
/login |
Authentification |
POST |
/logout |
Déconnexion |
GET |
/suivi |
Dashboard (protégé) |
GET |
/eleves |
Liste des élèves |
GET |
/eleves/{id} |
Fiche élève |
GET |
/cours |
Liste des cours |
GET |
/cours/{id} |
Détail d'un cours |
GET |
/observations/new |
Formulaire de saisie |
POST |
/observations |
Enregistrement |
GET |
/observations/{id} |
Détail d'une observation |
GET |
/observations/{id}/edit |
Modification |
POST |
/observations/{id} |
Mise à jour |
Toutes les routes hors /login sont protégées par défaut — comportement standard Forge.
9. Modèle de données¶
Eleve¶
{
"format_version": 1,
"entity": "Eleve",
"table": "eleve",
"fields": [
{ "name": "id", "sql_type": "INT", "primary_key": true, "auto_increment": true },
{ "name": "nom", "sql_type": "VARCHAR(80)", "constraints": { "not_empty": true, "max_length": 80 } },
{ "name": "prenom", "sql_type": "VARCHAR(80)", "constraints": { "not_empty": true, "max_length": 80 } },
{ "name": "classe", "sql_type": "VARCHAR(40)", "constraints": { "not_empty": true, "max_length": 40 } },
{ "name": "actif", "sql_type": "BOOLEAN" }
]
}
Cours¶
{
"format_version": 1,
"entity": "Cours",
"table": "cours",
"fields": [
{ "name": "id", "sql_type": "INT", "primary_key": true, "auto_increment": true },
{ "name": "date_cours", "sql_type": "DATE" },
{ "name": "titre", "sql_type": "VARCHAR(120)", "constraints": { "not_empty": true, "max_length": 120 } },
{ "name": "classe", "sql_type": "VARCHAR(40)", "constraints": { "not_empty": true, "max_length": 40 } }
]
}
ObservationCours¶
{
"format_version": 1,
"entity": "ObservationCours",
"table": "observation_cours",
"fields": [
{ "name": "id", "sql_type": "INT", "primary_key": true, "auto_increment": true },
{ "name": "eleve_id", "sql_type": "INT" },
{ "name": "cours_id", "sql_type": "INT" },
{ "name": "ne_travaille_pas","sql_type": "BOOLEAN" },
{ "name": "bavarde", "sql_type": "BOOLEAN" },
{ "name": "dort", "sql_type": "BOOLEAN" },
{ "name": "telephone", "sql_type": "BOOLEAN" },
{ "name": "perturbe", "sql_type": "BOOLEAN" },
{ "name": "refuse_consigne", "sql_type": "BOOLEAN" },
{ "name": "remarque", "sql_type": "TEXT", "nullable": true }
]
}
Les booléens correspondent directement aux cases à cocher — pas de table de types intermédiaire. C'est un choix pédagogique délibéré pour garder le SQL lisible.
10. Relations SQL¶
flowchart LR
OC["ObservationCours"]
E["Eleve"]
C["Cours"]
OC -->|"eleve_id → id<br/>ON DELETE CASCADE"| E
OC -->|"cours_id → id<br/>ON DELETE CASCADE"| C
Déclarées dans mvc/entities/relations.json :
| Relation | Type | De | Vers | FK |
|---|---|---|---|---|
observation_cours_eleve |
many_to_one |
ObservationCours.eleve_id |
Eleve.id |
fk_observation_cours_eleve |
observation_cours_cours |
many_to_one |
ObservationCours.cours_id |
Cours.id |
fk_observation_cours_cours |
Le SQL généré dans mvc/entities/relations.sql est visible et modifiable directement.
11. Limites assumées¶
Ce starter n'inclut pas, volontairement :
- statistiques par période (trimestre, semaine, mois) ;
- rapports ou exports PDF ;
- système de sanctions ou de points ;
- gestion multi-enseignants ;
- import CSV d'élèves ;
- rôles avancés ou permissions fines ;
- notifications.
Ces fonctionnalités font partie d'une application réelle à construire à partir de ce starter — elles ne sont pas dans le périmètre de la vitrine.
12. Starter 4 et application Suivi Classe¶
Le starter 4 est une vitrine technique Forge. Il démontre que Forge permet de construire une application avec authentification, relations et formulaires métier en partant de JSON canoniques.
Une future application Suivi Classe pourrait être construite en partant du starter 4 et en y ajoutant :
- demi-classes et groupes ;
- rapports par période ;
- export et envoi par email ;
- rôles enseignant / direction ;
- suivi annuel par élève.
Le starter 4 n'est pas Suivi Classe. Il montre que Forge peut servir de base à ce type d'application.
Reconstruction¶
Le fichier de reconstruction pas à pas est disponible dans starters/04-suivi-comportement-eleves/rebuild.md.
Dépannage rapide¶
| Erreur | Cause probable | Correction |
|---|---|---|
forge: command not found |
pipx n'est pas dans le PATH |
pipx ensurepath puis exec $SHELL -l |
No module named venv |
python3-venv absent |
sudo apt install python3-venv |
mariadb_config not found |
dépendances MariaDB dev absentes | sudo apt install libmariadb-dev pkg-config |
Access denied for user 'root'@'localhost' |
mauvais mot de passe root ou root configuré en unix_socket |
vérifier le mot de passe, ou tester sudo mariadb |
mariadb: command not found |
client MariaDB absent | sudo apt install mariadb-client |
| erreur de compilation Python | outils de build absents | sudo apt install build-essential pkg-config libmariadb-dev |
| erreur certificat HTTPS | openssl absent |
sudo apt install openssl |