01
Introduction
Contexte et Objectifs
1.1 Contexte
EduTrack IA est une plateforme pédagogique intelligente destinée aux centres de cours de soutien scolaire au Maroc. Elle permet aux enseignants de suivre la progression des élèves du collège et du lycée et de communiquer automatiquement avec les parents grâce à l'intelligence artificielle.
Contexte Éducatif Marocain
Le projet cible les centres de cours de soutien au Maroc, qui accompagnent les élèves du secondaire dans leur parcours scolaire. Ces centres offrent un suivi personnalisé en complément de l'éducation nationale marocaine.
Le projet cible les centres de cours de soutien au Maroc, qui accompagnent les élèves du secondaire dans leur parcours scolaire. Ces centres offrent un suivi personnalisé en complément de l'éducation nationale marocaine.
1.1.1 Système Éducatif Cible
| Niveau | Classes | Âge Typique | Examen National |
|---|---|---|---|
| Collège | 1ère, 2ème, 3ème année | 12-15 ans | Brevet (3ème année) |
| Lycée | Tronc Commun, 1ère Bac, 2ème Bac | 15-18 ans | Baccalauréat (2ème Bac) |
1.1.2 Matières Enseignées (Cours de Soutien)
| Catégorie | Matières | Coefficient Bac |
|---|---|---|
| Sciences | Mathématiques, Physique-Chimie, SVT | 7-9 |
| Langues | Arabe, Français, Anglais | 2-4 |
| Humanités | Histoire-Géographie, Philosophie, Éducation Islamique | 2-3 |
| Techniques | Informatique, Sciences de l'Ingénieur | 3-5 |
1.1.3 Système de Notation
📊 Échelle de Notes
Notation0 à 20
Moyenne passage10/20
Mention TB≥ 16/20
Mention Bien≥ 14/20
Mention AB≥ 12/20
📅 Périodes Scolaires
Année scolaireSept → Juin
Semestre 1Sept → Janv
Semestre 2Fév → Juin
Examens régionauxJuin (1ère Bac)
BaccalauréatJuin (2ème Bac)
1.2 Problématique
Les centres de soutien scolaire font face à plusieurs défis structurels :
Défis identifiés
Suivi manuel chronophage — Les enseignants passent beaucoup de temps à analyser manuellement les résultats · Communication inefficace — Les parents ne sont pas informés régulièrement de la progression · Manque de visibilité — Difficile d'identifier rapidement les compétences à renforcer · Absence d'historique — Pas de suivi longitudinal de la progression.
1.3 Objectifs du Projet
| # | Objectif | Indicateur de Succès |
|---|---|---|
| O1 | Analyser automatiquement les résultats scolaires | Temps d'analyse réduit de 80% |
| O2 | Identifier les compétences maîtrisées / à renforcer | Précision classification > 75% |
| O3 | Suivre la progression temporelle des élèves | Graphiques de tendance disponibles |
| O4 | Générer des rapports automatiques pour les parents | Rapport généré en < 10 secondes |
1.4 Périmètre
✅ Inclus
- Gestion des données élèves, notes, compétences
- Analyse IA de la progression
- Génération de rapports personnalisés
- Envoi de notifications WhatsApp
- Dashboard enseignant et vue parent
❌ Exclus
- Gestion administrative (facturation, inscriptions)
- Application mobile native
- Intégration ENT / Pronote
02
Stakeholders
Analyse des Besoins
2.1 Parties Prenantes
| Acteur | Rôle | Besoins Principaux |
|---|---|---|
| 🧑🏫 Enseignant | Utilisateur principal | Saisir notes, voir progression, générer rapports |
| 👨👩👧 Parent | Destinataire des rapports | Consulter progression enfant, recevoir notifications |
| ⚙️ Administrateur | Gestionnaire du centre | Configurer le système, gérer les utilisateurs |
| 👧 Élève | Sujet du suivi (indirect) | Bénéficier d'un suivi personnalisé |
2.2 User Stories Principales
Enseignant
US-E1
En tant qu'enseignant, je veux enregistrer les notes d'une évaluation, afin de conserver un historique des résultats de chaque élève.
US-E2
En tant qu'enseignant, je veux voir un tableau de bord de ma classe, afin d'identifier rapidement les élèves en difficulté.
US-E3
En tant qu'enseignant, je veux ajouter des observations sur un élève, afin de compléter l'analyse quantitative par des remarques qualitatives.
US-E4
En tant qu'enseignant, je veux générer un rapport de progression en un clic, afin de gagner du temps sur la communication avec les parents.
US-E5
En tant qu'enseignant, je veux visualiser la progression d'un élève dans le temps, afin de mesurer l'efficacité de mon accompagnement.
Parent
US-P1
En tant que parent, je veux recevoir un rapport WhatsApp après chaque séance, afin d'être informé de la progression de mon enfant.
US-P2
En tant que parent, je veux accéder à un portail simplifié, afin de consulter l'historique des évaluations de mon enfant.
US-P3
En tant que parent, je veux voir un graphique radar des compétences, afin de comprendre les forces et faiblesses de mon enfant.
2.3 Exigences Non-Fonctionnelles
⚡ Performance
Temps de réponse API< 500ms
Génération rapport IA< 10s
Uptime99%
🏗️ Scalabilité & Sécurité
Élèves / centre500
Données personnellesRGPD
InterfaceResponsive
03
Fonctionnel
Spécifications Fonctionnelles
3.1 Module 1 — Gestion des Données Pédagogiques
3.1.1 Gestion des Élèves
| Ref | Fonctionnalité | Priorité |
|---|---|---|
| F1.1 | Créer un profil élève (nom, prénom, classe, date de naissance) | Haute |
| F1.2 | Modifier les informations d'un élève | Haute |
| F1.3 | Archiver un élève (soft delete) | Moyenne |
| F1.4 | Rechercher / filtrer les élèves par classe, nom | Haute |
| F1.5 | Importer des élèves depuis un fichier CSV | Moyenne |
GET/api/studentsListe des élèves (pagination)
GET/api/students/{id}Détail d'un élève
POST/api/studentsCréer un élève
PUT/api/students/{id}Modifier un élève
DEL/api/students/{id}Archiver un élève
POST/api/students/importImport CSV
3.1.2 Gestion des Compétences
| Ref | Fonctionnalité | Priorité |
|---|---|---|
| F1.6 | Créer une compétence (nom, matière, niveau) | Haute |
| F1.7 | Organiser les compétences par matière | Haute |
| F1.8 | Définir des niveaux de maîtrise (1-4 ou pourcentage) | Haute |
3.1.3 Gestion des Évaluations et Notes
Classification des niveaux
🟢 Maîtrisée — Note moyenne ≥ 14/20 ·
🟡 En cours — 10 ≤ note < 14 ·
🔴 À renforcer — Note < 10/20
| Ref | Fonctionnalité | Priorité |
|---|---|---|
| F1.9 | Enregistrer une note (0-20) avec date | Haute |
| F1.10 | Associer une note à une ou plusieurs compétences | Haute |
| F1.11 | Type d'évaluation (contrôle, test blanc, exercice) | Moyenne |
| F1.12 | Consulter l'historique des notes d'un élève | Haute |
3.1.4 Gestion des Observations Enseignants
| Ref | Fonctionnalité | Priorité |
|---|---|---|
| F1.13 | Ajouter une observation textuelle sur un élève | Haute |
| F1.14 | Associer une observation à une séance/date | Haute |
| F1.15 | Catégoriser les observations (comportement, progrès, difficulté) | Moyenne |
| F1.16 | Inclure les observations dans les rapports | Haute |
3.2 Module 2 — Analyse IA de la Progression
3.2.1 Classification des Compétences
| Ref | Fonctionnalité | Priorité |
|---|---|---|
| F2.1 | Classifier chaque compétence en 3 niveaux (Maîtrisée / En cours / À renforcer) | Haute |
| F2.2 | Afficher la classification par élève | Haute |
| F2.3 | Afficher la classification par classe (vue agrégée) | Moyenne |
GET/api/analytics/student/{id}/competenciesClassification compétences élève
GET/api/analytics/class/{id}/competenciesClassification compétences classe
3.2.2 Indicateurs de Progression Temporelle
| Ref | Fonctionnalité | Priorité |
|---|---|---|
| F2.4 | Calculer la tendance de progression (amélioration / stagnation / régression) | Haute |
| F2.5 | Calculer le score de progression (delta entre périodes) | Haute |
| F2.6 | Détecter les alertes de régression | Moyenne |
# Calcul de la tendance tendance = moyenne_période_récente - moyenne_période_précédente si tendance > +2 → "Amélioration" si tendance < -2 → "Régression" sinon → "Stagnation"
GET/api/analytics/student/{id}/progressionIndicateurs de progression
GET/api/analytics/student/{id}/trendTendance temporelle
GET/api/analytics/alertsÉlèves en régression
GET/api/analytics/student/{id}/radarDonnées radar (JSON)
GET/api/analytics/class/{id}/heatmapDonnées heatmap classe
3.2.3 Visualisations
| Ref | Fonctionnalité | Priorité |
|---|---|---|
| F2.7 | Graphique radar des compétences par élève (Recharts RadarChart) | Haute |
| F2.8 | Courbe de progression temporelle (Recharts LineChart) | Haute |
| F2.9 | Heatmap des compétences par classe | Moyenne |
| F2.10 | Export des graphiques en PNG | Basse |
GET/api/analytics/student/{id}/timelineDonnées courbe temporelle
3.3 Module 3 — Rapports et Communication Parents
3.3.1 Structure du Rapport Généré
📋 RAPPORT DE PROGRESSION – [Nom Élève] Date : [Date] · Enseignant : [Nom] 1. COMPÉTENCES TRAVAILLÉES - [Liste des compétences de la séance] 2. PROGRÈS RÉALISÉS - [Texte généré par IA sur les améliorations] 3. POINTS À AMÉLIORER - [Texte généré par IA sur les difficultés] 4. OBSERVATIONS DE L'ENSEIGNANT - [Observations saisies manuellement] 5. RECOMMANDATIONS - [Conseils générés par IA pour les parents]
| Ref | Fonctionnalité | Priorité |
|---|---|---|
| F3.1 | Générer un rapport texte personnalisé avec IA | Haute |
| F3.2 | Inclure les compétences travaillées | Haute |
| F3.3 | Inclure les progrès réalisés | Haute |
| F3.4 | Inclure les points à améliorer | Haute |
| F3.5 | Inclure les recommandations pédagogiques | Haute |
| F3.6 | Inclure les observations de l'enseignant | Haute |
| F3.7 | Générer le rapport en PDF | Moyenne |
| F3.8 | Générer le rapport en HTML | Moyenne |
POST/api/reports/generateGénérer rapport (retourne texte)
GET/api/reports/{id}Consulter un rapport généré
GET/api/reports/{id}/pdfTélécharger rapport PDF
GET/api/reports/student/{id}Historique rapports d'un élève
3.3.2 Communication WhatsApp
| Ref | Fonctionnalité | Priorité |
|---|---|---|
| F3.9 | Envoyer un rapport via WhatsApp | Haute |
| F3.10 | Configurer le numéro de téléphone du parent | Haute |
| F3.11 | Historique des envois WhatsApp | Moyenne |
| F3.12 | Gestion des erreurs d'envoi | Moyenne |
POST/api/reports/{id}/send-whatsappEnvoyer rapport via WhatsApp
GET/api/reports/{id}/whatsapp-historyHistorique des envois
3.3.3 Notifications In-App
| Ref | Fonctionnalité | Priorité |
|---|---|---|
| F3.13 | Afficher des alertes pour les élèves en difficulté | Moyenne |
| F3.14 | Configurer des seuils d'alerte personnalisés | Basse |
3.3.4 Génération Périodique Automatique NOUVEAU
Celery Beat — Les rapports mensuels et trimestriels sont déclenchés automatiquement sans intervention humaine. La génération à la demande (F3.1–F3.8) reste disponible.
| Ref | Fonctionnalité | Priorité |
|---|---|---|
| F3.15 | Générer et envoyer automatiquement un rapport mensuel (1er du mois à 08h00) | Haute |
| F3.16 | Générer et envoyer automatiquement un rapport trimestriel (1er jan / avr / juil / oct) | Haute |
| F3.17 | Mécanisme anti-spam : 1 rapport max par type par mois/trimestre par élève | Haute |
| F3.18 | Rapport trimestriel plus détaillé : synthèse 3 mois, comparaison des périodes | Haute |
POST/api/reports/scheduleConfigurer la fréquence (mensuel/trimestriel)
GET/api/reports/scheduleConsulter la configuration actuelle
Python — Celery Beat Schedule
CELERY_BEAT_SCHEDULE = {
'send-monthly-reports': {
'task': 'app.tasks.reports.send_monthly_reports',
'schedule': crontab(hour=8, minute=0, day_of_month=1),
},
'send-quarterly-reports': {
'task': 'app.tasks.reports.send_quarterly_reports',
'schedule': crontab(hour=8, minute=0, day_of_month=1, month_of_year='1,4,7,10'),
},
}
04
Stack
Spécifications Techniques
4.1 Stack Technologique
| Couche | Technologie | Version | Justification |
|---|---|---|---|
| Backend | Flask | 2.3+ | Léger, flexible, écosystème Python |
| BDD | PostgreSQL | 15+ | Robuste, requêtes complexes, JSON support |
| ORM | SQLAlchemy | 2.0+ | Migrations Alembic intégrées |
| ML | Scikit-learn | 1.3+ | Classification, métriques |
| Data | Pandas / NumPy | 2.x / 1.24+ | Manipulation & calculs vectorisés |
| NLP | Transformers | 4.35+ | Génération de texte (HuggingFace) |
| Viz | Matplotlib / Seaborn | 3.8+ / 0.13+ | Graphiques & heatmaps |
| Frontend | Next.js | 15+ | React 19, App Router, SSR/SSG |
| Frontend | React | 19+ | UI components, Hooks |
| UI Library | Tailwind CSS + shadcn/ui | 3.x / latest | Design system, composants accessibles |
| Charts | Recharts | 2.x | Graphiques React (RadarChart, LineChart...) |
| Démo IA | Gradio | 4.x | Interface interactive IA |
| Scheduler | Celery Beat | 5.x | Tâches périodiques (rapports mensuels/trimestriels) |
| WeasyPrint | 60+ | Génération PDF depuis HTML | |
| Notif. | Twilio / WhatsApp | 8.x | API WhatsApp Business |
4.2 Variables d'Environnement
| Variable | Description | Exemple |
|---|---|---|
DATABASE_URL | URL PostgreSQL | postgresql://user:pass@host:5432/edutrack |
FLASK_ENV | Environnement | development / production |
SECRET_KEY | Clé secrète Flask | your-secret-key-here |
TWILIO_ACCOUNT_SID | ID compte Twilio | ACxxxxxxxx |
HF_MODEL | Modèle HuggingFace | tiiuae/falcon-7b-instruct |
4.3 Infrastructure de Déploiement
Azure VM — Serveur de développement et tests Docker pour toute l'équipe.
| Composant | Valeur | Description |
|---|---|---|
| VM Name | edutrack-ai | Machine virtuelle Azure |
| IP Publique | 20.199.136.39 | Accès SSH et services |
| OS | Ubuntu 24.04 LTS | Dernière version LTS |
| Docker | 29.3.1 | Container runtime |
| Docker Compose | v5.1.1 | Orchestration multi-container |
| Taille | Standard B2als v2 | 2 vCPUs, 4 GiB RAM |
Images Docker Construites
| Service | Dockerfile | Taille | Port |
|---|---|---|---|
| Flask API | Dockerfile.flask | 807 MB | :5000 |
| Next.js Dashboard | Dockerfile.nextjs | ~800 MB | :3000 |
| Gradio Demo | Dockerfile.gradio | 476 MB | :7860 |
| PostgreSQL | postgres:15-alpine | ~80 MB | :5432 |
| Redis | redis:7-alpine | ~30 MB | :6379 |
| Celery Worker | Dockerfile.flask | (partagé) | — |
4.4 Repository GitHub & Workflow
| Élément | Valeur | Description |
|---|---|---|
| Repository | github.com/ahmeddamouad/edutrack-ia | Code source principal |
| Branche Production | main | Protégée — PR obligatoire |
| Branche Intégration | develop | Features mergées ici |
| Feature Branches | feature/EI-XXX-desc | Convention de nommage |
Workflow de Développement
┌─────────────────────────────────────────────────────────────────────┐
│ WORKFLOW DE DÉVELOPPEMENT │
└─────────────────────────────────────────────────────────────────────┘
① LOCAL ② GITHUB ③ AZURE VM ④ DOCKER
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ VS Code │ ───▶ │ Push │ ───▶ │ Pull │ ───▶ │ Build & │
│ + Git │ │ PR/Review │ │ Latest │ │ Test │
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
Développeur Code Review edutrack-ai Containers
Commandes clés:
git checkout -b feature/EI-XXX → git push -u origin feature/EI-XXX → git pull origin main
Branch Protection Rules (main)
Règles de protection appliquées:
✅ Require Pull Request avant merge
✅ Require au moins 1 approbation
✅ Push direct interdit sur main
✅ Admin bypass activé (workflow développeur solo)
✅ Require Pull Request avant merge
✅ Require au moins 1 approbation
✅ Push direct interdit sur main
✅ Admin bypass activé (workflow développeur solo)
05
C4 Model
Architecture Système
5.1 Architecture C4 — Niveau Contexte
┌──────────────────── UTILISATEURS ────────────────────────────┐
│ Enseignant Parent Administrateur │
│ (Dashboard) (Vue simplifiée) (Configuration) │
└──────────────────────────────────────────────────────────────┘
│ │ │
▼ ▼ ▼
┌──────────────────────────────────────────────────────────────┐
│ EduTrack IA │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Interface Utilisateur │ │
│ │ Next.js 15 / Gradio │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Backend API (Flask) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │ │ │
│ ┌────────▼────────┐ ┌──────▼──────┐ ┌────────▼──────┐ │
│ │ Module IA │ │ PostgreSQL │ │ WhatsApp │ │
│ │ Scikit-learn │ │ (AWS RDS) │ │ (Twilio) │ │
│ │ + Transformers │ │ │ │ │ │
│ └─────────────────┘ └─────────────┘ └──────────────┘ │
└──────────────────────────────────────────────────────────────┘
5.2 Ports & Services
| Service | Port | Description |
|---|---|---|
| Next.js Dashboard | :3000 | Interface principale (admin / enseignant / parent) |
| Gradio Demo IA | :7860 | Interface de démonstration IA |
| Flask API | :5000 | API REST centrale |
| PostgreSQL | :5432 | Base de données AWS RDS |
| Redis | :6379 | Broker Celery / Cache |
5.3 Structure du Projet
edutrack-ia/ ├── 📁 app/ │ ├── 📁 api/ # students, grades, analytics, reports, notifications │ ├── 📁 models/ # SQLAlchemy models │ ├── 📁 schemas/ # Marshmallow schemas │ ├── 📁 services/ # ml_classifier, progression, report_generator, whatsapp │ └── 📁 ml/ # models/*.joblib + training scripts ├── 📁 frontend/ │ ├── 📁 nextjs/ # Next.js 15 App (admin / enseignant / parent) │ │ ├── 📁 app/ # App Router — /dashboard, /students, /reports, /parent │ │ ├── 📁 components/ # shadcn/ui + composants custom │ │ └── 📁 lib/ # utils, API client │ └── 📁 gradio/ # Interface démo IA ├── 📁 data/ # CSV fixtures d'exemple ├── 📁 migrations/ # Alembic versions ├── 📁 tests/ # unit/ + integration/ ├── 📁 docs/ # ADR, brand-guide, api-reference ├── .env.example ├── requirements.txt ├── README.md └── docker-compose.yml
5.4 API REST — Documentation Complète
5.4.1 Format Standard des Réponses
JSON
// Réponse succès
{
"success": true,
"data": { ... },
"meta": {
"page": 1,
"per_page": 20,
"total": 150,
"total_pages": 8
}
}
// Réponse erreur
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "La note doit être entre 0 et 20",
"field": "value"
}
}
5.4.2 Authentification
| Méthode | Endpoint | Description | Auth |
|---|---|---|---|
| POST | /api/auth/login | Connexion utilisateur | - |
| POST | /api/auth/logout | Déconnexion | JWT |
| POST | /api/auth/refresh | Renouveler le token | Refresh |
| GET | /api/auth/me | Profil utilisateur connecté | JWT |
POST /api/auth/login
// Request
{
"email": "enseignant@edutrack.fr",
"password": "motdepasse123"
}
// Response 200
{
"success": true,
"data": {
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"refresh_token": "eyJhbGciOiJIUzI1NiIs...",
"expires_in": 3600,
"user": {
"id": "uuid",
"email": "enseignant@edutrack.fr",
"role": "teacher",
"first_name": "Jean",
"last_name": "Dupont"
}
}
}
5.4.3 Students (Élèves)
| Méthode | Endpoint | Description | Auth |
|---|---|---|---|
| GET | /api/students | Liste paginée des élèves | JWT |
| POST | /api/students | Créer un élève | JWT |
| GET | /api/students/{id} | Détails d'un élève | JWT |
| PUT | /api/students/{id} | Modifier un élève | JWT |
| DELETE | /api/students/{id} | Supprimer (soft delete) | JWT |
| POST | /api/students/import | Import CSV multiple | JWT |
| GET | /api/students/{id}/export | Export RGPD complet | JWT |
POST /api/students
// Request
{
"first_name": "Marie",
"last_name": "Dupont",
"date_of_birth": "2014-03-15",
"class_name": "6A",
"parent_phone": "+33612345678",
"parent_email": "parent.dupont@email.com"
}
// Response 201
{
"success": true,
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"first_name": "Marie",
"last_name": "Dupont",
"full_name": "Marie Dupont",
"date_of_birth": "2014-03-15",
"class_name": "6A",
"parent_phone": "+33612345678",
"parent_email": "parent.dupont@email.com",
"is_active": true,
"created_at": "2026-03-25T10:30:00Z"
}
}
5.4.4 Grades (Notes)
| Méthode | Endpoint | Description | Auth |
|---|---|---|---|
| GET | /api/grades | Liste des notes (filtrable) | JWT |
| POST | /api/grades | Ajouter une note | JWT |
| GET | /api/grades/{id} | Détails d'une note | JWT |
| PUT | /api/grades/{id} | Modifier une note | JWT |
| DELETE | /api/grades/{id} | Supprimer une note | JWT |
| GET | /api/grades/student/{id} | Notes d'un élève | JWT |
| POST | /api/grades/batch | Import multiple notes | JWT |
POST /api/grades
// Request
{
"student_id": "550e8400-e29b-41d4-a716-446655440000",
"competency_id": "660e8400-e29b-41d4-a716-446655440001",
"value": 16.5,
"evaluation_type": "controle",
"evaluation_date": "2026-03-25",
"comment": "Excellent travail"
}
// Response 201
{
"success": true,
"data": {
"id": "770e8400-e29b-41d4-a716-446655440002",
"student_id": "550e8400-...",
"student_name": "Marie Dupont",
"competency_id": "660e8400-...",
"competency_name": "Calcul mental",
"value": 16.5,
"evaluation_type": "controle",
"evaluation_date": "2026-03-25",
"comment": "Excellent travail",
"created_at": "2026-03-25T14:00:00Z"
}
}
5.4.5 Analytics (IA)
| Méthode | Endpoint | Description | Auth |
|---|---|---|---|
| GET | /api/analytics/student/{id}/progression | Classification ML + tendance | JWT |
| GET | /api/analytics/student/{id}/radar | Radar des compétences | JWT |
| GET | /api/analytics/student/{id}/trend | Évolution temporelle | JWT |
| GET | /api/analytics/class/{id}/heatmap | Heatmap classe | JWT |
| GET | /api/analytics/alerts | Liste des alertes | JWT |
GET /api/analytics/student/{id}/progression
// Response 200
{
"success": true,
"data": {
"student_id": "550e8400-...",
"student_name": "Marie Dupont",
"classification": "en_progression",
"confidence": 0.87,
"trend_coefficient": 0.15,
"average_grade": 14.5,
"grade_std": 2.3,
"num_evaluations": 12,
"days_since_last_evaluation": 5,
"recommendations": [
"Continuer les exercices de français",
"Renforcer la pratique en histoire"
],
"computed_at": "2026-03-25T15:00:00Z"
}
}
5.4.6 Reports (Rapports)
| Méthode | Endpoint | Description | Auth |
|---|---|---|---|
| POST | /api/reports/generate | Générer un rapport IA | JWT |
| GET | /api/reports/{id} | Détails du rapport | JWT |
| GET | /api/reports/{id}/pdf | Télécharger PDF | JWT |
| GET | /api/reports/student/{id} | Historique rapports | JWT |
| POST | /api/reports/{id}/send-whatsapp | Envoyer via WhatsApp | JWT |
POST /api/reports/generate
// Request
{
"student_id": "550e8400-e29b-41d4-a716-446655440000",
"report_type": "seance"
}
// Response 201 (async)
{
"success": true,
"data": {
"report_id": "880e8400-e29b-41d4-a716-446655440003",
"status": "generating",
"estimated_time_seconds": 8
}
}
// GET /api/reports/{id} après génération
{
"success": true,
"data": {
"id": "880e8400-...",
"student_id": "550e8400-...",
"student_name": "Marie Dupont",
"report_type": "seance",
"status": "ready",
"content": {
"summary": "Marie montre une progression constante...",
"strengths": ["Calcul mental", "Compréhension écrite"],
"improvements": ["Expression orale"],
"recommendations": ["Pratiquer la lecture à voix haute"]
},
"pdf_url": "/api/reports/880e8400-.../pdf",
"whatsapp_sent": false,
"created_at": "2026-03-25T16:00:00Z"
}
}
5.4.7 Competencies & Subjects
| Méthode | Endpoint | Description |
|---|---|---|
| GET | /api/subjects | Liste des matières |
| POST | /api/subjects | Créer une matière |
| GET | /api/competencies | Liste des compétences |
| POST | /api/competencies | Créer une compétence |
| GET | /api/competencies/subject/{id} | Compétences par matière |
5.4.8 Observations
| Méthode | Endpoint | Description |
|---|---|---|
| GET | /api/observations | Liste des observations |
| POST | /api/observations | Ajouter observation |
| GET | /api/observations/student/{id} | Observations par élève |
| PUT | /api/observations/{id} | Modifier observation |
| DELETE | /api/observations/{id} | Supprimer observation |
POST /api/observations
// Request
{
"student_id": "550e8400-e29b-41d4-a716-446655440000",
"content": "Marie participe activement en classe et aide ses camarades.",
"category": "progres",
"observation_date": "2026-03-25"
}
// Response 201
{
"success": true,
"data": {
"id": "990e8400-e29b-41d4-a716-446655440004",
"student_id": "550e8400-...",
"student_name": "Marie Dupont",
"teacher_name": "Jean Dupont",
"content": "Marie participe activement en classe...",
"category": "progres",
"observation_date": "2026-03-25",
"created_at": "2026-03-25T17:00:00Z"
}
}
5.4.9 Codes d'Erreur HTTP
| Code | Signification | Exemple |
|---|---|---|
200 | Succès | GET réussi |
201 | Créé | POST réussi |
400 | Bad Request | Données invalides |
401 | Unauthorized | Token manquant/expiré |
403 | Forbidden | Permissions insuffisantes |
404 | Not Found | Ressource inexistante |
409 | Conflict | Email déjà utilisé |
422 | Unprocessable | Validation échouée |
500 | Server Error | Erreur interne |
5.5 Diagrammes UML
5.5.1 Diagramme Use Case
┌─────────────────────────────────────────────────┐
│ EduTrack IA │
│ │
┌─────────┐ │ ┌─────────────────────────────────────────┐ │
│Enseignant│───────────┼──│ S'authentifier │ │
└─────────┘ │ └─────────────────────────────────────────┘ │
│ │ │
│ │ ┌─────────────────────────────────────────┐ │
├─────────────────┼──│ Gérer élèves (CRUD) │ │
│ │ └─────────────────────────────────────────┘ │
│ │ │
│ │ ┌─────────────────────────────────────────┐ │
├─────────────────┼──│ Saisir notes │ │
│ │ └─────────────────────────────────────────┘ │
│ │ │
│ │ ┌─────────────────────────────────────────┐ │
├─────────────────┼──│ Consulter dashboard │ │
│ │ └─────────────────────────────────────────┘ │
│ │ │
│ │ ┌─────────────────────────────────────────┐ │ «include»
├─────────────────┼──│ Générer rapport IA │◄──────────────┐
│ │ └─────────────────────────────────────────┘ │ │
│ │ │ │ │
│ │ │ «include» │ │
│ │ ▼ │ │
│ │ ┌─────────────────────────────────────────┐ │ │
│ │ │ Classifier élèves (ML) │◄──┼───────────┤
│ │ └─────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────┐ │ │
├─────────────────┼──│ Envoyer WhatsApp │───┼───────────┘
│ │ └─────────────────────────────────────────┘ │
│ │ │
│ │ ┌─────────────────────────────────────────┐ │
└─────────────────┼──│ Configurer alertes │◄──┼────┐
│ └─────────────────────────────────────────┘ │ │
│ │ │ │
┌─────────┐ │ │ «include» │ │
│ Parent │────────────┼───────────────────────┼────────────────────────┼────┤
└─────────┘ │ ▼ │ │
│ │ ┌─────────────────────────────────────────┐ │ │
│ │ │ Détecter alertes (IA) │───┼────┘
│ │ └─────────────────────────────────────────┘ │
│ │ │
│ │ ┌─────────────────────────────────────────┐ │
├─────────────────┼──│ Consulter progression enfant │ │
│ │ └─────────────────────────────────────────┘ │
│ │ │
│ │ ┌─────────────────────────────────────────┐ │
└─────────────────┼──│ Recevoir notifications │ │
│ └─────────────────────────────────────────┘ │
│ │
┌───────────┐ │ ┌─────────────────────────────────────────┐ │
│Administrateur│───────┼──│ Gérer utilisateurs │ │
└───────────┘ │ └─────────────────────────────────────────┘ │
│ │
└────────────────────────────────────────────────┘
5.5.2 Diagramme de Séquence — Génération Rapport IA
┌──────────┐ ┌───────────┐ ┌─────────┐ ┌──────────┐ ┌───────────┐ ┌──────────┐ ┌─────────┐
│Enseignant│ │ Next.js │ │Flask API│ │PostgreSQL│ │ML Service │ │HuggingFace│ │ Twilio │
└────┬─────┘ └─────┬─────┘ └────┬────┘ └────┬─────┘ └─────┬─────┘ └─────┬─────┘ └────┬────┘
│ │ │ │ │ │ │
│ Clic "Générer Rapport" │ │ │ │ │
│─────────────>│ │ │ │ │ │
│ │ POST /api/reports/generate │ │ │
│ │────────────>│ │ │ │ │
│ │ │ SELECT student, grades, observations │ │
│ │ │───────────>│ │ │ │
│ │ │ données élève │ │ │
│ │ │<───────────│ │ │ │
│ │ │ │ │ │ │
│ │ │ classify_student(features)│ │ │
│ │ │───────────────────────────>│ │ │
│ │ │ │ ┌──────────┴──────────┐ │ │
│ │ │ │ │StandardScaler │ │ │
│ │ │ │ │.transform() │ │ │
│ │ │ │ │RandomForest │ │ │
│ │ │ │ │.predict_proba() │ │ │
│ │ │ │ └──────────┬──────────┘ │ │
│ │ │ {classification: "en_progression", confidence: 0.87} │
│ │ │<───────────────────────────│ │ │
│ │ │ generate_text(prompt, data)│ │ │
│ │ │────────────────────────────────────────────>│ │
│ │ │ texte rapport personnalisé │ │ │
│ │ │<────────────────────────────────────────────│ │
│ │ │ [WeasyPrint: génère PDF] │ │ │
│ │ │ INSERT INTO reports │ │ │
│ │ │───────────>│ │ │ │
│ │ {report_id, pdf_url, status: "ready"} │ │ │
│ │<────────────│ │ │ │ │
│ Rapport PDF affiché │ │ │ │ │
│<─────────────│ │ │ │ │ │
│ │ │ │ │ │ │
│ Clic "Envoyer WhatsApp" │ │ │ │ │
│─────────────>│ │ │ │ │ │
│ │ POST /api/reports/{id}/send-whatsapp │ │ │
│ │────────────>│ │ │ │ │
│ │ │ send_message(parent_phone, pdf_url) │ │
│ │ │────────────────────────────────────────────────────────>│
│ │ │ {message_sid, status: "sent"} │ │
│ │ │<────────────────────────────────────────────────────────│
│ │ │ UPDATE reports SET whatsapp_sent = true │ │
│ │ │───────────>│ │ │ │
│ ✓ Message envoyé au parent│ │ │ │ │
│<─────────────│ │ │ │ │ │
5.5.3 Diagramme de Séquence — Saisie de Note
┌──────────┐ ┌───────────┐ ┌─────────┐ ┌───────────┐ ┌──────────┐ ┌───────────┐
│Enseignant│ │ Next.js │ │Flask API│ │Marshmallow│ │PostgreSQL│ │ML Service │
└────┬─────┘ └─────┬─────┘ └────┬────┘ └─────┬─────┘ └────┬─────┘ └─────┬─────┘
│ │ │ │ │ │
│ Remplit formulaire note │ │ │ │
│──────────────>│ │ │ │ │
│ │ Validation client (0-20, date) │ │
│ │ │ │ │ │
│ │ POST /api/grades │ │ │
│ │─────────────>│ │ │ │
│ │ │ GradeSchema.load(data) │ │
│ │ │──────────────>│ │ │
│ │ │ │ Validate: │ │
│ │ │ │ value 0-20 │ │
│ │ │ │ date valid │ │
╔══════════════════════════════════════════════════════════════════════════════╗
║ ALT [Validation échoue] ║
╠══════════════════════════════════════════════════════════════════════════════╣
│ │ │ ValidationError │ │
│ │ │<──────────────│ │ │
│ │ 400 {error: "Valeur invalide"} │ │
│ │<─────────────│ │ │ │
│ Message erreur rouge │ │ │ │
│<──────────────│ │ │ │ │
╠══════════════════════════════════════════════════════════════════════════════╣
║ ALT [Validation OK] ║
╠══════════════════════════════════════════════════════════════════════════════╣
│ │ │ grade_data │ │ │
│ │ │<──────────────│ │ │
│ │ │ INSERT INTO grades │ │
│ │ │──────────────────────────────>│ │
│ │ │ grade_id │ │ │
│ │ │<──────────────────────────────│ │
│ │ │ update_classification(student_id) [Async] │
│ │ │──────────────────────────────────────────────>│
│ │ 201 {grade: {...}} │ │ │
│ │<─────────────│ │ │ │
│ "Note ajoutée ✓" │ │ │ │
│<──────────────│ │ │ │ │
│ │ Refresh dashboard │ │ │
╚══════════════════════════════════════════════════════════════════════════════╝
5.5.4 Diagramme d'Activité — Workflow Enseignant
┌─────────────────┐
│ START │
└────────┬────────┘
▼
┌─────────────────┐
│ Connexion │
│ enseignant │
└────────┬────────┘
▼
◇───────────────────◇
╱ Identifiants ╲
╱ valides ? ╲
◇───────────────────────────◇
│ OUI │ NON
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ Accès Dashboard │ │ Message erreur │──┐
└────────┬────────┘ └─────────────────┘ │
│ │
┌────────────┴────────────┐ │
▼ ▼ │
┌─────────────────┐ ┌─────────────────┐ │
│Consulter alertes│ │Voir stats classe│ │
└────────┬────────┘ └────────┬────────┘ │
└────────────┬────────────┘ │
▼ │
┌─────────────────┐ │
┌──────>│Sélectionner │ │
│ │action │ │
│ └────────┬────────┘ │
│ ┌───────────┼───────────┬───────────┐ │
│ ▼ ▼ ▼ ▼ │
│ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │Saisir│ │Générer│ │Consul-│ │Ajouter│ │
│ │note │ │rapport│ │ter │ │observ.│ │
│ └──┬───┘ └──┬───┘ │progres│ └──┬───┘ │
│ │ │ └──┬───┘ │ │
│ ▼ ▼ │ │ │
│ ┌──────────┐ ┌──────┐ │ │ │
│ │Sélection-│ │Sélect│ │ │ │
│ │ner élève │ │élève │ │ │ │
│ └────┬─────┘ └──┬───┘ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ┌──────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │
│ │Sélection-│ │Choisir │ │Afficher│ │Rédiger │ │
│ │ner compét│ │type │ │graphes │ │texte │ │
│ └────┬─────┘ └───┬────┘ └───┬────┘ └───┬────┘ │
│ ▼ ▼ │ ▼ │
│ ┌──────────┐ ┌────────┐ │ ┌────────┐ │
│ │Entrer │ │Génération │ │Sélect │ │
│ │valeur │ │IA │ │ │catégorie│ │
│ │(0-20) │ └───┬────┘ │ └───┬────┘ │
│ └────┬─────┘ ▼ │ ▼ │
│ ▼ ┌────────┐ │ ┌────────┐ │
│ ┌──────────┐│Afficher│ │ │Enregis-│ │
│ │Valider ││rapport │ │ │trer │ │
│ └────┬─────┘│PDF │ │ └───┬────┘ │
│ ▼ └───┬────┘ │ │ │
│ ┌──────────┐ ▼ │ │ │
│ │Note │◇─────────◇ │ │ │
│ │enregistrée│ Envoyer ╲ │ │ │
│ └────┬─────┘╲WhatsApp? ╱ │ │ │
│ │ ◇─────────◇ │ │ │
│ │ │OUI │NON │ │ │
│ │ ▼ │ │ │ │
│ │ ┌────────┐ │ │ │ │
│ │ │Envoi │ │ │ │ │
│ │ │parent │ │ │ │ │
│ │ └───┬────┘ │ │ │ │
│ │ ▼ │ │ │ │
│ │ ┌────────┐ │ │ │ │
│ │ │Confirm.│ │ │ │ │
│ │ └───┬────┘ │ │ │ │
│ └──────┴────────┴──────┴────────┘ │
│ │ │
│ ▼ │
│ ◇───────────────────◇ │
│ ╱ Continuer ? ╲ │
│ ◇───────────────────────◇ │
│ │ OUI │ NON │
└───────────┘ ▼ │
┌─────────────────┐ │
│ Déconnexion │ │
└────────┬────────┘ │
▼ │
┌─────────────────┐ │
│ END │<──────────┘
└─────────────────┘
06
PostgreSQL
Modèle de Données
6.1 Tables Principales
studentsÉlèves
PKidUUIDNOT NULL
first_nameVARCHAR(100)NOT NULL
last_nameVARCHAR(100)NOT NULL
date_of_birthDATE
class_nameVARCHAR(50)NOT NULL
parent_phoneVARCHAR(20)
parent_emailVARCHAR(255)
is_activeBOOLEANDEFAULT TRUE
created_atTIMESTAMPDEFAULT NOW()
gradesNotes
PKidUUIDNOT NULL
FKstudent_idUUID→ students
FKcompetency_idUUID→ competencies
valueDECIMAL(4,2)CHECK 0–20
evaluation_typeENUMcontrole | test_blanc | exercice
evaluation_dateDATENOT NULL
created_atTIMESTAMPDEFAULT NOW()
competenciesCompétences
PKidUUIDNOT NULL
nameVARCHAR(200)NOT NULL
descriptionTEXT
FKsubject_idUUID→ subjects
levelVARCHAR(20)cycle3, 6ème…
created_atTIMESTAMPDEFAULT NOW()
observationsNouveau
PKidUUIDNOT NULL
FKstudent_idUUID→ students
teacher_nameVARCHAR(100)NOT NULL
contentTEXTNOT NULL
categoryENUMcomportement | progres | difficulte
NEWobservation_dateDATENOT NULL
created_atTIMESTAMPDEFAULT NOW()
usersAuthentification
PKidUUIDNOT NULL
emailVARCHAR(255)UNIQUE NOT NULL
password_hashVARCHAR(255)NOT NULL
roleENUMadmin | teacher | parent
first_nameVARCHAR(100)NOT NULL
last_nameVARCHAR(100)NOT NULL
phoneVARCHAR(20)
is_activeBOOLEANDEFAULT TRUE
last_loginTIMESTAMP
created_atTIMESTAMPDEFAULT NOW()
subjectsMatières
PKidUUIDNOT NULL
nameVARCHAR(100)UNIQUE NOT NULL
codeVARCHAR(10)UNIQUE NOT NULL
descriptionTEXT
coefficientDECIMAL(3,2)DEFAULT 1.00
colorVARCHAR(7)DEFAULT #3B82F6
is_activeBOOLEANDEFAULT TRUE
created_atTIMESTAMPDEFAULT NOW()
classesClasses
PKidUUIDNOT NULL
nameVARCHAR(50)NOT NULL
levelVARCHAR(20)NOT NULL
academic_yearVARCHAR(9)2025-2026
FKteacher_idUUID→ users
max_studentsINTEGERDEFAULT 30
created_atTIMESTAMPDEFAULT NOW()
reportsRapports IA
PKidUUIDNOT NULL
FKstudent_idUUID→ students
FKgenerated_byUUID→ users
report_typeENUMmensuel | trimestriel | seance
content_jsonJSONBNOT NULL
pdf_pathVARCHAR(500)
whatsapp_sentBOOLEANDEFAULT FALSE
whatsapp_sent_atTIMESTAMP
created_atTIMESTAMPDEFAULT NOW()
ai_predictionsML
PKidUUIDNOT NULL
FKstudent_idUUID→ students
prediction_typeVARCHAR(50)classification
classificationVARCHAR(50)NOT NULL
confidenceDECIMAL(5,4)0.0000-1.0000
features_jsonJSONBNOT NULL
model_versionVARCHAR(20)v1.0.0
created_atTIMESTAMPDEFAULT NOW()
audit_logsRGPD
PKidUUIDNOT NULL
FKuser_idUUID→ users
actionVARCHAR(50)CREATE | UPDATE | DELETE
entity_typeVARCHAR(50)student | grade | ...
entity_idUUID
old_valueJSONB
new_valueJSONB
ip_addressINET
created_atTIMESTAMPDEFAULT NOW()
6.2 Index et Contraintes
SQL
-- Index de performance
CREATE INDEX idx_students_class ON students(class_name);
CREATE INDEX idx_students_active ON students(is_active);
CREATE INDEX idx_grades_student ON grades(student_id);
CREATE INDEX idx_grades_date ON grades(evaluation_date);
CREATE INDEX idx_grades_student_date ON grades(student_id, evaluation_date);
CREATE INDEX idx_observations_student ON observations(student_id);
CREATE INDEX idx_competencies_subject ON competencies(subject_id);
CREATE INDEX idx_reports_student ON reports(student_id);
CREATE INDEX idx_predictions_student ON ai_predictions(student_id);
-- Contraintes CHECK
ALTER TABLE grades ADD CONSTRAINT chk_grade_value
CHECK (value >= 0 AND value <= 20);
ALTER TABLE competencies ADD CONSTRAINT chk_level
CHECK (level >= 1 AND level <= 5);
ALTER TABLE students ADD CONSTRAINT chk_phone_format
CHECK (parent_phone ~ '^\+?[0-9]{10,15}$');
6.3 Diagramme ERD
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ users │ │ subjects │ │ classes │
├─────────────┤ ├─────────────┤ ├─────────────┤
│ PK id │ │ PK id │ │ PK id │
│ email │ │ name │ │ name │
│ password │ │ code │ │ level │
│ role │ │ coefficient │ │ FK teacher │
│ first_name │ └──────┬──────┘ └─────────────┘
│ last_name │ │
└──────┬──────┘ │ 1
│ │
│ 1 ▼ N
│ ┌─────────────┐
│ │competencies │
│ ├─────────────┤
│ │ PK id │
│ │ name │
│ │ FK subject │
│ └──────┬──────┘
│ │ 1
▼ N │
┌─────────────┐ ▼ N
│ reports │ ┌─────────────┐
├─────────────┤ │ grades │◄──────────────────┐
│ PK id │ ├─────────────┤ │
│ FK student │ │ PK id │ │
│ FK user │ │ FK student │───────────────────┤
│ type │ │ FK compet. │ │
│ content │ │ value │ │
│ pdf_path │ │ date │ │
└─────────────┘ └─────────────┘ │
│
┌─────────────┐ ┌─────────────┐ ┌───────────┴─┐
│audit_logs │ │observations │ │ students │
├─────────────┤ ├─────────────┤ ├─────────────┤
│ PK id │ │ PK id │ │ PK id │
│ FK user │ │ FK student │───────│ first_name │
│ action │ │ teacher │ │ last_name │
│ entity │ │ content │ │ class_name │
│ old/new │ │ category │ │ parent_phone│
└─────────────┘ └─────────────┘ └─────────────┘
│
│ 1
▼ N
┌─────────────┐
│ai_predictions│
├─────────────┤
│ PK id │
│ FK student │
│ classif. │
│ confidence │
│ features │
└─────────────┘
6.4 Collecte de Données Éducatives Marocaines
Responsabilité Data Engineers
Les Data Engineers sont responsables de collecter, structurer et valider les données éducatives marocaines pour alimenter le système.
Les Data Engineers sont responsables de collecter, structurer et valider les données éducatives marocaines pour alimenter le système.
6.4.1 Données à Collecter
| Catégorie | Données | Source | Format |
|---|---|---|---|
| Matières | Liste complète des matières par niveau (collège/lycée) | Programme MEN Maroc | JSON/CSV |
| Compétences | Référentiel de compétences par matière et niveau | Curricula officiels | JSON |
| Coefficients | Coefficients par matière et filière (Sciences, Lettres, Techniques) | MEN Maroc | JSON |
| Niveaux | Structure des classes (1AC→3AC, TC→2Bac) | Système éducatif | JSON |
| Barèmes | Seuils de notation, mentions, critères de passage | Règlements examen | JSON |
6.4.2 Structure des Matières Marocaines
JSON - data/fixtures/subjects_maroc.json
{
"subjects": [
{
"code": "MATH",
"name_fr": "Mathématiques",
"name_ar": "الرياضيات",
"levels": ["college", "lycee"],
"coefficients": {
"sciences_math": 9,
"sciences_exp": 7,
"lettres": 3
}
},
{
"code": "PHYS",
"name_fr": "Physique-Chimie",
"name_ar": "الفيزياء والكيمياء",
"levels": ["college", "lycee"],
"coefficients": {
"sciences_math": 7,
"sciences_exp": 7,
"lettres": 2
}
},
{
"code": "SVT",
"name_fr": "Sciences de la Vie et de la Terre",
"name_ar": "علوم الحياة والأرض",
"levels": ["college", "lycee"],
"coefficients": {
"sciences_exp": 7,
"sciences_math": 5
}
},
{
"code": "ARAB",
"name_fr": "Langue Arabe",
"name_ar": "اللغة العربية",
"levels": ["college", "lycee"],
"coefficients": {
"lettres": 4,
"sciences_exp": 2,
"sciences_math": 2
}
},
{
"code": "FRAN",
"name_fr": "Langue Française",
"name_ar": "اللغة الفرنسية",
"levels": ["college", "lycee"],
"coefficients": {
"lettres": 4,
"sciences_exp": 2,
"sciences_math": 2
}
},
{
"code": "ANGL",
"name_fr": "Langue Anglaise",
"name_ar": "اللغة الإنجليزية",
"levels": ["college", "lycee"],
"coefficients": {
"all": 2
}
},
{
"code": "HIST",
"name_fr": "Histoire-Géographie",
"name_ar": "التاريخ والجغرافيا",
"levels": ["college", "lycee"],
"coefficients": {
"lettres": 3,
"sciences": 2
}
},
{
"code": "PHIL",
"name_fr": "Philosophie",
"name_ar": "الفلسفة",
"levels": ["lycee"],
"coefficients": {
"lettres": 4,
"sciences": 2
}
},
{
"code": "ISLA",
"name_fr": "Éducation Islamique",
"name_ar": "التربية الإسلامية",
"levels": ["college", "lycee"],
"coefficients": {
"all": 2
}
}
]
}
6.4.3 Compétences par Matière (Exemple Mathématiques)
JSON - data/fixtures/competencies_math.json
{
"subject": "MATH",
"competencies": {
"college": {
"1AC": [
{"code": "M1C1", "name": "Opérations sur les nombres entiers"},
{"code": "M1C2", "name": "Fractions et décimaux"},
{"code": "M1C3", "name": "Géométrie plane - triangles"},
{"code": "M1C4", "name": "Proportionnalité"}
],
"2AC": [
{"code": "M2C1", "name": "Calcul algébrique"},
{"code": "M2C2", "name": "Équations du 1er degré"},
{"code": "M2C3", "name": "Théorème de Pythagore"},
{"code": "M2C4", "name": "Statistiques descriptives"}
],
"3AC": [
{"code": "M3C1", "name": "Identités remarquables"},
{"code": "M3C2", "name": "Systèmes d'équations"},
{"code": "M3C3", "name": "Théorème de Thalès"},
{"code": "M3C4", "name": "Trigonométrie dans le triangle"}
]
},
"lycee": {
"TC": [
{"code": "MTC1", "name": "Calcul vectoriel"},
{"code": "MTC2", "name": "Fonctions de référence"},
{"code": "MTC3", "name": "Polynômes du 2nd degré"}
],
"1BAC": [
{"code": "M1B1", "name": "Suites numériques"},
{"code": "M1B2", "name": "Limites et continuité"},
{"code": "M1B3", "name": "Dérivation"},
{"code": "M1B4", "name": "Produit scalaire"}
],
"2BAC": [
{"code": "M2B1", "name": "Intégration"},
{"code": "M2B2", "name": "Équations différentielles"},
{"code": "M2B3", "name": "Nombres complexes"},
{"code": "M2B4", "name": "Probabilités et dénombrement"}
]
}
}
}
6.4.4 Niveaux Scolaires Marocains
JSON - data/fixtures/levels_maroc.json
{
"levels": {
"college": {
"name_fr": "Collège (Secondaire Collégial)",
"name_ar": "الثانوي الإعدادي",
"classes": [
{"code": "1AC", "name": "1ère Année Collège", "age": 12},
{"code": "2AC", "name": "2ème Année Collège", "age": 13},
{"code": "3AC", "name": "3ème Année Collège", "age": 14, "exam": "Brevet"}
]
},
"lycee": {
"name_fr": "Lycée (Secondaire Qualifiant)",
"name_ar": "الثانوي التأهيلي",
"classes": [
{"code": "TC", "name": "Tronc Commun", "age": 15},
{"code": "1BAC", "name": "1ère Année Bac", "age": 16, "exam": "Régional"},
{"code": "2BAC", "name": "2ème Année Bac", "age": 17, "exam": "Baccalauréat"}
],
"filieres": [
{"code": "SM", "name": "Sciences Mathématiques"},
{"code": "PC", "name": "Sciences Physiques"},
{"code": "SVT", "name": "Sciences de la Vie et de la Terre"},
{"code": "SE", "name": "Sciences Économiques"},
{"code": "SH", "name": "Sciences Humaines"},
{"code": "LA", "name": "Lettres et Arts"}
]
}
}
}
6.4.5 Données de Test Réalistes
| Dataset | Description | Volume | Fichier |
|---|---|---|---|
| Élèves Test | Profils réalistes d'élèves marocains | 100+ élèves | students_maroc.json |
| Notes Historiques | Notes sur 2 semestres par élève | 1000+ notes | grades_maroc.json |
| Compétences | 50 compétences par matière principale | 300+ compétences | competencies_all.json |
| Observations | Remarques enseignants en arabe/français | 200+ observations | observations_maroc.json |
Tâches Data Engineers
1. Collecter les référentiels de compétences officiels du MEN Maroc
2. Créer les fixtures JSON pour toutes les matières du collège et lycée
3. Générer des données de test réalistes (noms marocains, notes cohérentes)
4. Valider les coefficients par filière avec les règlements officiels
5. Documenter les sources de données dans
1. Collecter les référentiels de compétences officiels du MEN Maroc
2. Créer les fixtures JSON pour toutes les matières du collège et lycée
3. Générer des données de test réalistes (noms marocains, notes cohérentes)
4. Valider les coefficients par filière avec les règlements officiels
5. Documenter les sources de données dans
/docs/data-sources.md
07
UX/UI
Interfaces Utilisateur
7.1 Dashboard Enseignant — Page Accueil
┌────────────────────────────────────────────────────────────────┐
│ 🎓 EduTrack IA [Déconnexion] │
├────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 42 │ │ 85% │ │ 3 │ │ 12 │ │
│ │ Élèves │ │ Moy. │ │ Alertes │ │ Rapports │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ │
│ ┌─────────────────────────────────────┐ │
│ │ Heatmap Compétences Classe │ │
│ │ Math Fran Angl Hist Phys │ │
│ │ [🟢] [🟡] [🟢] [🟡] [🔴] │ 3A │
│ │ [🟡] [🟢] [🟡] [🔴] [🟡] │ 3B │
│ └─────────────────────────────────────┘ │
│ │
│ ⚠️ Sarah D. : Régression en Mathématiques (-15%) │
│ ⚠️ Tom M. : Compétence "Fractions" à renforcer │
└────────────────────────────────────────────────────────────────┘
7.2 Vue Parent — Espace Simplifié
┌────────────────────────────────────────────────────────────────┐
│ 🎓 EduTrack IA – Espace Parent │
├────────────────────────────────────────────────────────────────┤
│ Bonjour ! Voici la progression de Sarah. │
│ │
│ Mathématiques ████████████████░░░░ 80% 🟢 Maîtrisée │
│ Français ████████████░░░░░░░░ 60% 🟡 En cours │
│ Sciences ██████████████████░░ 90% 🟢 Maîtrisée │
│ Histoire ████████░░░░░░░░░░░░ 40% 🔴 À renforcer │
│ │
│ 📈 Tendance : ↗️ Amélioration (+8% ce mois) │
│ │
│ [📥 Télécharger PDF] [📲 Historique WhatsApp] │
└────────────────────────────────────────────────────────────────┘
7.3 Page de Connexion
┌────────────────────────────────────────────────────────────────┐
│ │
│ │
│ 🎓 EduTrack IA │
│ ━━━━━━━━━━━━━━━━━━ │
│ │
│ Système de suivi pédagogique │
│ intelligent avec IA │
│ │
│ ┌─────────────────────────┐ │
│ │ 📧 Email │ │
│ │ ________________________│ │
│ │ enseignant@ecole.fr │ │
│ └─────────────────────────┘ │
│ │
│ ┌─────────────────────────┐ │
│ │ 🔒 Mot de passe │ │
│ │ ________________________│ │
│ │ •••••••••• │ │
│ └─────────────────────────┘ │
│ │
│ ☐ Se souvenir de moi │
│ │
│ ┌─────────────────────────┐ │
│ │ SE CONNECTER │ │
│ │ 🔓 │ │
│ └─────────────────────────┘ │
│ │
│ Mot de passe oublié ? │
│ │
│ ───────────────────────────────────────────────────────── │
│ © 2026 EduTrack IA - PFE Projet #9 │
└────────────────────────────────────────────────────────────────┘
7.4 Fiche Élève Détaillée
┌──────────────────────────────────────────────────────────────────────────┐
│ ← Retour à la liste Fiche Élève [Générer Rapport ▼] │
├──────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌────────┐ Marie DUPONT │
│ │ 👤 │ ───────────────────────────────────────────────── │
│ │ 📷 │ Classe: 6ème A • Né(e): 15/03/2014 • 📱 +33612345678 │
│ │ │ Email parent: parent.dupont@email.com │
│ └────────┘ Statut: ● Actif │
│ Classification IA: 🟢 En progression (confiance: 87%) │
│ │
├──────────────────────────────────────────────────────────────────────────┤
│ [📊 Notes] [🎯 Compétences] [📝 Observations] [📈 Historique] [📄 Rapports] │
├──────────────────────────────────────────────────────────────────────────┤
│ │
│ ÉVOLUTION DES NOTES RADAR COMPÉTENCES │
│ ┌────────────────────────────┐ ┌────────────────────────┐ │
│ │ 18│ ● │ │ Maths │ │
│ │ 16│ ╱ ╲ ● │ │ 90% │ │
│ │ 14│● ● ╲ ╱ ╲ │ │ ◢━━━━━━━◣ │ │
│ │ 12│ ╲ ╱ ● ● │ │ Fr◣ ◥Hist │ │
│ │ 10│ ╲╱ │ │ 75% ╲ ● ╱ 70% │ │
│ │ ──────────────────────── │ │ ╲ ╱ │ │
│ │ Sept Oct Nov Dec Jan │ │ Sc◤━━━◥Géo │ │
│ │ │ │ 85% 65% │ │
│ │ ● Notes ─── Tendance │ │ │ │
│ └────────────────────────────┘ │ ■ Actuel □ Objectif │ │
│ └────────────────────────┘ │
│ DERNIÈRES NOTES │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ Date │ Matière │ Compétence │ Note │ Type │ │
│ ├──────────────────────────────────────────────────────────────────┤ │
│ │ 25/03/2026 │ Mathématiques│ Calcul mental │ 16/20 │ Devoir │ │
│ │ 22/03/2026 │ Français │ Compréhension écrite │ 14/20 │ Contrôle│ │
│ │ 18/03/2026 │ Histoire │ Analyse documents │ 15/20 │ Oral │ │
│ │ 15/03/2026 │ Sciences │ Méthode scientifique │ 17/20 │ TP │ │
│ │ 10/03/2026 │ Géographie │ Lecture de carte │ 13/20 │ Devoir │ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ [+ Ajouter une note] │
│ │
│ OBSERVATIONS RÉCENTES │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ 🟢 20/03 - M. Dupont: "Marie participe activement en classe" │ │
│ │ 🟡 15/03 - Mme Martin: "Doit améliorer l'expression orale" │ │
│ │ 🟢 08/03 - M. Dupont: "Excellent travail de groupe" │ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ [+ Ajouter une observation] │
└──────────────────────────────────────────────────────────────────────────┘
7.5 Formulaire de Saisie de Note
┌─────────────────────────────────────────────────────────────┐
│ ✏️ Nouvelle Note ✕ │
├─────────────────────────────────────────────────────────────┤
│ │
│ Élève * │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 🔍 Marie DUPONT - 6A ▼ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ Matière * │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 📚 Mathématiques ▼ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ Compétence * │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 🎯 Calcul mental ▼ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌───────────────────┐ ┌─────────────────────────────┐ │
│ │ Note /20 * │ │ Type d'évaluation * │ │
│ │ ┌───────────────┐ │ │ ┌─────────────────────────┐ │ │
│ │ │ 16 │ │ │ │ Devoir maison ▼ │ │ │
│ │ └───────────────┘ │ │ └─────────────────────────┘ │ │
│ │ ◄━━━━━●━━━━━━► │ │ │ │
│ │ 0 20 │ │ ○ Devoir maison │ │
│ └───────────────────┘ │ ● Contrôle │ │
│ │ ○ Test blanc │ │
│ │ ○ Exercice │ │
│ │ ○ Oral │ │
│ └─────────────────────────────┘ │
│ │
│ Date d'évaluation * │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 📅 25/03/2026 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ Commentaire (optionnel) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Excellent travail, bonne maîtrise des additions │ │
│ │ complexes. │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌───────────────────┐ ┌─────────────────────────────┐ │
│ │ Annuler │ │ ✓ Enregistrer │ │
│ │ │ │ │ │
│ └───────────────────┘ └─────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
7.6 Génération de Rapport IA
┌─────────────────────────────────────────────────────────────────────────┐
│ 📄 Rapport de Progression - Marie DUPONT ✕ │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 🎓 EDUTRACK IA │ │
│ │ Rapport de Progression │ │
│ │ ━━━━━━━━━━━━━━━━━━━━━ │ │
│ │ │ │
│ │ Élève: Marie DUPONT Date: 25 mars 2026 │ │
│ │ Classe: 6ème A Période: Trimestre 2 │ │
│ │ │ │
│ │ ═══════════════════════════════════════════════════════════ │ │
│ │ │ │
│ │ 📊 RÉSUMÉ GLOBAL │ │
│ │ ─────────────────────────────────────────────────────────── │ │
│ │ Marie démontre une progression constante et encourageante. │ │
│ │ Sa moyenne générale de 14.5/20 reflète un travail régulier │ │
│ │ et une bonne compréhension des concepts abordés. │ │
│ │ │ │
│ │ Classification IA: 🟢 EN PROGRESSION (confiance: 87%) │ │
│ │ │ │
│ │ ✅ POINTS FORTS │ │
│ │ • Excellente maîtrise du calcul mental │ │
│ │ • Bonne compréhension en lecture │ │
│ │ • Participation active en classe │ │
│ │ │ │
│ │ 📈 AXES D'AMÉLIORATION │ │
│ │ • L'expression orale peut encore progresser │ │
│ │ • La méthodologie en histoire nécessite attention │ │
│ │ │ │
│ │ 💡 RECOMMANDATIONS POUR LES PARENTS │ │
│ │ • Encourager la lecture à voix haute (15 min/jour) │ │
│ │ • Continuer les exercices de mathématiques ludiques │ │
│ │ • Valoriser les efforts et progrès réalisés │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────────┐ │
│ │ 📥 Télécharger │ │ 🖨️ Imprimer │ │ 📲 Envoyer via WhatsApp │ │
│ │ PDF │ │ │ │ │ │
│ └─────────────────┘ └─────────────────┘ └─────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────┘
7.7 Liste des Alertes
┌──────────────────────────────────────────────────────────────────────────┐
│ ⚠️ Alertes Actives 🔔 Notifications │
├──────────────────────────────────────────────────────────────────────────┤
│ │
│ Filtrer: [Toutes ▼] [Cette semaine ▼] [Classe 6A ▼] 🔍 Rechercher │
│ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ 🔴 URGENT il y a 2h │ │
│ │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │ │
│ │ Lucas MARTIN (6A) - Baisse significative en Mathématiques │ │
│ │ Moyenne passée de 14/20 à 8/20 sur les 3 dernières semaines │ │
│ │ Confiance IA: 92% │ │
│ │ │ │
│ │ [📞 Contacter parent] [📄 Voir fiche] [✓ Marquer résolu] │ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ 🟡 ATTENTION il y a 1 jour │ │
│ │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │ │
│ │ Sophie BERNARD (6B) - Compétence "Fractions" non acquise │ │
│ │ 3 évaluations < 10/20 consécutives sur cette compétence │ │
│ │ Confiance IA: 78% │ │
│ │ │ │
│ │ [📞 Contacter parent] [📄 Voir fiche] [✓ Marquer résolu] │ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ 🟡 ATTENTION il y a 3 jours│ │
│ │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │ │
│ │ Thomas PETIT (6A) - Absence prolongée (5 jours) │ │
│ │ Aucune note enregistrée depuis le 15/03/2026 │ │
│ │ │ │
│ │ [📞 Contacter parent] [📄 Voir fiche] [✓ Marquer résolu] │ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ │
│ Affichage 3 sur 3 alertes [Actualiser 🔄] │
└──────────────────────────────────────────────────────────────────────────┘
7.8 Composants Next.js / shadcn/ui
| Composant | Bibliothèque / API | Usage |
|---|---|---|
| KPI Card | <Card> + shadcn/ui | Afficher statistiques avec variation |
| Graphique évolution | Recharts <LineChart> | Tendance des notes |
| Radar compétences | Recharts <RadarChart> | Visualiser multi-compétences par élève |
| Heatmap classe | Recharts <Cell> + grille | Matrice élèves × compétences |
| Formulaire note | <Form> + react-hook-form | Saisie groupée avec validation Zod |
| Sélection élève | <Select> (shadcn/ui) | Recherche et sélection d'élève |
| Slider note | <Slider 0-20> | Saisie intuitive 0-20 |
| Date picker | <DatePicker> (shadcn/ui) | Sélection date évaluation |
| Alertes | <Alert> / <Toast> | Notifications visuelles |
| Rapport PDF | <Button> téléchargement | Export PDF généré |
| Vue Parent (/parent) | Route Next.js App Router | Portail simplifié parent — intégré dans la même app |
08
ML / NLP
Intelligence Artificielle
8.1 Pipeline de Classification Scikit-learn
Features
avg_grade, std, trend, n_eval
→
StandardScaler
Normalisation
→
RandomForest
100 estimateurs
→
Classification
Maîtrisée / En cours / À renforcer
# Pipeline de classification (Scikit-learn) from sklearn.ensemble import RandomForestClassifier from sklearn.pipeline import Pipeline pipeline = Pipeline([ ('scaler', StandardScaler()), ('classifier', RandomForestClassifier( n_estimators=100, max_depth=10, random_state=42 )) ]) features = [ 'avg_grade', # Moyenne des notes 'std_grade', # Écart-type 'trend_coefficient',# Coefficient tendance linéaire 'num_evaluations', # Nombre d'évaluations 'last_grade', # Dernière note 'days_since_last' # Jours depuis dernière évaluation ]
Objectif de précisionPrécision minimale requise : 75% — Métrique affichée dans le dashboard enseignant. Classes : 0 = Maîtrisée, 1 = En cours, 2 = À renforcer.
8.2 Génération de Rapports — Transformers HuggingFace
| Paramètre | Valeur |
|---|---|
| Modèle | tiiuae/falcon-7b-instruct ou mistralai/Mistral-7B-Instruct-v0.1 |
| Langue | Français |
| Max tokens | 300 |
| Température | 0.7 (créativité modérée) |
| Temps max | < 10 secondes |
# Template de prompt pour la génération de rapport PROMPT_TEMPLATE = """ Tu es un assistant pédagogique. Génère un rapport de progression. Élève: {student_name} · Classe: {class_name} · Période: {period} Compétences travaillées: {competencies_list} Classification → Maîtrisées: {mastered} | En cours: {in_progress} À renforcer: {to_reinforce} Observations: {observations} Génère un rapport bienveillant et constructif en 3-4 paragraphes. 1. Les progrès réalisés 2. Les points à améliorer 3. Des recommandations concrètes pour les parents """
8.3 Calcul des Features ML
# Service de calcul des features (app/services/ml_features.py) import numpy as np from datetime import date from typing import Optional, Dict def calculate_features(student_id: str) -> Optional[Dict]: """Calcule les features pour la classification ML d'un élève.""" # Récupérer les notes ordonnées par date grades = Grade.query.filter_by(student_id=student_id)\ .order_by(Grade.evaluation_date).all() if len(grades) < 3: return None # Pas assez de données values = [g.value for g in grades] dates = [(g.evaluation_date - grades[0].evaluation_date).days for g in grades] # Régression linéaire pour calculer la tendance slope, intercept = np.polyfit(dates, values, 1) # Calculer la couverture des compétences total_competencies = Competency.query.count() evaluated = Grade.query.filter_by(student_id=student_id)\ .distinct(Grade.competency_id).count() coverage = evaluated / total_competencies if total_competencies > 0 else 0 return { 'avg_grade': np.mean(values), # Moyenne des notes 'std_grade': np.std(values), # Écart-type 'trend_coefficient': slope, # Coefficient de tendance 'num_evaluations': len(grades), # Nombre total d'évaluations 'last_grade': values[-1], # Dernière note 'days_since_last': (date.today() - # Jours depuis dernière éval grades[-1].evaluation_date).days, 'competency_coverage': coverage, # % compétences évaluées 'improvement_rate': (values[-1] - values[0]) / len(values) # Taux d'amélioration }
8.4 Configuration du Modèle
Python - config/ml_config.py
ML_CONFIG = {
"model": {
"type": "RandomForestClassifier",
"params": {
"n_estimators": 100,
"max_depth": 10,
"min_samples_split": 5,
"min_samples_leaf": 2,
"random_state": 42,
"n_jobs": -1 # Utiliser tous les CPU
}
},
"features": [
"avg_grade",
"std_grade",
"trend_coefficient",
"num_evaluations",
"last_grade",
"days_since_last",
"competency_coverage",
"improvement_rate"
],
"target_classes": {
0: "en_difficulte", # Score < 10 ou tendance négative forte
1: "stable", # Score entre 10-14, tendance neutre
2: "en_progression" # Score > 14 ou tendance positive
},
"thresholds": {
"alert_confidence": 0.75, # Seuil pour déclencher alerte
"min_evaluations": 3, # Minimum évaluations requises
"difficulty_grade": 10.0 # Seuil de difficulté
},
"huggingface": {
"model_name": "mistralai/Mistral-7B-Instruct-v0.2",
"max_new_tokens": 500,
"temperature": 0.7,
"top_p": 0.9,
"repetition_penalty": 1.1
}
}
8.5 Configuration WhatsApp (Twilio)
Python - config/whatsapp_config.py
WHATSAPP_CONFIG = {
"account_sid": "${TWILIO_ACCOUNT_SID}", # Variable d'environnement
"auth_token": "${TWILIO_AUTH_TOKEN}", # Variable d'environnement
"from_number": "whatsapp:+14155238886", # Numéro Sandbox Twilio
"message_templates": {
"report_ready": """
🎓 *EduTrack IA - Rapport de Progression*
Bonjour,
Le rapport de progression de {student_name} est disponible.
📊 Résumé:
• Moyenne: {avg_grade}/20
• Classification: {classification}
• Tendance: {trend}
📎 Consultez le rapport complet: {pdf_url}
Cordialement,
L'équipe pédagogique
""",
"alert": """
⚠️ *Alerte EduTrack IA*
Concernant {student_name}:
{alert_message}
Nous vous invitons à consulter le tableau de bord
pour plus de détails.
📞 Contactez l'établissement si nécessaire.
""",
"weekly_summary": """
📅 *Résumé Hebdomadaire - {student_name}*
Cette semaine:
• Notes ajoutées: {new_grades_count}
• Moyenne: {weekly_avg}/20
• Évolution: {evolution}
Détails sur le portail parent.
"""
}
}
Python - services/whatsapp_service.py
from twilio.rest import Client from config.whatsapp_config import WHATSAPP_CONFIG class WhatsAppService: def __init__(self): self.client = Client( WHATSAPP_CONFIG['account_sid'], WHATSAPP_CONFIG['auth_token'] ) self.from_number = WHATSAPP_CONFIG['from_number'] def send_report(self, parent_phone: str, student_name: str, avg_grade: float, classification: str, trend: str, pdf_url: str) -> dict: """Envoie un rapport de progression via WhatsApp.""" message = WHATSAPP_CONFIG['message_templates']['report_ready'].format( student_name=student_name, avg_grade=avg_grade, classification=classification, trend=trend, pdf_url=pdf_url ) response = self.client.messages.create( from_=self.from_number, body=message, to=f'whatsapp:{parent_phone}' ) return { 'message_sid': response.sid, 'status': response.status, 'sent_at': response.date_sent } def send_alert(self, parent_phone: str, student_name: str, alert_message: str) -> dict: """Envoie une alerte urgente via WhatsApp.""" message = WHATSAPP_CONFIG['message_templates']['alert'].format( student_name=student_name, alert_message=alert_message ) response = self.client.messages.create( from_=self.from_number, body=message, to=f'whatsapp:{parent_phone}' ) return { 'message_sid': response.sid, 'status': response.status }
09
RGPD & Auth
Sécurité et Conformité
9.1 Protection des Données (RGPD)
| Mesure | Description |
|---|---|
| Minimisation | Collecter uniquement les données nécessaires |
| Pseudonymisation | IDs UUID au lieu de données identifiantes dans les logs |
| Chiffrement | HTTPS obligatoire, BDD chiffrée au repos |
| Droit d'accès | Export des données d'un élève sur demande |
| Droit à l'oubli | Suppression complète possible |
9.2 Authentification
| Acteur | Méthode |
|---|---|
| Enseignant | Session Flask + mot de passe hashé (bcrypt) |
| Parent | Code unique par élève (6 caractères) |
| API | JWT avec expiration 24h |
10
Planning · 7 Sprints (1 semaine chacun)
Planning Détaillé
10.1 Dates Clés (1 semaine par sprint)
31/03/2026
Sprint 0 — 25-31/03 ✅ TERMINÉ
Architecture validée, maquettes UI, charte graphique, Dockerfiles, Docker Compose, config GitHub
07/04/2026
Sprint 1 — 01-07/04
BDD PostgreSQL connectée, Auth fonctionnel, fixtures chargées
14/04/2026
Sprint 2 — 08-14/04
CRUD API Flask fonctionnel + pipeline ingestion CSV
21/04/2026
Sprint 3 — 15-21/04
Module IA classification Scikit-learn + visualisations
28/04/2026
Sprint 4 — 22-28/04
Dashboard Next.js complet + interface Gradio
05/05/2026
Sprint 5 — 29/04-05/05
Rapports Transformers + WhatsApp + Tests unitaires 80%
12/05/2026
Sprint 6 — 06-12/05
Intégration, Sentry monitoring, documentation, responsive mobile
19/05/2026
Sprint 7 — 13-19/05
Mode démo PFE, audit sécurité, accessibilité WCAG
13–16/05
🎓 SOUTENANCE
Présentation 10 minutes devant le jury — FQIA 2026
10.2
Sprint Goals
Chaque sprint a un objectif clair et mesurable qui guide l'équipe vers une valeur livrée en fin de semaine.
| Sprint | Dates | Goal (Objectif) | Indicateur de Succès |
|---|---|---|---|
| S0 ✅ | 25-31 Mars | Préparer les fondations: architecture validée, environnements configurés, maquettes approuvées | Tous les devs peuvent lancer le projet localement ✅ |
| S1 | 01-07 Avril | Poser le socle: authentification fonctionnelle, schéma DB stable, composants UI de base | Login/Logout opérationnel, 0 erreur console |
| S2 | 08-14 Avril | Collecter les données: saisie notes complète, gestion absences, import CSV | Un enseignant peut saisir et valider des notes |
| S3 | 15-21 Avril | Analyser avec l'IA: modèle ML intégré, prédictions visibles, alertes automatiques | API /predict retourne une prédiction en <500ms |
| S4 | 22-28 Avril | Visualiser et démontrer: dashboard analytics, Gradio démo interactive | Dashboard affiche graphiques, Gradio accessible |
| S5 | 29 Avr - 05 Mai | Communiquer et tester: rapports Transformers, WhatsApp, tests unitaires 80% | Rapport PDF généré, coverage pytest ≥ 80% |
| S6 | 06-12 Mai | Stabiliser et documenter: Sentry monitoring, guide utilisateur, responsive mobile | 0 erreur Sentry critique, doc PDF prête, mobile OK |
| S7 | 13-19 Mai | Excellence PFE: mode démo jury, audit sécurité, accessibilité WCAG | Démo 15 min prête, Lighthouse Security/A11y > 90 |
10.5
Jira Scrum
Backlog Produit Détaillé
10.5.1 Definition of Done (DoD)
Une User Story est considérée "Done" lorsque:
1. ✅ Le code est écrit et respecte les conventions du projet
2. ✅ Les tests unitaires sont écrits (couverture ≥ 80%)
3. ✅ Les tests passent sur la CI/CD
4. ✅ Le code a été reviewé par au moins 1 autre membre
5. ✅ La documentation est mise à jour (README, docstrings)
6. ✅ Les critères d'acceptation sont validés
7. ✅ Le code est mergé dans la branche develop
8. ✅ Aucune dette technique critique introduite
1. ✅ Le code est écrit et respecte les conventions du projet
2. ✅ Les tests unitaires sont écrits (couverture ≥ 80%)
3. ✅ Les tests passent sur la CI/CD
4. ✅ Le code a été reviewé par au moins 1 autre membre
5. ✅ La documentation est mise à jour (README, docstrings)
6. ✅ Les critères d'acceptation sont validés
7. ✅ Le code est mergé dans la branche develop
8. ✅ Aucune dette technique critique introduite
10.5.2 Epics du Projet
| Epic ID | Nom | Description | Stories | Total SP |
|---|---|---|---|---|
| EPIC-0 | Sprint 0 - Setup & Architecture | Configuration environnements, architecture, maquettes, Docker, GitHub | 8 | 27 |
| EPIC-1 | Authentification & Sécurité | Gestion des utilisateurs, JWT, rôles, CI/CD | 7 | 26 |
| EPIC-2 | Gestion Académique | CRUD élèves, notes, compétences, observations | 14 | 49 |
| EPIC-3 | Intelligence Artificielle | Classification ML, prédictions, features, validation | 9 | 45 |
| EPIC-4 | Dashboard & Visualisations | Next.js, graphiques Recharts, heatmaps, Gradio, optimisation | 14 | 64 |
| EPIC-5 | Rapports & Notifications | Génération PDF, HuggingFace, WhatsApp, templates | 7 | 35 |
| EPIC-6 | Data Engineering | BDD, migrations, fixtures Maroc, ETL, documentation | 8 | 34 |
| EPIC-7 | Qualité & Excellence PFE | Tests unitaires, Sentry, documentation, responsive, démo, sécurité, accessibilité | 8 | 26 |
Total: 74 Stories · ~306 Story Points · Vélocité estimée: 33 SP/sprint · 8 Sprints
10.5.3 Product Backlog avec Story Points
Principe de distribution: Chaque sprint implique les 5 membres de l'équipe avec des tâches et sous-tâches clairement définies et des descriptions détaillées.
Subtasks Jira: Chaque User Story dans Jira contient 2-3 subtasks de type
• Backend: Créer endpoint → Implémenter logique → Tester/Documenter
• Frontend: Créer composant UI → Intégrer API → Finaliser UX
• ML/IA: Préparer données → Implémenter modèle → Valider métriques
• Data: Créer schéma → Implémenter ETL → Documenter
[TASK] pour décomposer le travail:• Backend: Créer endpoint → Implémenter logique → Tester/Documenter
• Frontend: Créer composant UI → Intégrer API → Finaliser UX
• ML/IA: Préparer données → Implémenter modèle → Valider métriques
• Data: Créer schéma → Implémenter ETL → Documenter
EPIC-0: Sprint 0 - Setup & Architecture
| ID | User Story | SP | Priorité | Sprint | Assigné | Description détaillée |
|---|---|---|---|---|---|---|
| US-SETUP-1 | En tant que chef de projet, je veux définir l'architecture système | 5 | Must | S0 | Ahmed | Définir la stack technique (Flask, PostgreSQL, Streamlit), créer les diagrammes C4, établir les conventions de code, configurer le repository Git |
| US-SETUP-2 | En tant que développeur IA, je veux configurer l'environnement ML | 3 | Must | S0 | Chaimae | Installer Scikit-learn, configurer HuggingFace Transformers, créer la structure dossier models/, tester un modèle de base |
| US-SETUP-3 | En tant que développeur frontend, je veux créer les maquettes UI/UX | 5 | Must | S0 | Zakaria | Créer wireframes avec Figma/Excalidraw pour: Login, Dashboard enseignant, Fiche élève, Rapport PDF. Définir la charte graphique |
| US-SETUP-4 | En tant que data engineer, je veux configurer PostgreSQL local | 3 | Must | S0 | Ouidad | Installer PostgreSQL 15, créer BDD edutrack_dev, configurer les accès, documenter les paramètres de connexion |
| US-SETUP-5 | En tant que data engineer, je veux configurer l'environnement de dev | 3 | Must | S0 | Ahmed | Configurer venv Python 3.11, créer requirements.txt, setup pre-commit hooks, configurer VS Code settings partagés |
| US-DOCKER-1 | En tant que développeur, je veux les Dockerfiles pour tous les services | 3 | Must | S0 | Ahmed | Créer Dockerfile Flask (Python 3.11, gunicorn), Dockerfile Streamlit (dépendances UI), Dockerfile PostgreSQL (init scripts) |
| US-DOCKER-2 | En tant que développeur, je veux Docker Compose pour le dev local | 3 | Must | S0 | Ahmed | Configurer docker-compose.dev.yml avec hot-reload, volumes persistants, healthchecks, réseaux isolés, variables d'environnement |
| US-GIT-1 | En tant que chef de projet, je veux configurer le repository GitHub | 2 | Must | S0 | Ahmed | Configurer branch protection (main, develop), créer PR template, issue templates, .gitignore Python, CONTRIBUTING.md |
EPIC-1: Authentification & Sécurité
| ID | User Story | SP | Priorité | Sprint | Assigné | Description détaillée |
|---|---|---|---|---|---|---|
| US-AUTH-1 | En tant qu'utilisateur, je veux me connecter avec email/mot de passe | 5 | Must | S1 | Chaimae | Créer endpoint POST /api/auth/login, valider email/password avec bcrypt, générer JWT avec expiration 24h, retourner user_id + role + token |
| US-AUTH-2 | En tant qu'utilisateur, je veux me déconnecter en toute sécurité | 2 | Must | S1 | Chaimae | Créer endpoint POST /api/auth/logout, invalider le token côté serveur (blacklist), supprimer le refresh token si existant |
| US-AUTH-3 | En tant qu'admin, je veux créer des comptes enseignants | 5 | Must | S1 | Chaimae | Créer endpoint POST /api/users avec validation email unique, hasher password, envoyer email de bienvenue (optionnel), assigner rôle teacher |
| US-AUTH-4 | En tant que développeur, je veux les formulaires d'authentification UI | 5 | Must | S1 | Zakaria | Créer page login Streamlit avec validation côté client, gérer le stockage session_state du token, rediriger vers dashboard après login |
| US-AUTH-5 | En tant que chef de projet, je veux configurer le pipeline CI/CD | 3 | Must | S1 | Ahmed | Configurer GitHub Actions: linting (flake8), tests (pytest), build Docker, déploiement automatique sur branche main |
| US-AUTH-6 | En tant qu'admin, je veux attribuer des rôles (admin/teacher/parent) | 5 | Should | S2 | Chaimae | Créer endpoint PATCH /api/users/{id}/role, valider autorisations admin, logger les changements de rôle, mettre à jour le JWT |
| US-AUTH-7 | En tant qu'utilisateur, je veux réinitialiser mon mot de passe | 3 | Could | S5 | Ahmed | Créer endpoint POST /api/auth/reset-password, générer token temporaire 1h, envoyer email avec lien, page de reset avec nouveau mot de passe |
EPIC-2: Gestion Académique
| ID | User Story | SP | Priorité | Sprint | Assigné | Description détaillée |
|---|---|---|---|---|---|---|
| US-STU-1 | En tant qu'enseignant, je veux créer un profil élève | 3 | Must | S2 | Chaimae | Créer endpoint POST /api/students avec champs: nom, prénom, date_naissance, niveau (1AC-2BAC), classe, parent_phone. Valider unicité par classe |
| US-STU-2 | En tant qu'enseignant, je veux modifier les informations d'un élève | 2 | Must | S2 | Chaimae | Créer endpoint PUT /api/students/{id}, valider droits enseignant sur la classe, logger les modifications, retourner l'élève mis à jour |
| US-STU-3 | En tant qu'enseignant, je veux archiver un élève (soft delete) | 2 | Should | S2 | Ahmed | Créer endpoint DELETE /api/students/{id} avec is_archived=true, conserver les notes et historique, exclure des listes actives |
| US-STU-4 | En tant qu'enseignant, je veux rechercher/filtrer les élèves | 3 | Must | S2 | Ahmed | Créer endpoint GET /api/students?search=&level=&class=, implémenter recherche fulltext sur nom/prénom, pagination avec limit/offset |
| US-STU-5 | En tant qu'enseignant, je veux les formulaires CRUD élèves UI | 5 | Must | S2 | Zakaria | Créer pages Streamlit: liste élèves avec DataTable, formulaire création/édition, confirmation archivage, barre de recherche avec filtres |
| US-STU-6 | En tant qu'enseignant, je veux importer des élèves via CSV | 5 | Should | S2 | Ouidad | Créer endpoint POST /api/students/import, valider format CSV (colonnes obligatoires), détecter doublons, rapport d'import avec erreurs |
| US-GRD-1 | En tant qu'enseignant, je veux saisir une note pour un élève | 5 | Must | S2 | Chaimae | Créer endpoint POST /api/grades avec student_id, competence_id, note (0-20), type_eval, date. Valider note dans [0,20], déclencher recalcul features ML |
| US-GRD-2 | En tant qu'enseignant, je veux modifier une note existante | 3 | Must | S2 | Chaimae | Créer endpoint PUT /api/grades/{id}, vérifier droits enseignant, logger l'ancienne valeur, recalculer features ML après modification |
| US-GRD-3 | En tant qu'enseignant, je veux voir l'historique des notes d'un élève | 5 | Must | S2 | Ahmed | Créer endpoint GET /api/students/{id}/grades?from=&to=, retourner notes triées par date, groupées par matière, inclure moyenne par compétence |
| US-CMP-1 | En tant qu'enseignant, je veux créer une compétence | 3 | Must | S2 | Ahmed | Créer endpoint POST /api/competences avec nom, description, subject_id, level (collège/lycée), coefficient. Valider unicité nom par matière |
| US-CMP-2 | En tant qu'enseignant, je veux organiser les compétences par matière | 3 | Must | S2 | Chaimae | Créer endpoint GET /api/subjects/{id}/competences, implémenter arbre des compétences, permettre réorganisation drag-drop (ordre) |
| US-OBS-1 | En tant qu'enseignant, je veux ajouter une observation sur un élève | 3 | Should | S3 | Chaimae | Créer endpoint POST /api/observations avec student_id, category, content, date. Catégories: comportement, participation, progrès, alerte |
| US-OBS-2 | En tant qu'enseignant, je veux catégoriser les observations | 2 | Should | S3 | Chaimae | Créer CRUD catégories observations, permettre filtrage par catégorie, couleur-code pour chaque catégorie dans l'UI |
EPIC-3: Intelligence Artificielle
| ID | User Story | SP | Priorité | Sprint | Assigné | Description détaillée |
|---|---|---|---|---|---|---|
| US-ML-1 | En tant que système, je veux calculer les features ML d'un élève | 8 | Must | S3 | Chaimae | Créer service calculate_features() avec: moyenne_globale, ecart_type, tendance (régression), nb_notes, taux_presence, nb_alertes. Retourner vecteur numpy |
| US-ML-2 | En tant que système, je veux classifier un élève (en difficulté/stable/progression) | 8 | Must | S3 | Chaimae | Implémenter pipeline Scikit-learn: StandardScaler → RandomForestClassifier. Classes: 0=en_difficulté, 1=stable, 2=en_progression. Sauver modèle pickle |
| US-ML-3 | En tant qu'enseignant, je veux voir la prédiction IA pour chaque élève | 5 | Must | S3 | Zakaria | Créer composant Streamlit PredictionCard: classe prédite avec badge couleur, score confiance en %, icône indicateur, tooltip explicatif |
| US-ML-4 | En tant que chef de projet, je veux intégrer l'API ML au système | 5 | Must | S3 | Ahmed | Créer endpoints ML: GET /api/predictions/{student_id}, POST /api/predictions/batch. Gérer cache prédictions, invalider après nouvelle note |
| US-ML-5 | En tant que data engineer, je veux valider les données pour le ML | 3 | Must | S3 | Ouidad | Créer script validation_data.py: vérifier completude notes, détecter outliers, rapport qualité données, suggestions de nettoyage |
| US-ML-6 | En tant que data engineer, je veux préparer le dataset d'entraînement | 3 | Must | S3 | Taoufiq | Créer script prepare_training_data.py: extraire features, labéliser données historiques, split train/test 80/20, exporter CSV/Parquet |
| US-ML-7 | En tant que système, je veux entraîner le modèle avec les nouvelles données | 5 | Should | S4 | Chaimae | Créer endpoint POST /api/ml/retrain (admin only), entraîner avec données récentes, comparer avec modèle existant, rollback si dégradation |
| US-ML-8 | En tant qu'enseignant, je veux voir le score de confiance de la prédiction | 3 | Should | S4 | Zakaria | Afficher probabilités par classe en bar chart, highlighter classe prédite, afficher seuil de confiance minimal (75%), warning si < seuil |
| US-ML-9 | En tant qu'admin, je veux voir les métriques du modèle (précision, rappel) | 5 | Could | S5 | Chaimae | Créer page admin métriques ML: matrice confusion, precision/recall/f1 par classe, courbe ROC, dashboard comparatif versions modèle |
EPIC-4: Dashboard & Visualisations
| ID | User Story | SP | Priorité | Sprint | Assigné | Description détaillée |
|---|---|---|---|---|---|---|
| US-DASH-1 | En tant qu'enseignant, je veux voir un dashboard avec les KPIs de ma classe | 8 | Must | S4 | Zakaria | Créer layout Streamlit avec cards: nb élèves total, moyenne classe, nb alertes, progression mensuelle. Utiliser st.metric() avec delta |
| US-DASH-2 | En tant qu'enseignant, je veux voir une heatmap des compétences par classe | 5 | Must | S4 | Zakaria | Créer heatmap Plotly: axe X = élèves, axe Y = compétences, couleur = moyenne. Filtres par matière, niveau. Tooltip avec détails note |
| US-DASH-3 | En tant qu'enseignant, je veux voir un graphique radar pour un élève | 5 | Must | S4 | Zakaria | Créer radar chart Plotly: 6-8 compétences principales, comparaison avec moyenne classe en overlay, export PNG possible |
| US-DASH-4 | En tant qu'enseignant, je veux voir la courbe de progression d'un élève | 5 | Must | S4 | Zakaria | Créer line chart: évolution moyenne sur temps, annotation des évaluations importantes, ligne de tendance (régression linéaire) |
| US-DASH-5 | En tant qu'enseignant, je veux voir les alertes élèves en difficulté | 5 | Must | S4 | Zakaria | Créer liste d'alertes triées par sévérité: rouge (urgent), orange (attention), jaune (surveillance). Lien vers fiche élève, actions rapides |
| US-DASH-6 | En tant que chef de projet, je veux optimiser les performances dashboard | 3 | Must | S4 | Ahmed | Implémenter cache Redis pour KPIs, lazy loading des graphiques, pagination des listes, compression des réponses API |
| US-DASH-7 | En tant que développeur, je veux les endpoints Dashboard | 5 | Must | S4 | Chaimae | Créer GET /api/analytics/kpis, GET /api/analytics/heatmap, GET /api/analytics/progression/{id}. Optimiser queries SQL avec agrégations |
| US-DASH-8 | En tant que data engineer, je veux seeder les données de démo dashboard | 3 | Must | S4 | Ouidad | Créer script seed_demo_data.py: 50 élèves, 6 mois de notes, cas variés (progression, difficulté, stable), données réalistes Maroc |
| US-DASH-9 | En tant que data engineer, je veux documenter l'API Dashboard | 3 | Must | S4 | Taoufiq | Créer documentation Swagger/OpenAPI: endpoints, paramètres, exemples réponses, codes erreur, limites de rate |
| US-DASH-10 | En tant que parent, je veux voir un dashboard simplifié de mon enfant | 5 | Should | S5 | Zakaria | Créer vue parent Streamlit: KPIs simplifiés, radar compétences, dernières notes, recommandations IA en langage accessible |
| US-DASH-11 | En tant que parent, je veux voir le graphique radar de mon enfant | 3 | Should | S5 | Zakaria | Réutiliser composant radar existant, adapter textes pour parents, ajouter légende explicative des compétences |
| US-DASH-12 | En tant qu'enseignant, je veux filtrer le dashboard par période | 3 | Could | S6 | Ahmed | Ajouter date picker: aujourd'hui, cette semaine, ce mois, ce trimestre, personnalisé. Recalculer tous les KPIs selon période |
| US-GRADIO-1 | En tant que jury PFE, je veux une interface Gradio interactive | 5 | Must | S4 | Chaimae | Créer interface démo Gradio (port 7860): saisir features élève, voir prédiction temps réel, probabilités par classe, design cohérent EduTrack |
| US-GRADIO-2 | En tant que jury PFE, je veux des exemples préchargés Gradio | 3 | Must | S4 | Zakaria | Ajouter 3-5 exemples: élève en difficulté, stable, progression. gr.Examples() avec labels explicatifs, tab À propos avec explication modèle |
EPIC-5: Rapports & Notifications
| ID | User Story | SP | Priorité | Sprint | Assigné | Description détaillée |
|---|---|---|---|---|---|---|
| US-RPT-1 | En tant qu'enseignant, je veux générer un rapport PDF avec l'IA | 8 | Must | S5 | Chaimae | Créer service generate_report(): collecter données élève, appeler HuggingFace pour texte bienveillant, générer PDF avec ReportLab, inclure graphiques |
| US-RPT-2 | En tant qu'enseignant, je veux envoyer le rapport par WhatsApp | 8 | Must | S5 | Ahmed | Intégrer Twilio WhatsApp API: envoyer PDF en pièce jointe, message personnalisé avec nom élève, gérer erreurs (numéro invalide), retry 3x |
| US-RPT-3 | En tant que système, je veux envoyer des alertes automatiques aux parents | 5 | Should | S5 | Ahmed | Créer cron job quotidien: détecter élèves en difficulté (score ML < 0.3), envoyer notification WhatsApp/SMS, éviter spam (max 1/semaine) |
| US-RPT-4 | En tant que parent, je veux télécharger le rapport PDF | 3 | Should | S5 | Zakaria | Créer bouton téléchargement sur dashboard parent, stocker rapports en BDD/S3, servir via endpoint sécurisé avec token temporaire |
| US-RPT-5 | En tant que data engineer, je veux créer les templates de rapports | 3 | Must | S5 | Ouidad | Créer templates HTML/Jinja2 pour rapport: en-tête école, sections (infos élève, graphiques, texte IA, recommandations), footer signature |
| US-RPT-6 | En tant que data engineer, je veux tester l'intégration end-to-end | 3 | Must | S5 | Taoufiq | Créer tests E2E: scénario complet login→saisie→génération→envoi, mock Twilio en test, vérifier contenu PDF, assertion messages WhatsApp |
| US-RPT-7 | En tant qu'enseignant, je veux voir l'historique des rapports envoyés | 5 | Could | S6 | Ahmed | Créer page historique: liste rapports par date, statut envoi (envoyé/échec/lu), lien vers PDF, bouton renvoyer, filtres par élève/période |
EPIC-6: Data Engineering
| ID | User Story | SP | Priorité | Sprint | Assigné | Description détaillée |
|---|---|---|---|---|---|---|
| US-DATA-1 | En tant que développeur, je veux une BDD PostgreSQL configurée | 5 | Must | S1 | Ouidad | Créer schéma BDD: tables users, students, grades, competences, subjects, observations, ai_predictions, reports. Définir contraintes FK, index |
| US-DATA-2 | En tant que développeur, je veux les migrations Alembic en place | 5 | Must | S1 | Chaimae | Configurer Alembic avec flask-migrate, créer migration initiale, documenter commandes (upgrade/downgrade), intégrer dans CI/CD |
| US-DATA-3 | En tant que développeur, je veux les fixtures des matières marocaines | 5 | Must | S1 | Ouidad | Créer fixtures JSON matières MEN Maroc: Maths, Physique-Chimie, SVT, Français, Arabe, Anglais, Histoire-Géo, Islamique, Philosophie (bac) |
| US-DATA-4 | En tant que développeur, je veux les fixtures des compétences collège | 5 | Must | S1 | Taoufiq | Créer fixtures compétences 1AC-3AC par matière: ~80 compétences total, structurées par chapitre, avec descriptions et coefficients |
| US-DATA-5 | En tant que développeur, je veux les fixtures des compétences lycée | 5 | Must | S1 | Ouidad | Créer fixtures compétences TC-2BAC par filière: Sciences Maths, PC, SVT, Économie, Lettres. ~120 compétences avec coefficients Bac |
| US-DATA-6 | En tant que développeur, je veux des données de test réalistes | 3 | Must | S2 | Taoufiq | Créer script Faker generate_test_data.py: 100 élèves, 6 mois notes, distribution gaussienne, cas limites (échec, excellence, progression) |
| US-DATA-7 | En tant que développeur, je veux un script de seed pour la démo | 3 | Should | S6 | Ouidad | Créer seed_demo.py: jeu de données cohérent pour présentation, 3 classes complètes, cas d'usage variés, données anonymisées mais réalistes |
| US-DATA-8 | En tant que développeur, je veux la doc des sources MEN Maroc | 3 | Should | S2 | Taoufiq | Documenter sources officielles: liens PDF programmes, tableaux coefficients Bac, référentiel compétences, dates validité programmes |
EPIC-7: Qualité & Excellence PFE
| ID | User Story | SP | Priorité | Sprint | Assigné | Description détaillée |
|---|---|---|---|---|---|---|
| US-TEST-1 | En tant que chef de projet, je veux des tests unitaires API Flask | 5 | Must | S5 | Taoufiq | Créer tests pytest pour endpoints auth, students, grades, analytics. pytest-cov avec coverage min 80%, fixtures données test |
| US-TEST-2 | En tant que data scientist, je veux des tests unitaires ML | 3 | Must | S5 | Chaimae | Tests feature extraction, classification, edge cases (notes vides, outliers). numpy.testing, reproductibilité avec seed fixe |
| US-MON-1 | En tant que chef de projet, je veux intégrer Sentry | 3 | Should | S6 | Ahmed | Configurer sentry-sdk Flask/Streamlit, alertes email, DSN en variable environnement, release tracking Git |
| US-DOC-1 | En tant qu'enseignant, je veux un guide utilisateur | 3 | Should | S6 | Ouidad | Page Aide dashboard: guide démarrage rapide, FAQ 10+ questions, captures annotées, export PDF |
| US-RESP-1 | En tant qu'enseignant mobile, je veux un dashboard responsive | 2 | Should | S6 | Ahmed | Tests mobile/tablette, corrections CSS, navigation tactile, graphiques lisibles petit écran, cross-browser |
| US-DEMO-1 | En tant que jury PFE, je veux un mode démonstration guidé | 5 | Must | S7 | Ahmed | Script démo 15-20 min, parcours complet Login→Dashboard→Prédiction→Rapport, bouton Reset, mode présentation |
| US-SEC-1 | En tant que chef de projet, je veux un audit sécurité | 3 | Should | S7 | Taoufiq | Audit OWASP Top 10, protection CSRF/XSS, headers sécurité CSP, Flask-Talisman, rapport documenté |
| US-A11Y-1 | En tant qu'utilisateur, je veux une interface accessible WCAG | 2 | Could | S7 | Ouidad | Audit contraste couleurs 4.5:1, labels ARIA, navigation clavier, Lighthouse Accessibility > 90 |
10.5.4 Critères d'Acceptation Détaillés
US-AUTH-1: Connexion utilisateur
Critères d'Acceptation (Given/When/Then)
# Scénario 1: Connexion réussie Given un utilisateur avec email "prof@edutrack.ma" et mot de passe valide When il soumet le formulaire de connexion Then il reçoit un token JWT valide And il est redirigé vers le dashboard And son dernier login est mis à jour en BDD # Scénario 2: Connexion échouée (mauvais mot de passe) Given un utilisateur avec email valide mais mauvais mot de passe When il soumet le formulaire de connexion Then il reçoit une erreur 401 And le message "Email ou mot de passe incorrect" s'affiche And aucun token n'est généré # Scénario 3: Compte désactivé Given un utilisateur avec is_active = false When il soumet le formulaire de connexion Then il reçoit une erreur 403 And le message "Compte désactivé" s'affiche
US-GRD-1: Saisie d'une note
Critères d'Acceptation (Given/When/Then)
# Scénario 1: Saisie réussie Given un enseignant connecté And un élève "Ahmed Benali" de la classe "3AC-A" And une compétence "Équations du 1er degré" When il saisit la note 15/20 pour l'évaluation "Contrôle" du 2025-03-20 Then la note est enregistrée en BDD And les features ML de l'élève sont recalculées And un message de succès s'affiche And le graphique de progression est mis à jour # Scénario 2: Note invalide Given un enseignant connecté When il saisit une note de 25/20 (hors limite) Then une erreur de validation s'affiche And la note n'est pas enregistrée # Scénario 3: Élève non trouvé Given un student_id invalide When l'enseignant tente de saisir une note Then une erreur 404 est retournée
US-ML-2: Classification élève
Critères d'Acceptation (Given/When/Then)
# Scénario 1: Classification réussie Given un élève avec au moins 3 notes enregistrées When le système calcule sa classification Then il retourne une des 3 classes: "en_difficulte", "stable", "en_progression" And un score de confiance entre 0 et 1 And la prédiction est sauvegardée dans ai_predictions # Scénario 2: Données insuffisantes Given un élève avec moins de 3 notes When le système tente de classifier Then il retourne None And un message "Données insuffisantes" est loggé # Scénario 3: Précision du modèle Given le jeu de données de test When le modèle est évalué Then la précision est >= 75%
US-RPT-1: Génération rapport PDF
Critères d'Acceptation (Given/When/Then)
# Scénario 1: Génération réussie Given un enseignant connecté And un élève avec des notes et une classification ML When il clique sur "Générer rapport" Then le rapport PDF est généré en moins de 10 secondes And le rapport contient: infos élève, graphique radar, texte IA bienveillant And le rapport est sauvegardé dans la table reports # Scénario 2: Texte IA généré Given les données de l'élève formatées dans le prompt When HuggingFace génère le texte Then le texte fait 3-4 paragraphes And le ton est bienveillant et constructif And des recommandations concrètes sont incluses
10.5.5 Subtasks Techniques par Story
Convention Subtasks: Chaque subtask inclut une description détaillée permettant au développeur de comprendre exactement ce qu'il doit faire.
US-SETUP-1: Architecture Système (Sprint 0) - 5 SP
| Subtask | Description Détaillée | Assigné | Heures |
|---|---|---|---|
| ST-0.1 | [Arch] Créer diagramme C4 niveau Context: système EduTrack, utilisateurs (enseignant, parent, admin), systèmes externes (WhatsApp, HuggingFace) | Ahmed | 2h |
| ST-0.2 | [Arch] Créer diagramme C4 niveau Container: Flask API, PostgreSQL, Streamlit Frontend, ML Service, fichier PDF | Ahmed | 2h |
| ST-0.3 | [Doc] Définir conventions de code: PEP8 Python, docstrings Google style, commits conventionnels (feat/fix/docs) | Ahmed | 1h |
| ST-0.4 | [Git] Créer repository GitHub avec .gitignore Python, README.md, structure dossiers (api/, frontend/, ml/, data/) | Ahmed | 1h |
| ST-0.5 | [Doc] Rédiger ADR (Architecture Decision Records) pour choix techniques majeurs | Ahmed | 2h |
US-DATA-1: Configuration PostgreSQL (Sprint 1) - 5 SP
| Subtask | Description Détaillée | Assigné | Heures |
|---|---|---|---|
| ST-D1.1 | [BDD] Installer PostgreSQL 15, créer user edutrack_user avec password sécurisé, créer BDD edutrack_dev | Ouidad | 1h |
| ST-D1.2 | [BDD] Créer schéma tables: users (id, email, password_hash, role, is_active, created_at, last_login) | Ouidad | 2h |
| ST-D1.3 | [BDD] Créer tables: students (id, first_name, last_name, birth_date, level, class_name, parent_phone, teacher_id FK) | Ouidad | 2h |
| ST-D1.4 | [BDD] Créer tables: subjects, competences (FK subject), grades (FK student, competence), observations (FK student) | Ouidad | 3h |
| ST-D1.5 | [BDD] Créer tables: ai_predictions (FK student, class, confidence, created_at), reports (FK student, pdf_path, sent_at) | Ouidad | 2h |
| ST-D1.6 | [BDD] Créer index: idx_students_level, idx_grades_student_date, idx_predictions_student. Documenter ERD | Ouidad | 2h |
US-DATA-3: Fixtures Matières Marocaines (Sprint 1) - 5 SP
| Subtask | Description Détaillée | Assigné | Heures |
|---|---|---|---|
| ST-D3.1 | [Data] Créer JSON fixtures matières collège: Mathématiques, Physique-Chimie, SVT, Français, Arabe, Anglais, Histoire-Géo, Éducation Islamique | Ouidad | 3h |
| ST-D3.2 | [Data] Créer JSON fixtures matières lycée: ajouter Philosophie (2BAC), Économie (filière), Sciences de l'Ingénieur (SM) | Ouidad | 2h |
| ST-D3.3 | [Data] Ajouter coefficients Bac par filière: SM (Maths=9, Physique=7), PC (Physique=7, Chimie=5), SVT (SVT=7) | Ouidad | 2h |
| ST-D3.4 | [Script] Créer script load_fixtures.py avec validation JSON Schema, insert/update idempotent | Ouidad | 2h |
| ST-D3.5 | [Doc] Documenter sources officielles MEN utilisées, dates de validité des programmes | Ouidad | 1h |
US-DATA-4: Fixtures Compétences Collège (Sprint 1) - 5 SP
| Subtask | Description Détaillée | Assigné | Heures |
|---|---|---|---|
| ST-D4.1 | [Data] Créer compétences Maths 1AC-3AC: Nombres et calculs, Géométrie, Grandeurs et mesures, Organisation de données (~30 items) | Taoufiq | 3h |
| ST-D4.2 | [Data] Créer compétences Français 1AC-3AC: Lecture, Écriture, Grammaire, Conjugaison, Vocabulaire (~25 items) | Taoufiq | 2h |
| ST-D4.3 | [Data] Créer compétences Sciences (PC+SVT) 1AC-3AC: Matière, Électricité, Mécanique, Vie et Terre (~25 items) | Taoufiq | 2h |
| ST-D4.4 | [Data] Créer compétences Langues (Arabe, Anglais) 1AC-3AC: Compréhension, Expression, Grammaire (~20 items) | Taoufiq | 2h |
| ST-D4.5 | [Script] Implémenter validation hiérarchie: matière → chapitre → compétence, contrôle unicité codes | Taoufiq | 1h |
US-AUTH-1: Connexion Utilisateur (Sprint 1) - 5 SP
| Subtask | Description Détaillée | Assigné | Heures |
|---|---|---|---|
| ST-A1.1 | [Backend] Créer endpoint POST /api/auth/login: recevoir {email, password}, valider format email regex | Chaimae | 2h |
| ST-A1.2 | [Backend] Implémenter vérification password avec bcrypt.checkpw(), gérer cas utilisateur inexistant (même message erreur) | Chaimae | 1h |
| ST-A1.3 | [Backend] Générer JWT avec PyJWT: payload {user_id, role, exp}, clé secrète depuis .env, expiration 24h | Chaimae | 2h |
| ST-A1.4 | [Backend] Mettre à jour last_login en BDD après connexion réussie, retourner {token, user: {id, email, role}} | Chaimae | 0.5h |
| ST-A1.5 | [Frontend] Créer page login Streamlit: formulaire email/password, bouton connexion, lien mot de passe oublié | Zakaria | 2h |
| ST-A1.6 | [Frontend] Stocker token dans st.session_state['token'], créer fonction is_authenticated(), redirect si non connecté | Zakaria | 1h |
| ST-A1.7 | [Frontend] Implémenter redirection vers dashboard après login réussi, afficher message erreur si échec | Zakaria | 0.5h |
| ST-A1.8 | [Test] Tests unitaires pytest: test_login_success, test_login_wrong_password, test_login_user_not_found | Chaimae | 1h |
| ST-A1.9 | [Test] Tests E2E Selenium/Playwright: scénario connexion complète, vérifier redirection et présence token | Zakaria | 1h |
US-ML-2: Classification ML Élève (Sprint 3) - 8 SP
| Subtask | Description Détaillée | Assigné | Heures |
|---|---|---|---|
| ST-ML2.1 | [ML] Créer calculate_features(student_id): extraire moyenne_globale, ecart_type, pente_regression, nb_notes, derniere_note, nb_alertes | Chaimae | 3h |
| ST-ML2.2 | [ML] Implémenter pipeline Scikit-learn: StandardScaler → RandomForestClassifier(n_estimators=100, max_depth=10) | Chaimae | 4h |
| ST-ML2.3 | [ML] Créer classify_student(student_id): appeler features, prédire classe (0=difficulté, 1=stable, 2=progression), retourner proba | Chaimae | 2h |
| ST-ML2.4 | [Backend] Créer endpoint GET /api/students/{id}/prediction: appeler classify_student, formater réponse JSON | Chaimae | 1h |
| ST-ML2.5 | [Backend] Sauvegarder prédiction dans ai_predictions: student_id, predicted_class, confidence, features_json, created_at | Chaimae | 1h |
| ST-ML2.6 | [Data] Préparer dataset entraînement: extraire features élèves historiques, labéliser manuellement 200 exemples | Taoufiq | 2h |
| ST-ML2.7 | [Test] Tests unitaires: test_calculate_features_returns_array, test_classify_returns_valid_class | Chaimae | 2h |
| ST-ML2.8 | [Test] Test précision modèle: cross_val_score >= 0.75, matrice confusion équilibrée | Chaimae | 1h |
US-DASH-1: Dashboard Enseignant KPIs (Sprint 4) - 8 SP
| Subtask | Description Détaillée | Assigné | Heures |
|---|---|---|---|
| ST-DSH1.1 | [Frontend] Créer layout Streamlit: sidebar navigation, header avec nom enseignant, zone principale 3 colonnes | Zakaria | 2h |
| ST-DSH1.2 | [Frontend] Composant KPI cards avec st.metric(): Nb élèves, Moyenne classe, Nb alertes, Progression %. Delta coloré | Zakaria | 2h |
| ST-DSH1.3 | [Frontend] Intégrer heatmap Plotly: px.imshow(data), axe X élèves, axe Y compétences, colorscale RdYlGn | Zakaria | 3h |
| ST-DSH1.4 | [Frontend] Liste alertes: st.dataframe() trié par sévérité, colonnes (Élève, Type, Date, Action), bouton "Voir détail" | Zakaria | 2h |
| ST-DSH1.5 | [Backend] Endpoint GET /api/analytics/dashboard?teacher_id=: calculer KPIs agrégés, retourner JSON structuré | Chaimae | 2h |
| ST-DSH1.6 | [Backend] Optimiser queries SQL avec GROUP BY, sous-requêtes, index. Cache Redis 5 min pour KPIs | Chaimae | 2h |
| ST-DSH1.7 | [Data] Créer données démo: 50 élèves répartis en 3 classes, 6 mois de notes, cas variés | Ouidad | 2h |
| ST-DSH1.8 | [Test] Tests rendu Streamlit: vérifier présence éléments DOM, données affichées correctes | Zakaria | 1h |
US-RPT-1: Génération Rapport PDF (Sprint 5) - 8 SP
| Subtask | Description Détaillée | Assigné | Heures |
|---|---|---|---|
| ST-RPT1.1 | [Backend] Créer service generate_report(student_id): collecter données élève (infos, notes, compétences, prédiction ML) | Chaimae | 2h |
| ST-RPT1.2 | [ML] Appeler HuggingFace API (text-generation): prompt avec données élève, demander texte bienveillant 3-4 paragraphes | Chaimae | 3h |
| ST-RPT1.3 | [Backend] Générer PDF avec ReportLab: en-tête école, section infos élève, graphique radar (matplotlib→bytes), texte IA | Chaimae | 4h |
| ST-RPT1.4 | [Backend] Sauvegarder PDF: stockage fichier (S3 ou local), enregistrer path dans table reports avec student_id, created_at | Chaimae | 1h |
| ST-RPT1.5 | [Data] Créer template Jinja2 HTML pour PDF: styles CSS inline, placeholders pour données dynamiques | Ouidad | 2h |
| ST-RPT1.6 | [Frontend] Bouton "Générer rapport" sur fiche élève, spinner pendant génération, afficher aperçu PDF | Zakaria | 2h |
| ST-RPT1.7 | [Test] Tests génération: mock HuggingFace, vérifier structure PDF, temps < 10s | Taoufiq | 2h |
10.5.6 Mapping des Dépendances
Dépendances entre User Stories
# Sprint 1 - Fondations (pas de dépendances) US-DATA-1 (BDD) ──────────────────────────────────────┐ US-DATA-2 (Migrations) ───────────────────────────────┤ US-DATA-3 (Fixtures matières) ────────────────────────┼──→ Sprint 2 peut commencer US-DATA-4 (Fixtures compétences collège) ─────────────┤ US-DATA-5 (Fixtures compétences lycée) ───────────────┘ # Sprint 1 → Sprint 2 US-AUTH-1 (Login) ────────────────────────────────────┐ US-AUTH-2 (Logout) ───────────────────────────────────┼──→ US-STU-* (CRUD élèves) US-AUTH-3 (Créer comptes) ────────────────────────────┘ US-GRD-* (CRUD notes) # Sprint 2 → Sprint 3 US-STU-1 (Créer élève) ───────────────────────────────┐ US-GRD-1 (Saisir note) ───────────────────────────────┼──→ US-ML-1 (Features ML) US-CMP-1 (Créer compétence) ──────────────────────────┘ US-ML-2 (Classification) # Sprint 3 → Sprint 4 US-ML-1 (Features ML) ────────────────────────────────┐ US-ML-2 (Classification) ─────────────────────────────┼──→ US-DASH-* (Dashboard) US-ML-3 (Voir prédiction) ────────────────────────────┘ US-DASH-5 (Alertes) # Sprint 4 → Sprint 5 US-DASH-1 (Dashboard) ────────────────────────────────┐ US-DASH-3 (Radar) ────────────────────────────────────┼──→ US-RPT-1 (Rapport PDF) US-ML-2 (Classification) ─────────────────────────────┘ US-RPT-2 (WhatsApp) # Stories Indépendantes (peuvent être faites en parallèle) US-STU-5 (Import CSV) ← indépendant après US-DATA-* US-OBS-1 (Observations) ← indépendant après US-STU-1 US-AUTH-5 (Reset password) ← indépendant après US-AUTH-1
10.5.7 Répartition par Membre et Sprint
Équité garantie: Chaque sprint implique les 5 membres avec des tâches adaptées à leurs compétences. Workload équilibré (~12 stories par membre).
| Sprint | Dates | Ahmed Chef/Full-stack | Chaimae IA+Backend | Zakaria IA+Frontend | Ouidad Data Engineer | Taoufiq Data Engineer |
|---|---|---|---|---|---|---|
| S0 | 25-31/03 | Architecture (5) | Setup ML (3) | Maquettes UI (5) | Setup PostgreSQL (3) | Setup Dev Env (3) |
| S1 | 01-07/04 | CI/CD Pipeline (3) | Auth Backend (12) | Auth UI Forms (5) | BDD+Fixtures (10) | Migrations+Fixtures (10) |
| S2 | 08-14/04 | Recherche/Filtres (6) | CRUD Backend (10) | CRUD UI Forms (5) | Import CSV+Archivage (7) | Data test+Edit (8) |
| S3 | 15-21/04 | API ML Intégration (5) | ML Pipeline (16) | Prédiction UI (5) | Observations+Valid (6) | Dataset Prep+Cat (5) |
| S4 | 22-28/04 | Optimisation (3) | Retrain+Endpoints (10) | Dashboard UI (28) | Seeds Dashboard (3) | Endpoints+Doc (8) |
| S5 | 29/04-05/05 | WhatsApp+Alertes (13) | Rapports+ML (11) | Parent UI (11) | Templates (3) | Tests E2E (3) |
| S6 | 06-12/05 | Filtres+Historique (8) | Tests Backend (5) | Tests UI (5) | Seed Démo (3) | Doc Finale (3) |
| TOTAL | ~43 SP (11) | ~67 SP (12) | ~64 SP (13) | ~35 SP (12) | ~40 SP (13) |
Vélocité moyenne: ~37 SP/sprint · Total: 61 stories · 7 Sprints (25/03/2026 - 12/05/2026)
Légende des responsabilités par sprint
| Sprint | Objectif Principal | Livrables Clés | Critères de Validation |
|---|---|---|---|
| S0 | Préparation et planification | Architecture validée, environnements configurés, maquettes approuvées | Tous les outils installés, repository créé, équipe alignée |
| S1 | Fondations techniques | Auth fonctionnelle, BDD créée, fixtures chargées | Login/logout OK, 100% tests Auth, données Maroc en BDD |
| S2 | CRUD académique complet | Gestion élèves/notes/compétences | CRUD complet testé, import CSV OK, UI responsive |
| S3 | Intelligence Artificielle | Modèle ML entraîné, prédictions fonctionnelles | Précision ≥75%, prédictions affichées, pipeline documenté |
| S4 | Visualisations et Dashboard | Dashboard enseignant complet | KPIs temps réel, graphiques interactifs, alertes visibles |
| S5 | Rapports et Notifications | Génération PDF, envoi WhatsApp | PDF généré <10s, WhatsApp envoyé, texte IA bienveillant |
| S6 | Finalisation | Tests complets, documentation | Couverture tests ≥80%, doc complète, démo prête |
| S7 | Intégration et Stabilisation | Version finale stable | 0 bugs critiques, déploiement OK, présentation validée |
11
Organisation
Équipe et Responsabilités
11.1 Composition de l'Équipe
| Membre | Rôle | Responsabilités Principales |
|---|---|---|
| Ahmed | Chef de Projet / Frontend + Backend | Coordination équipe, architecture système, développement full-stack, rapport final |
| Chaimae | IA + Backend | Modèles ML Scikit-learn, Flask API, Transformers HuggingFace, intégration |
| Zakaria | IA + Frontend | Interface Next.js/Gradio, visualisations ML (Recharts), composants dashboard, UX |
| Ouidad | Data Engineer | BDD PostgreSQL, collecte données éducatives Maroc, fixtures JSON, seed |
| Taoufiq | Data Engineer | Pipelines ETL, migrations Alembic, génération données test, documentation |
11.2 Matrice RACI
| Tâche | Ahmed | Chaimae | Zakaria | Ouidad | Taoufiq |
|---|---|---|---|---|---|
| Architecture | R | A | C | I | I |
| BDD PostgreSQL | A | C | I | R | R |
| API Flask | C | R | I | I | I |
| ML Classification | A | R | C | I | I |
| Génération Rapports | A | R | C | I | I |
| Dashboard Next.js | C | C | R | I | I |
| Visualisations ML | C | C | R | I | I |
| Collecte Données Maroc | I | I | I | R | R |
| Tests E2E | A | R | C | C | C |
| Documentation | R | C | C | C | C |
| Présentation | R | A | A | A | A |
R = Responsable · A = Accountable · C = Consulté · I = Informé
12
Deliverables
Livrables
| # | Livrable | Format | Date Limite |
|---|---|---|---|
| L1 | Dépôt GitHub documenté | Repository public | 15/05/2026 |
| L2 | README.md complet | Markdown | 08/05/2026 |
| L3 | Documentation API | Markdown / Swagger | 08/05/2026 |
| L4 | Prototype fonctionnel | Application déployable | 15/05/2026 |
| L5 | Rapport technique (10–15 pages) | PDF | 15/05/2026 |
| L6 | Slides présentation 10 min | PowerPoint / PDF | 15/05/2026 |
| L7 | Script de démo jury | Markdown | 15/05/2026 |
13
Validation
Critères d'Acceptation
13.1 Critères Fonctionnels
| Module | Critère | Validation |
|---|---|---|
| Module 1 | CRUD élèves fonctionnel | 100% tests passent |
| Module 1 | CRUD notes fonctionnel | 100% tests passent |
| Module 1 | CRUD observations fonctionnel | 100% tests passent |
| Module 2 | Classification précision > 75% | Métriques affichées |
| Module 2 | Graphiques Radar + Courbe + Heatmap | Rendus dans Next.js |
| Module 3 | Rapport généré en < 10s | Temps mesuré |
| Module 3 | WhatsApp envoyé avec succès | Log de confirmation |
13.2 Critères Non-Fonctionnels
| Critère | Cible | Outil de Mesure |
|---|---|---|
| Couverture tests | > 80% | pytest-cov |
| Temps réponse API | < 500ms | Locust / k6 |
| Documentation | Complète | Revue équipe |
13.3 Scénarios de Tests E2E
| # | Scénario | Étapes | Résultat attendu |
|---|---|---|---|
| 1 | Login enseignant | 1. Accéder /login 2. Entrer credentials 3. Soumettre |
Dashboard affiché, token JWT stocké |
| 2 | Ajouter un élève | 1. Clic "Nouvel élève" 2. Remplir formulaire 3. Valider |
Élève créé en BDD, affiché dans liste |
| 3 | Saisir une note | 1. Sélectionner élève 2. Remplir formulaire 3. Valider |
Note en BDD, ML mis à jour, graphe actualisé |
| 4 | Générer rapport IA | 1. Sélectionner élève 2. Clic "Générer rapport" 3. Attendre |
PDF disponible en < 10s, texte IA pertinent |
| 5 | Envoyer WhatsApp | 1. Ouvrir rapport 2. Clic "Envoyer WhatsApp" |
Message reçu par parent, log confirmé |
| 6 | Consulter alertes | 1. Accéder dashboard 2. Voir section alertes |
Alertes triées par sévérité, données correctes |
| 7 | Vue parent | 1. Connexion parent 2. Voir progression |
Données enfant uniquement, graphes lisibles |
| 8 | Export RGPD | 1. Ouvrir fiche élève 2. Clic "Export données" |
JSON + PDF complet généré |
13.4 Critères de Performance
| Métrique | Cible | Critique | Outil |
|---|---|---|---|
| Temps réponse API (p95) | < 500ms | < 2s | Locust / k6 |
| Temps requête BDD | < 100ms | < 500ms | pg_stat_statements |
| Génération rapport | < 10s | < 30s | Logs application |
| Classification ML | < 200ms | < 1s | Profiler Python |
| Couverture tests | > 80% | > 60% | pytest-cov |
| Disponibilité | 99.5% | 99% | Monitoring |
| Utilisateurs simultanés | 50 | 20 | Load testing |
13.5 Structure des Tests
Structure tests/
tests/ ├── unit/ │ ├── test_models.py # Tests modèles SQLAlchemy │ ├── test_schemas.py # Tests validation Marshmallow │ ├── test_ml_features.py # Tests calcul features ML │ └── test_classification.py # Tests pipeline ML ├── integration/ │ ├── test_api_students.py # Tests CRUD élèves │ ├── test_api_grades.py # Tests CRUD notes │ ├── test_api_analytics.py # Tests endpoints analytics │ ├── test_api_reports.py # Tests génération rapports │ └── test_whatsapp.py # Tests intégration Twilio ├── e2e/ │ ├── test_teacher_flow.py # Parcours enseignant complet │ ├── test_parent_flow.py # Parcours parent │ └── test_report_flow.py # Génération + envoi rapport ├── fixtures/ │ ├── students.json # Données test élèves │ ├── grades.json # Données test notes │ └── competencies.json # Données test compétences ├── conftest.py # Fixtures pytest partagées └── pytest.ini # Configuration pytest
Exemple test unitaire - test_ml_features.py
import pytest from app.services.ml_features import calculate_features class TestMLFeatures: def test_calculate_features_minimum_grades(self, student_with_grades): """Test: minimum 3 notes requises pour calcul""" student_id = student_with_grades[0].id features = calculate_features(student_id) assert features is not None assert 'avg_grade' in features assert 'trend_coefficient' in features def test_calculate_features_insufficient_data(self, student_one_grade): """Test: retourne None si moins de 3 notes""" student_id = student_one_grade.id features = calculate_features(student_id) assert features is None def test_trend_coefficient_positive(self, improving_student): """Test: coefficient positif pour élève en progression""" features = calculate_features(improving_student.id) assert features['trend_coefficient'] > 0 def test_avg_grade_accuracy(self, student_with_known_grades): """Test: moyenne calculée correctement""" # Élève avec notes: 10, 12, 14 → moyenne = 12 features = calculate_features(student_with_known_grades.id) assert features['avg_grade'] == pytest.approx(12.0, rel=0.01)
14
Risk Management
Risques et Mitigation
R1
API WhatsApp non disponible ou non validée
La validation du compte WhatsApp Business peut prendre du temps. Probabilité: Moyenne Impact: Haut
Simuler avec logs console + mode démo Twilio sandbox
R2
Modèle IA pas assez précis
Données d'entraînement insuffisantes ou features inadaptées. Probabilité: Moyenne Impact: Moyen
Ajuster features, fallback sur règles métier (seuils fixes)
R3
Retard sur un sprint
Complexité sous-estimée ou problème technique bloquant. Probabilité: Haute Impact: Moyen
Buffer Sprint 7, repriorisation du backlog chaque vendredi
R4
Problème configuration AWS RDS
Accès réseau, groupe de sécurité mal configuré. Probabilité: Faible Impact: Haut
SQLite local en backup, migration vers RDS en Sprint 1
R5
Membre de l'équipe absent
Maladie ou contrainte personnelle réduisant la vélocité. Probabilité: Moyenne Impact: Moyen
Documentation cross-training, pair programming systématique
15
Références
Annexes
A. Glossaire
| Terme | Définition |
|---|---|
| Compétence | Savoir-faire évalué (ex: "Résoudre une équation du 1er degré") |
| Évaluation | Session notée (contrôle, test blanc, exercice) |
| Progression | Évolution des notes dans le temps |
| Classification | Attribution d'un niveau (Maîtrisée / En cours / À renforcer) |
| Rapport | Document texte résumant la progression pour les parents |
| Observation | Remarque qualitative de l'enseignant sur une séance |
B. Références Techniques
- Flask Documentation — Backend API REST
- Next.js Documentation — Framework React 15 (App Router, SSR)
- shadcn/ui Documentation — Composants UI dashboard
- Scikit-learn User Guide — Classification ML
- HuggingFace Transformers — Génération de rapports
- Twilio WhatsApp API — Notifications parents
C. Charte Graphique EduTrack IA
🎨 Couleurs
Navy Deep#0D1B2A
Teal Primary#00C9A7
Sky Blue#0EA5E9
Amber#FFB347
✍️ Typographie
TitresSyne 700/800
CorpsDM Sans 400/500
CodeJetBrains Mono
Thème Next.jsTailwind CSS config
Fichiers de charte à créer en Sprint 1
/docs/brand-guide.md · /assets/logo.svg · /assets/logo.png · /.streamlit/config.toml
D. Liens du Projet
| Ressource | URL / Accès | Description |
|---|---|---|
| GitHub | github.com/ahmeddamouad/edutrack-ia | Code source (main + develop) |
| Jira | damragnarockdam.atlassian.net/projects/EI | Backlog Scrum, sprints, stories |
| Azure VM | ssh damragnarockdam@20.199.136.39 | Serveur de test Docker |
| PR #1 | Pull Request #1 | Structure projet + CLAUDE.md |
Dernière mise à jour: 05 Avril 2026 — Sprint 0 terminé (4/4 stories, 11 SP)