feat: add reservation QR retrieval

This commit is contained in:
2026-04-29 10:59:47 +02:00
parent 0c679391ed
commit 635a9a5c63
7 changed files with 124 additions and 6 deletions

View File

@@ -40,6 +40,10 @@ class AlreadyConfirmedReservation(BookingServiceError):
pass
class ReservationNotConfirmed(BookingServiceError):
pass
@dataclass(frozen=True)
class PendingReservationResult:
reservation: Reservation
@@ -59,6 +63,13 @@ class ConfirmedReservationResult:
qr_code_url: str
@dataclass(frozen=True)
class ReservationQRResult:
reservation: Reservation
qr_code_image: str
qr_code_url: str
def calculate_available_seats(performance):
confirmed_seats = (
Reservation.objects.filter(
@@ -184,9 +195,32 @@ def confirm_reservation_from_token(raw_token):
available_seats=available_seats - reservation.party_size,
qr_code_image=generate_check_in_qr_base64(
reservation=reservation,
raw_check_in_token=raw_check_in_token,
raw_check_in_token=raw_token,
),
qr_code_url=build_check_in_preview_url(raw_check_in_token),
qr_code_url=build_check_in_preview_url(raw_token),
)
def retrieve_reservation_qr_from_token(raw_token):
try:
confirmation_token = ReservationToken.objects.select_related("reservation").get(
token_hash=ReservationToken.hash_token(raw_token),
purpose=ReservationToken.Purpose.CONFIRMATION,
)
except ReservationToken.DoesNotExist as exc:
raise InvalidToken("Confirmation token is invalid.") from exc
reservation = confirmation_token.reservation
if reservation.status != Reservation.Status.CONFIRMED:
raise ReservationNotConfirmed("Reservation must be confirmed before QR retrieval.")
return ReservationQRResult(
reservation=reservation,
qr_code_image=generate_check_in_qr_base64(
reservation=reservation,
raw_check_in_token=raw_token,
),
qr_code_url=build_check_in_preview_url(raw_token),
)