Étape 2 : modèle de données complet et migration initiale

- Tables SQLModel : Edition, DayPart, Volunteer, Skill, Position, Shift,
  Availability, Assignment, Account, MagicLinkToken + tables d'association
- Multi-édition (edition_id partout), énumérations en VARCHAR + CHECK,
  suppressions ON DELETE CASCADE (droit à l'effacement)
- Dates/heures naïves en heure locale Europe/Paris (tzdata + TZ conteneur)
- Migration Alembic 0001 écrite à la main, vérifiée par `alembic check`
  (aucun écart avec les modèles) et par un aller-retour downgrade/upgrade
- Tests : graphe complet, unicité email par édition, N-N compétences,
  aller-retour d'énumération, cascade de suppression d'un bénévole

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017uUsRg7XzopkCPWimwg9ZM
This commit is contained in:
AdamThomas
2026-09-09 22:25:29 +02:00
co-authored by Claude Sonnet 5
parent 09d7d70076
commit cb2e84adf0
11 changed files with 1068 additions and 28 deletions
+52 -4
View File
@@ -1,6 +1,54 @@
"""Tables SQLModel du domaine.
"""Tables SQLModel du domaine et énumérations associées.
Vide à ce stade : le modèle de données est ajouté à l'étape suivante. Ce module
est importé par Alembic (`app/migrations/env.py`) et par les tests pour
enregistrer les métadonnées.
Importé par Alembic (`app/migrations/env.py`) et par les tests pour enregistrer
les métadonnées sur `SQLModel.metadata`.
"""
from app.models.base import TimestampMixin, local_now
from app.models.domain import (
Account,
Assignment,
Availability,
DayPart,
Edition,
MagicLinkToken,
Position,
Shift,
ShiftRequiredSkill,
Skill,
Volunteer,
VolunteerSkill,
)
from app.models.enums import (
ACTIVE_ASSIGNMENT_STATUSES,
AssignmentSource,
AssignmentStatus,
AvailabilityStatus,
PositionCategory,
Role,
TshirtSize,
)
__all__ = [
"ACTIVE_ASSIGNMENT_STATUSES",
"Account",
"Assignment",
"AssignmentSource",
"AssignmentStatus",
"Availability",
"AvailabilityStatus",
"DayPart",
"Edition",
"MagicLinkToken",
"Position",
"PositionCategory",
"Role",
"Shift",
"ShiftRequiredSkill",
"Skill",
"TimestampMixin",
"TshirtSize",
"Volunteer",
"VolunteerSkill",
"local_now",
]