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

@@ -0,0 +1,34 @@
"""assessment entered at
Revision ID: e7a15f49bc01
Revises: 3b6f28fbdc4b
Create Date: 2026-08-03 13:31:01.094907
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = 'e7a15f49bc01'
down_revision: Union[str, None] = '3b6f28fbdc4b'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('calls', schema=None) as batch_op:
batch_op.add_column(sa.Column('assessment_entered_at', sa.DateTime(), nullable=True))
# ### end Alembic commands ###
def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('calls', schema=None) as batch_op:
batch_op.drop_column('assessment_entered_at')
# ### end Alembic commands ###