54 lines
1.8 KiB
Python
54 lines
1.8 KiB
Python
import io
|
|
import qrcode
|
|
from reportlab.lib.pagesizes import landscape, A5
|
|
from reportlab.pdfgen import canvas
|
|
from reportlab.lib import colors
|
|
from reportlab.lib.utils import ImageReader
|
|
|
|
def generate_qr_ticket(ticket_id: int, user_id: int, seat_id: int = 0) -> bytes:
|
|
buffer = io.BytesIO()
|
|
width, height = landscape(A5)
|
|
c = canvas.Canvas(buffer, pagesize=(width, height))
|
|
|
|
# Темный фон (под дизайн фронтенда)
|
|
c.setFillColor(colors.HexColor("#121212"))
|
|
c.rect(0, 0, width, height, fill=1, stroke=0)
|
|
|
|
# Белая карточка билета
|
|
margin = 20
|
|
c.setFillColor(colors.white)
|
|
c.roundRect(margin, margin, width - 2*margin, height - 2*margin, 10, fill=1, stroke=0)
|
|
|
|
# Текст
|
|
c.setFillColor(colors.black)
|
|
c.setFont("Helvetica-Bold", 28)
|
|
c.drawString(margin + 30, height - margin - 50, "EVENT TICKET")
|
|
|
|
c.setFont("Helvetica", 14)
|
|
c.drawString(margin + 30, height - margin - 100, f"Ticket ID: {ticket_id}")
|
|
c.drawString(margin + 30, height - margin - 130, f"User ID: {user_id}")
|
|
if seat_id:
|
|
c.drawString(margin + 30, height - margin - 160, f"Seat ID: {seat_id}")
|
|
|
|
c.setFont("Helvetica-Oblique", 10)
|
|
c.setFillColor(colors.gray)
|
|
c.drawString(margin + 30, margin + 30, "Scan this QR code at the entrance.")
|
|
|
|
# QR-код
|
|
qr = qrcode.QRCode(box_size=5, border=1)
|
|
qr.add_data(f"TICKET:{ticket_id}|USER:{user_id}|SEAT:{seat_id}")
|
|
qr.make(fit=True)
|
|
img = qr.make_image(fill_color="black", back_color="white")
|
|
|
|
# Буферизация картинки для ReportLab
|
|
img_buffer = io.BytesIO()
|
|
img.save(img_buffer, format="PNG")
|
|
img_buffer.seek(0)
|
|
|
|
c.drawImage(ImageReader(img_buffer), width - margin - 160, margin + 30, width=130, height=130)
|
|
|
|
c.showPage()
|
|
c.save()
|
|
buffer.seek(0)
|
|
return buffer.read()
|