LetterkeepReference-letter eligibility for one course — the roster stays on the professor's machine. Local app · nothing hosted GitHub
Flask · SQLite · one course · built for a faculty client

Students check whether they qualify before they ask.

Three conditions the professor states once — on the roster, grade at or above the threshold, attendance at or above it in every enrolment. The roster, the grades and the uploaded files stay on the professor's own machine; this page is a tour, because there is nothing hosted to try.

What a student sees

The conditions are stated before the upload form, not discovered afterwards. On a phone, because that is where a student checks this.

The student page on a phone: the three conditions, then fields for the student number, the transcript and the letter of interest.
The student page at 375px.
The result page: a sentence saying the student qualifies, then which of the three conditions are met.
The answer, then which condition is met. No names, enrolments or figures from the roster: anyone who knows a student number can open this page.

What the professor sees

The professor's dashboard: counts for enrolments, students, courses and eligible students; a form to check one student; recent checks.
The dashboard: what the roster holds, and a check for a student who wrote directly.
The eligible list: students waiting for a letter, with grade, source of the grade, enrolments and a download for their letter of interest.
Who is waiting for a letter, and who already has one.

The rule

Forty-five lines, and the part that matters is the third condition: attendance is checked in every enrolment, not on average.

  1. On the roster

    The student number appears in a roster file the professor imported. Course, section, year and term come from the import form, so any of the usual column spellings work.

  2. Grade at or above the threshold

    Default 80%. Read from the transcript PDF when it can be, typed by the student when it cannot, or overridden by the professor — and which of the three happened is recorded beside the result.

  3. Attendance at or above the threshold, everywhere

    Default 75%. A student in two courses with 96% in one and 60% in the other does not qualify. A row with no attendance figure is not a pass.

Run it in a minute

No licence, no account, no network: the demo data is fifteen made-up students in two courses.

git clone https://github.com/NickkkLian/Prof-Reference-System.git
cd Prof-Reference-System
python3 -m pip install -r requirements.txt
python3 run_web.py --seed

It prints the student page and the professor's address — the same page plus a token, which is the only key to the professor's side. The server binds this machine only unless --host says otherwise, and listens on 5001, because on macOS 5000 belongs to AirPlay. Python 3.10 or newer: macOS ships 3.9 as /usr/bin/python3, and the app says so and stops rather than failing inside an import.

The rule is under test, and the tests have to be able to fail:

python3 -m pytest tests -q    # 33 tests
python3 break_check.py        # six breaks, each caught by its own test