v1.71.0
Changed
- Online checkout is now a two-step flow that no longer serializes concurrent buyers of the same ticket tier: the checkout call reserves (creates the PENDING tickets/
Paymentrows and returnsreservation_id+requires_payment: true), and the client then POSTs/reservations/{id}/checkout-sessionto obtain the Stripe URL. The ticket-tier/series-pass lock is released before the ~2.5s Stripe call, unblocking same-tier purchases during an on-sale rush. Applies to batch tickets (authenticated and guest, fixed-price and pay-what-you-want) and series passes; session creation is idempotent per reservation, and abandoned reservations are reclaimed by the existing expired-payment cleanup.
Fixed
- Clearing an optional buyer field (e.g. VAT ID), the currency, or the discount-code text on a draft invoice via
PATCH /organization-admin/{slug}/attendee-invoices/{invoice_id}no longer fails with a 500 — anullvalue is now coerced to an empty string, so organizers can save the edit instead of seeing "Failed to update invoice".
Security
- Upgraded httplib2 0.22.0 → 0.32.0 (transitive via
django-google-sso) to patchPYSEC-2026-3444.
What's Changed
- fix(invoices): coerce null buyer fields to "" on draft PATCH (#700) by @biagiodistefano in #701
- feat(checkout): release tier lock before Stripe — reserve/session split (#632) by @biagiodistefano in #702
- fix(deps): pin httplib2>=0.32.0 to patch PYSEC-2026-3444 by @biagiodistefano in #704
- chore(release): v1.71.0 by @biagiodistefano in #703
Full Changelog: v1.70.0...v1.71.0