- Une ligne de log par requête (route modèle, statut, durée, code d'erreur, compte), identifiant X-Request-ID repris dans chaque log et affiché à l'utilisateur sous une erreur, exceptions non gérées tracées (500 JSON) - Journal d'accès d'uvicorn coupé : il exposait le jeton du formulaire public - Logs métier : paiement SumUp, connexion, import, plannings, solveur - Nom du bénévole dans la description du checkout SumUp - Code et identifiant de transaction SumUp enregistrés au paiement (migration 0023), affichés sur la fiche et dans l'export Excel Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
41 lines
1.3 KiB
Python
41 lines
1.3 KiB
Python
"""Transaction SumUp de la cotisation
|
|
|
|
Revision ID: 0023_fee_transaction
|
|
Revises: 0022_drop_availability
|
|
Create Date: 2026-10-12
|
|
|
|
`volunteer.fee_transaction_code` (code affiché dans le tableau de bord SumUp,
|
|
ex. `TEENSK4W2K`) et `fee_transaction_id` (identifiant technique) : la
|
|
transaction qui a réglé la cotisation, posée à la confirmation du paiement —
|
|
voir `app/api/forms.py:_promote_pending`. Les bénévoles déjà payés restent
|
|
à `NULL`.
|
|
"""
|
|
|
|
from collections.abc import Sequence
|
|
|
|
import sqlalchemy as sa
|
|
from alembic import op
|
|
|
|
revision: str = "0023_fee_transaction"
|
|
down_revision: str | None = "0022_drop_availability"
|
|
branch_labels: str | Sequence[str] | None = None
|
|
depends_on: str | Sequence[str] | None = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
op.add_column(
|
|
"volunteer", sa.Column("fee_transaction_code", sa.String(), nullable=True)
|
|
)
|
|
op.create_index(
|
|
"ix_volunteer_fee_transaction_code", "volunteer", ["fee_transaction_code"]
|
|
)
|
|
op.add_column(
|
|
"volunteer", sa.Column("fee_transaction_id", sa.String(), nullable=True)
|
|
)
|
|
|
|
|
|
def downgrade() -> None:
|
|
op.drop_column("volunteer", "fee_transaction_id")
|
|
op.drop_index("ix_volunteer_fee_transaction_code", table_name="volunteer")
|
|
op.drop_column("volunteer", "fee_transaction_code")
|