import base64 from io import BytesIO import qrcode from django.conf import settings from .models import Reservation CHECK_IN_PREVIEW_PATH = "/api/check-ins/preview/" def build_check_in_preview_url(raw_check_in_token): return f"{settings.SITE_BASE_URL}{CHECK_IN_PREVIEW_PATH}?token={raw_check_in_token}" def generate_check_in_qr_png(raw_check_in_token): qr_image = qrcode.make(build_check_in_preview_url(raw_check_in_token)) buffer = BytesIO() qr_image.save(buffer, format="PNG") return buffer.getvalue() def generate_check_in_qr_base64(*, reservation, raw_check_in_token): if reservation.status != Reservation.Status.CONFIRMED: raise ValueError("QR codes are available only for confirmed reservations.") png_bytes = generate_check_in_qr_png(raw_check_in_token) encoded = base64.b64encode(png_bytes).decode("ascii") return f"data:image/png;base64,{encoded}"