""" Linux BenchTools - QR Code Generator Generate QR codes for locations """ import os from pathlib import Path from typing import Optional import qrcode from qrcode.image.styledpil import StyledPilImage from qrcode.image.styles.moduledrawers import RoundedModuleDrawer class QRCodeGenerator: """QR Code generation utilities""" @staticmethod def generate_location_qr( location_id: int, location_name: str, base_url: str, output_dir: str, size: int = 300 ) -> str: """ Generate QR code for a location Args: location_id: Location ID location_name: Location name (for filename) base_url: Base URL of the application output_dir: Directory for output size: QR code size in pixels Returns: Path to generated QR code image """ # Create URL pointing to location page url = f"{base_url}/peripherals?location={location_id}" # Create QR code qr = qrcode.QRCode( version=1, # Auto-adjust error_correction=qrcode.constants.ERROR_CORRECT_H, # High error correction box_size=10, border=4, ) qr.add_data(url) qr.make(fit=True) # Generate image with rounded style img = qr.make_image( image_factory=StyledPilImage, module_drawer=RoundedModuleDrawer() ) # Resize to specified size img = img.resize((size, size)) # Generate filename safe_name = "".join(c for c in location_name if c.isalnum() or c in (' ', '-', '_')).strip() safe_name = safe_name.replace(' ', '_') output_filename = f"qr_location_{location_id}_{safe_name}.png" output_path = os.path.join(output_dir, output_filename) # Ensure output directory exists os.makedirs(output_dir, exist_ok=True) # Save img.save(output_path) return output_path @staticmethod def generate_peripheral_qr( peripheral_id: int, peripheral_name: str, base_url: str, output_dir: str, size: int = 200 ) -> str: """ Generate QR code for a peripheral Args: peripheral_id: Peripheral ID peripheral_name: Peripheral name (for filename) base_url: Base URL of the application output_dir: Directory for output size: QR code size in pixels Returns: Path to generated QR code image """ # Create URL pointing to peripheral detail page url = f"{base_url}/peripheral/{peripheral_id}" # Create QR code qr = qrcode.QRCode( version=1, error_correction=qrcode.constants.ERROR_CORRECT_H, box_size=10, border=4, ) qr.add_data(url) qr.make(fit=True) # Generate image img = qr.make_image( image_factory=StyledPilImage, module_drawer=RoundedModuleDrawer() ) # Resize img = img.resize((size, size)) # Generate filename safe_name = "".join(c for c in peripheral_name if c.isalnum() or c in (' ', '-', '_')).strip() safe_name = safe_name.replace(' ', '_') output_filename = f"qr_peripheral_{peripheral_id}_{safe_name}.png" output_path = os.path.join(output_dir, output_filename) # Ensure output directory exists os.makedirs(output_dir, exist_ok=True) # Save img.save(output_path) return output_path @staticmethod def generate_custom_qr( data: str, output_path: str, size: int = 300, error_correction: str = "H" ) -> str: """ Generate a custom QR code Args: data: Data to encode output_path: Full output path size: QR code size in pixels error_correction: Error correction level (L, M, Q, H) Returns: Path to generated QR code image """ # Map error correction ec_map = { "L": qrcode.constants.ERROR_CORRECT_L, "M": qrcode.constants.ERROR_CORRECT_M, "Q": qrcode.constants.ERROR_CORRECT_Q, "H": qrcode.constants.ERROR_CORRECT_H } ec = ec_map.get(error_correction.upper(), qrcode.constants.ERROR_CORRECT_H) # Create QR code qr = qrcode.QRCode( version=1, error_correction=ec, box_size=10, border=4, ) qr.add_data(data) qr.make(fit=True) # Generate image img = qr.make_image( image_factory=StyledPilImage, module_drawer=RoundedModuleDrawer() ) # Resize img = img.resize((size, size)) # Ensure output directory exists os.makedirs(os.path.dirname(output_path), exist_ok=True) # Save img.save(output_path) return output_path