Model
GradeCategory (weight, drop_lowest)
βββ GradeItem (activity β quiz, assignment, manual; optional lesson link, dueDate, isPublished)
βββ Grade (per-student grade)
βββ Rubric (optional β criteria)
Calculation (CSV export)
The CSV export computes the weighted final grade as:
courseGrade = Ξ£ (categoryAvg Γ categoryWeight) / Ξ£ weightsUsed
categoryAvg = average(itemPercents after dropping the category's drop_lowest)
itemPercent = studentScore / itemMaxScore Γ 100
Items without a category are weighted by their own GradeItem.weight. Only published items count.
Roadmap: automatic late penalty based on
submittedAt > dueDateand scheduled date-based release are not yet enforced.dueDateis stored and shown;isPublishedcontrols visibility.
Integrity flags
QuizAttempt persists tabSwitchCount, copyPasteCount, blurCount, total timeSpentSec, IP and user-agent. A π‘οΈ ShieldAlert appears next to a quiz grade in the gradebook when the attempt is flagged β e.g. tab switches over the configured maximum, time over the limit, or copy/paste attempts while copy/paste is blocked. Average time per question is derived from timeSpentSec Γ· question count (not stored as a column). Tooltip shows the flag reason.
Export
GET /api/institution/gradebook/[courseId]/export returns CSV with student, email, each GradeItem as a column, and the weighted average. Compatible with Google Sheets, Excel.