Inscription en deux temps, emails de confirmation et export Excel des bénévoles
ci-cd / build-backend (push) Successful in 30s
ci-cd / build-frontend (push) Successful in 18s
ci-cd / deploy (push) Successful in 12s

Formulaire public — paiement en ligne :
- Le bénévole n'est plus compté en base tant qu'un paiement en ligne choisi
  n'est pas confirmé (PendingFormSubmission, promu en Volunteer à la
  confirmation, webhook ou vérification en direct).
- Type de paiement « mécénat » : étape d'adresse postale avant le paiement,
  conservée sur le bénévole pour un reçu fiscal (cerfa) ultérieur.
- Page de confirmation au retour de SumUp, avec relance possible après
  échec/expiration sans ressaisir le formulaire.
- « Je paierai sur place » remplace « je ne participe pas » ; tous les
  champs activés par la coordination sont désormais obligatoires.
- La fiche bénévole n'affiche plus l'état des cases à cocher, seulement le
  résultat réel du paiement (libellé, montant, statut).

Emails :
- Email de confirmation d'inscription à la création du bénévole (tient lieu
  de reçu de paiement quand une cotisation est payée en ligne).
- Mise en forme HTML au thème de l'application (logo de l'édition en
  en-tête) pour tous les emails envoyés, texte brut conservé en repli.

Export Excel des bénévoles (COORDINATION) : coordonnées, vœux résolus en
noms lisibles, cotisation et mécénat.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
AdamThomas
2026-09-30 07:41:58 +02:00
co-authored by Claude Sonnet 5
parent 68d42ee303
commit a2b748566b
34 changed files with 2318 additions and 291 deletions
+41
View File
@@ -1,6 +1,8 @@
import datetime as dt
import io
import uuid
from openpyxl import load_workbook
from sqlmodel import select
from app.models import Assignment, Availability, Role, Volunteer
@@ -389,3 +391,42 @@ def test_lead_can_read_any_volunteers_planning(
client = as_account(lead_account)
assert client.get(_url(edition, f"/{other.id}/planning")).status_code == 200
def test_export_volunteers_as_excel(client, edition, session):
position = make_position(session, edition, name="Bar central")
artist = make_artist(session, edition, name="Chilla")
volunteer = make_volunteer(
session, edition, first_name="Alex", last_name="Martin", email="alex@ex.fr"
)
client.patch(
_url(edition, f"/{volunteer.id}"),
json={
"wished_position_ids": [str(position.id)],
"artist_ids": [str(artist.id)],
},
)
resp = client.get(_url(edition, "/export"))
assert resp.status_code == 200
assert resp.headers["content-type"] == (
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
)
assert f"benevoles-{edition.year}.xlsx" in resp.headers["content-disposition"]
workbook = load_workbook(io.BytesIO(resp.content))
sheet = workbook.active
rows = list(sheet.iter_rows(values_only=True))
assert rows[0][0] == "Prénom"
row = rows[1]
assert row[0] == "Alex"
assert row[1] == "Martin"
assert row[2] == "alex@ex.fr"
assert row[5] == "Bar central"
assert row[6] == "Chilla"
def test_export_volunteers_is_coordinator_only(edition, make_account, as_account):
lead = make_account(Role.LEAD, email="lead@e.fr")
resp = as_account(lead).get(_url(edition, "/export"))
assert resp.status_code == 403