Files
AdamThomasandClaude Opus 5.5 d722a81a87
ci-cd / build-backend (push) Successful in 31s
ci-cd / build-frontend (push) Successful in 19s
ci-cd / deploy (push) Successful in 12s
Retrait des disponibilités et des limites de temps dans la journée
Disponibilités déclarées supprimées (table `availability`, migration 0022,
API, éditeur de la fiche bénévole, badge de couverture du panneau
d'affectation, colonnes des statistiques) ainsi que les règles
OUTSIDE_AVAILABILITY, DAILY_HOURS_EXCEEDED et INSUFFICIENT_REST, les malus
de disponibilité et de repos du solveur et le filtre « Surchargés » de la
vue bénévoles. Seul le chevauchement reste contrôlé. La case « je suis
disponible » du formulaire public est conservée.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 21:29:58 +02:00

52 lines
1.3 KiB
Python

"""Construit une `ValidationInput` depuis la base pour un couple (bénévole,
créneau). Couche de liaison : c'est le seul endroit du module `validation` qui
connaît la base."""
import uuid
from sqlmodel import Session, select
from app.models import (
Assignment,
Edition,
Shift,
Volunteer,
)
from app.validation.models import (
ShiftInfo,
ValidationInput,
)
def build_validation_input(
*,
session: Session,
edition: Edition,
volunteer: Volunteer,
shift: Shift,
exclude_assignment_id: uuid.UUID | None = None,
) -> ValidationInput:
# Toute affectation existante du bénévole compte (une affectation = une
# décision, toujours active).
stmt = (
select(Shift)
.join(Assignment, Assignment.shift_id == Shift.id)
.where(Assignment.volunteer_id == volunteer.id)
.where(Shift.id != shift.id)
)
if exclude_assignment_id is not None:
stmt = stmt.where(Assignment.id != exclude_assignment_id)
existing_shifts = tuple(
ShiftInfo(id=str(s.id), starts_at=s.starts_at, ends_at=s.ends_at)
for s in session.exec(stmt)
)
return ValidationInput(
candidate_shift=ShiftInfo(
id=str(shift.id),
starts_at=shift.starts_at,
ends_at=shift.ends_at,
),
existing_shifts=existing_shifts,
)