Étape 58 : le présent / absent du référent est enregistré sur
l'affectation (Assignment.attendance + heure, migration 0030,
PUT .../assignments/{id}/attendance) au lieu de disparaître au
rechargement.
Étape 59 : section « Présence » de l'écran Statistiques — créneaux en
cours et créneaux terminés, par poste, rafraîchie toutes les 30 s.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
35 lines
1.0 KiB
Python
35 lines
1.0 KiB
Python
"""Pointage des bénévoles
|
|
|
|
Revision ID: 0030_assignment_attendance
|
|
Revises: 0029_volunteer_messages
|
|
Create Date: 2026-10-28
|
|
|
|
`assignment.attendance` (`PRESENT`/`ABSENT`, `NULL` = pas pointé) et
|
|
`attendance_marked_at` : le pointage du référent était gardé dans le
|
|
navigateur seulement et se perdait au rechargement.
|
|
"""
|
|
|
|
from collections.abc import Sequence
|
|
|
|
import sqlalchemy as sa
|
|
from alembic import op
|
|
|
|
revision: str = "0030_assignment_attendance"
|
|
down_revision: str | None = "0029_volunteer_messages"
|
|
branch_labels: str | Sequence[str] | None = None
|
|
depends_on: str | Sequence[str] | None = None
|
|
|
|
_ATTENDANCE = sa.Enum("PRESENT", "ABSENT", name="attendancestatus", native_enum=False)
|
|
|
|
|
|
def upgrade() -> None:
|
|
op.add_column("assignment", sa.Column("attendance", _ATTENDANCE, nullable=True))
|
|
op.add_column(
|
|
"assignment", sa.Column("attendance_marked_at", sa.DateTime(), nullable=True)
|
|
)
|
|
|
|
|
|
def downgrade() -> None:
|
|
op.drop_column("assignment", "attendance_marked_at")
|
|
op.drop_column("assignment", "attendance")
|