Work

SuivEdu

Attendance tracking for schools. Teachers take the register, and parents hear about an absence by SMS or email instead of at the end of the term.

Role
Design, backend, frontend, deployment
Platform
Web app, installable as a PWA
Status
Live
Links
suivedu.com
The SuivEdu dashboard in French: seven class absences today, seven waiting to be notified, and shortcuts to attendance, statistics and weekly PDF reports.
The school dashboard. Running locally with sample data.

Overview

SuivEdu digitises the attendance register. Teachers mark who is missing, the school sees it the same day, and parents are notified automatically. Around that core sit the things a school actually asks for once it relies on the register: class and student management, custom messages to parents, statistics, printable weekly reports and billing.

It is built for school groups rather than single schools. A head administrator sees every school in the group; administrators, teachers and students see only their own.

Screens

Engineering notes

Tenant isolation in one place

A school group (MotherSchool in the code) owns several schools. Instead of re-implementing access checks in every view, permissions.py holds a small set of decorators, and any view that takes a school_id, class_id, user_id or bill_id is expected to use one of them.

Reports off the request path

Weekly attendance reports are rendered with ReportLab in a Celery worker, and the page polls an export job for its status. On Heroku the web and worker dynos don’t share a filesystem, so the finished PDF or ZIP is handed back through Redis — already there as the Celery broker — with a 15-minute expiry, rather than making a round trip through S3.

Reports that point back to the source

There are three distinct report templates. Each generated report gets a stable UUID, and the PDF carries a QR code that opens a live web version of the same report.

Right-to-left in PDFs

Reports include Arabic text, which ReportLab doesn’t shape on its own. Text is reshaped and reordered with arabic-reshaper and python-bidi before it is drawn.

Explicit access to money

Billing and reports used to be granted implicitly to certain administrators. That rule was replaced with an explicit per-account permission that a head administrator switches on, so access to financial views is always a deliberate decision.

Stack

Backend
Python, Django, PostgreSQL
Background work
Celery, Redis
Interface
Server-rendered Django templates, Tailwind CSS, Alpine.js
Documents
ReportLab, qrcode, openpyxl
Hosting
Heroku (web and worker dynos)