Modèle
GradeCategory (poids, drop_lowest)
└── GradeItem (activité — quiz, devoir, manuel ; lien optionnel à une leçon, dueDate, isPublished)
└── Grade (note par élève)
└── Rubric (optionnel — critères)
Calcul (export CSV)
L'export CSV calcule la note finale pondérée comme suit :
courseGrade = Σ (categoryAvg × categoryWeight) / Σ poidsUtilisés
categoryAvg = average(itemPercents après suppression du drop_lowest de la catégorie)
itemPercent = studentScore / itemMaxScore × 100
Les éléments sans catégorie sont pondérés par leur propre GradeItem.weight. Seuls les éléments publiés sont pris en compte.
Feuille de route : la pénalité automatique pour retard (
submittedAt > dueDate) et la publication programmée par date ne sont pas encore appliquées.dueDateest stocké et affiché ;isPublishedcontrôle la visibilité.
Rubriques
{
"name": "Rédaction ENEM",
"criteria": [
{
"name": "Maîtrise de la norme écrite",
"weight": 0.2,
"levels": [
{ "score": 200, "label": "Excellent", "description": "..." },
{ "score": 160, "label": "Bien", "description": "..." },
{ "score": 120, "label": "Satisfaisant", "description": "..." }
]
},
{
"name": "Compréhension du sujet",
"weight": 0.2,
"levels": [...]
}
]
}
L'élève voit le détail extensible : note finale + chaque critère + commentaire.
Indicateurs d'intégrité
Le QuizAttempt conserve tabSwitchCount, copyPasteCount, blurCount, timeSpentSec total, l'IP et le user-agent. Un 🛡️ ShieldAlert apparaît à côté de la note du quiz dans le gradebook lorsque la tentative est signalée — ex. : changements d'onglet au-dessus du maximum configuré, temps dépassant la limite, ou tentatives de copier/coller alors que cette fonction est bloquée. Le temps moyen par question est dérivé de timeSpentSec ÷ nº de questions (ce n'est pas une colonne stockée). L'infobulle indique la raison du signalement. L'enseignant décide de l'action à prendre (annuler, conserver, réviser).
Export
GET /api/institution/gradebook/[courseId]/export retourne un CSV avec :
- Élève
- Chaque GradeItem en colonne
- Moyenne pondérée (par catégorie + drop-lowest)
Compatible avec Google Sheets et Excel.