40 lines
1.2 KiB
Python
40 lines
1.2 KiB
Python
import qrcode
|
|
from pathlib import Path
|
|
from flask import current_app, url_for
|
|
|
|
from app.utils.paths import event_qr_folder
|
|
|
|
|
|
def generate_qr_for_guest(guest, base_url=None):
|
|
"""Генерирует QR-код для гостя и сохраняет его в папку мероприятия."""
|
|
token = guest.token
|
|
qr_folder = event_qr_folder(guest.event_id)
|
|
qr_folder.mkdir(parents=True, exist_ok=True)
|
|
|
|
qr_filename = f"{token}.png"
|
|
qr_path = qr_folder / qr_filename
|
|
|
|
# URL, который будет закодирован в QR
|
|
if base_url is None:
|
|
try:
|
|
check_in_url = url_for("main.check_in", token=token, _external=True)
|
|
except Exception:
|
|
check_in_url = f"http://localhost:5000/check-in?token={token}"
|
|
else:
|
|
check_in_url = f"{base_url.rstrip('/')}/check-in?token={token}"
|
|
|
|
qr = qrcode.QRCode(
|
|
version=1,
|
|
error_correction=qrcode.constants.ERROR_CORRECT_H,
|
|
box_size=10,
|
|
border=4,
|
|
)
|
|
qr.add_data(check_in_url)
|
|
qr.make(fit=True)
|
|
|
|
img = qr.make_image(fill_color="black", back_color="white")
|
|
img.save(str(qr_path))
|
|
|
|
guest.qr_filename = qr_filename
|
|
return qr_path, check_in_url
|