Inscription en deux temps, emails de confirmation et export Excel des bénévoles
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:
co-authored by
Claude Sonnet 5
parent
68d42ee303
commit
a2b748566b
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user