Bénévole : l'email n'est plus unique (couple, famille)
Plusieurs bénévoles peuvent légitimement partager une même adresse email — l'architecture l'interdisait : l'import ignorait silencieusement le second (« duplicate_email_in_file »), et l'ajout manuel renvoyait un 409. Les deux sont corrigés. - Migration 0009 : retrait de la contrainte d'unicité (edition_id, email) sur `volunteer` (l'index sur `email` seul est conservé). - Import (`app/importing/service.py`) : l'upsert se fait désormais sur (email, nom + prénom), pas sur l'email seul. Un même email revu avec un nom différent dans le fichier crée un second bénévole (nouveau code `import.row.shared_email`, WARNING) au lieu d'être ignoré ; `duplicate_email_in_file` ne se déclenche plus que sur une ligne littéralement répétée (même email ET même nom). - API (`POST`/`PATCH /volunteers`) : retrait du rejet 409 `volunteer.duplicate_email`, devenu sans objet (le mock ne l'a d'ailleurs jamais appliqué à la création manuelle). - Mock frontend (`mock-client.ts`) : même correction de l'upsert par import, pour rester cohérent avec le backend. - CLAUDE.md à jour (modèle de domaine, règles d'import, journal). Contrepartie assumée (documentée) : un email re-importé avec un nom légèrement différent (faute de frappe corrigée) crée désormais un bénévole de plus signalé, plutôt que de renommer silencieusement l'existant — même philosophie que la détection sans email, qui ne fusionne jamais rien automatiquement. Vérifié : 179 tests backend, ruff, alembic check ; typecheck/lint/build/smoke frontend ; reseed de démonstration. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017uUsRg7XzopkCPWimwg9ZM
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
fcc42c8d43
commit
897a76ca6d
@@ -1,8 +1,6 @@
|
||||
import datetime as dt
|
||||
|
||||
import pytest
|
||||
from sqlalchemy import text
|
||||
from sqlalchemy.exc import IntegrityError
|
||||
|
||||
from app.models import (
|
||||
Assignment,
|
||||
@@ -121,7 +119,9 @@ def test_availability_window_round_trip(session):
|
||||
assert reloaded.end_time == dt.time(2, 0)
|
||||
|
||||
|
||||
def test_volunteer_email_unique_per_edition(session):
|
||||
def test_volunteer_email_can_be_shared(session):
|
||||
# Un couple, une famille : même boîte mail, deux bénévoles distincts —
|
||||
# ce n'est plus une contrainte d'unicité en base (voir migration 0009).
|
||||
edition = _edition(session)
|
||||
session.add(
|
||||
Volunteer(
|
||||
@@ -140,8 +140,7 @@ def test_volunteer_email_unique_per_edition(session):
|
||||
last_name="B",
|
||||
)
|
||||
)
|
||||
with pytest.raises(IntegrityError):
|
||||
session.commit()
|
||||
session.commit() # ne lève pas
|
||||
|
||||
|
||||
def test_multiple_volunteers_without_email_allowed(session):
|
||||
|
||||
Reference in New Issue
Block a user