From 3a4085afc6e8ddce8fdfde02ff3887a82613f4c6 Mon Sep 17 00:00:00 2001 From: James Pattinson Date: Fri, 20 Feb 2026 12:19:21 -0500 Subject: [PATCH] Booking out QR code --- backend/Dockerfile | 3 ++- backend/entrypoint.sh | 6 ++++++ backend/generate_qr.py | 38 +++++++++++++++++++++++++++++++++++ docker-compose.prod.yml | 1 + docker-compose.yml | 1 + web/book.html | 2 +- web/index.html | 44 +++++++++++++++++++++++++++++++++++++++++ 7 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 backend/generate_qr.py diff --git a/backend/Dockerfile b/backend/Dockerfile index 28fd1e9..85afad0 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -3,11 +3,12 @@ FROM python:3.11-slim # Set working directory WORKDIR /app -# Install system dependencies +# Install system dependencies including qrencode RUN apt-get update && apt-get install -y \ gcc \ default-libmysqlclient-dev \ pkg-config \ + qrencode \ && rm -rf /var/lib/apt/lists/* # Copy requirements first for better caching diff --git a/backend/entrypoint.sh b/backend/entrypoint.sh index 0151478..f37dd2c 100644 --- a/backend/entrypoint.sh +++ b/backend/entrypoint.sh @@ -174,6 +174,12 @@ else exit 1 fi +echo "" +echo "=========================================" +echo "Generating QR Code" +echo "=========================================" +python3 /app/generate_qr.py + echo "" echo "=========================================" echo "Starting Application Server" diff --git a/backend/generate_qr.py b/backend/generate_qr.py new file mode 100644 index 0000000..5894b1f --- /dev/null +++ b/backend/generate_qr.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python3 +"""Generate booking QR code at container startup""" +import os +import sys +import subprocess + +def generate_booking_qr(): + """Generate QR code for the booking page""" + # Get base URL from environment, default to localhost + base_url = os.environ.get('BASE_URL', 'http://localhost') + booking_url = f"{base_url}/book" + + # Create output directory if it doesn't exist + output_dir = '/web/assets' + os.makedirs(output_dir, exist_ok=True) + + output_file = f'{output_dir}/booking-qr.png' + + try: + # Generate QR code using qrencode + subprocess.run( + ['qrencode', '-o', output_file, '-s', '5', booking_url], + check=True, + capture_output=True + ) + print(f"✓ Generated booking QR code: {output_file}") + print(f" URL: {booking_url}") + return True + except subprocess.CalledProcessError as e: + print(f"✗ Failed to generate QR code: {e.stderr.decode()}", file=sys.stderr) + return False + except FileNotFoundError: + print("✗ qrencode not found. Install with: apt-get install qrencode", file=sys.stderr) + return False + +if __name__ == '__main__': + success = generate_booking_qr() + sys.exit(0 if success else 1) diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 30c3238..94d04e8 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -36,6 +36,7 @@ services: volumes: - ./backend:/app - ./db-init:/db-init:ro # Mount CSV data for seeding + - ./web/assets:/web/assets # Mount assets for QR code generation networks: - app_network extra_hosts: diff --git a/docker-compose.yml b/docker-compose.yml index 73cb302..600187e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -48,6 +48,7 @@ services: volumes: - ./backend:/app - ./db-init:/db-init:ro # Mount CSV data for seeding + - ./web/assets:/web/assets # Mount assets for QR code generation networks: - private_network - public_network diff --git a/web/book.html b/web/book.html index 3d44bdd..e2faa11 100644 --- a/web/book.html +++ b/web/book.html @@ -547,7 +547,7 @@ diff --git a/web/index.html b/web/index.html index b0ebc17..66e21af 100644 --- a/web/index.html +++ b/web/index.html @@ -178,6 +178,35 @@ left: 28px; } + /* QR code for booking */ + .qr-code-container { + position: absolute; + left: 300px; + top: 50%; + transform: translateY(-50%); + background: white; + padding: 5px; + border-radius: 4px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + display: flex; + flex-direction: column; + align-items: center; + gap: 5px; + } + + .qr-code-container .qr-label { + font-size: 12px; + font-weight: bold; + color: #333; + white-space: nowrap; + } + + .qr-code-container img { + display: block; + max-width: 120px; + height: auto; + } + /* Santa hat styles */ .santa-hat { position: absolute; @@ -357,6 +386,10 @@
EGFH Logo +
+ Scan to book a flight +
Book Out
+

Flight Information

EGFH Logo
@@ -847,11 +880,22 @@ return typeMap[flightType] || flightType; } + // Generate QR code for booking page + function generateBookingQR() { + const qrImg = document.getElementById('bookingQR'); + if (qrImg) { + qrImg.src = '/assets/booking-qr.png'; + } + } + // Load data on page load window.addEventListener('load', function() { // Initialize Christmas mode initChristmasMode(); + // Load booking QR code + generateBookingQR(); + loadArrivals(); loadDepartures();