events/docs/upstream-candidates.md
Padreug 2f8a602bbd
Some checks failed
lint.yml / feat: attach a self-describing ticket card to the email (1.6.1-aio.10) (pull_request) Failing after 0s
feat: attach a self-describing ticket card to the email (1.6.1-aio.10)
The v1.6.1-aio.9 mail still scored 8.4/10 on mail-tester: the remaining
deduction was HTML_IMAGE_ONLY (1.8) — an HTML part whose only content of
note is a remote <img>. Remote images are also blocked by default in most
clients until the reader opts in, and a bare QR saved from that mail says
nothing about what it opens.

- New `qr.py` module (QR + logo helpers moved out of views_api) with
  `render_ticket_card`: site title, event name, when/where, the branded
  QR, name on ticket, ticket id and the door instruction, laid out with
  the bundled DejaVu Sans; `format_event_when` gives "Fri 19 Feb 2027,
  16:00 - 20:00"; filenames are `ticket-<event-slug>-<id8>.png`.
- `GET /events/api/v1/ticket-card/{ticket_id}` serves the same PNG
  (anonymous, like the QR endpoint); the email's "Ticket image" link
  now points there.
- The ticket email becomes multipart/mixed: text + HTML alternatives
  (URLs as links, no <img>) plus the card as a PNG attachment, which
  clients show inline at the end of the message and which works offline
  at the door.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EYwoAkZZmXMMmaBp4WGUBo
2026-09-08 16:40:25 +02:00

5.4 KiB

Upstream PR candidates

Running log of fork features that are shaped so they could be offered to lnbits/events (or lnbits/lnbits). Add a row whenever a change lands here in an upstream-compatible form; strike it when the PR merges upstream.

Feature Where Upstream target Readiness
frontend_url + origin allow-list + ?checkout= return contract views_api.py _resolve_frontend_root, api_ticket_create lnbits/events after the #33 rebase, as a small PR
Ticket ids minted before the invoice so success_url can carry them api_ticket_create lnbits/events ships with the above
extra.checkout (success/cancel URL, customer_email, line item, metadata) on fiat purchases api_ticket_create lnbits/events (needs lnbits StripeCheckoutOptions.cancel_url/customer_email, PR'd from aiolabs/lnbits) with the lnbits patch
extra.payment_methods per event + tickets_payment_methods NIP-52 tag models.py, nostr_publisher.py lnbits/events (v2 PR #64 introduces the same field) offer as review input on #64
asyncio.to_thread around the smtplib send services.py _send_ticket_email_notification lnbits/events trivial, standalone
QR logo overlay in make_qr_png (instance lnbits_qr_logo) views_api.py lnbits/events standalone
Multi-ticket purchase as N rows on one payment_hash api_ticket_create, crud.py lnbits/events overlaps v2 baskets; review input on #64
Free tickets without minting an invoice _issue_free_tickets lnbits/events small, standalone
NIP-52 publishing + approval workflow nostr_*.py, views_api.py lnbits/events #46 open; rebase onto v1.6.8
Date + Message-ID + From display name on the ticket email (build_ticket_email); event details in the body services.py lnbits/events (mailer) and lnbits/lnbits send_email (same omissions, hits password-reset/admin mails) trivial, standalone — measured: SpamAssassin MISSING_DATE 1.4 + MISSING_MID 0.14
Ticket card PNG (event/when/where/QR/name/id) attached to the ticket email instead of a remote <img> (qr.py, GET /api/v1/ticket-card/{id}) qr.py, services.py lnbits/events (their "ticket image" compositing could reuse the renderer) standalone; mail-tester: removes HTML_IMAGE_ONLY (1.8)