1
0

Setup banner, assessment timestamps, and installation docs

Instructor home shows a setup banner while a course has no class
schedule, since that is the one gap that degrades the student
experience (free-date opt-outs, no withdrawal locking); it points at
the prefilled schedule form and settings and disappears once any
class day exists.

Calls gain assessment_entered_at, stamped when an outcome is recorded
or actually changed (bulk saves that change nothing don't restamp),
null for pending calls and legacy imports, and included in the calls
export — distinguishing assessed-in-class from assessed-later.

The README setup section now gives both install routes: pure
pip/venv, and Debian system packages with the apt line. Fixing this
uncovered that numpy was missing from the project dependencies (the
grading engine needs it; the system-site-packages venv had masked
the omission).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-03 13:35:25 -07:00
parent 5fec2e3a3d
commit 4e29baddf8
8 changed files with 168 additions and 9 deletions

View File

@@ -231,6 +231,12 @@ class Call(Base):
created_at: Mapped[datetime.datetime] = mapped_column(
DateTime, default=utcnow
)
# When the outcome (status/assessment) was last recorded or
# changed. Distinguishes assessed-in-class from assessed-later;
# null for pending calls and for imported legacy data.
assessment_entered_at: Mapped[datetime.datetime | None] = mapped_column(
DateTime
)
student: Mapped[Student] = relationship()
level: Mapped["AssessmentLevel | None"] = relationship()