import uuid import time from django.core.cache import cache QR_TOKEN_PREFIX = "qr_token:" QR_TOKEN_EXPIRE = 300 QR_CONFIRM_EXPIRE = 120 def generate_qr_token(): token = uuid.uuid4().hex key = f"{QR_TOKEN_PREFIX}{token}" cache.set(key, { "status": "waiting", "user_id": None, "scan_user_id": None, "scan_username": None, "created_at": time.time(), "expires_at": time.time() + QR_TOKEN_EXPIRE, }, QR_TOKEN_EXPIRE) return token def get_qr_status(token): key = f"{QR_TOKEN_PREFIX}{token}" data = cache.get(key) if not data: return {"status": "expired"} return data def scan_qr(token, user_id, username): key = f"{QR_TOKEN_PREFIX}{token}" data = cache.get(key) if not data or data["status"] != "waiting": return False data["status"] = "scanned" data["scan_user_id"] = user_id data["scan_username"] = username data["expires_at"] = time.time() + QR_CONFIRM_EXPIRE cache.set(key, data, QR_CONFIRM_EXPIRE) return True def confirm_qr(token): key = f"{QR_TOKEN_PREFIX}{token}" data = cache.get(key) if not data or data["status"] != "scanned": return None data["status"] = "confirmed" cache.set(key, data, 60) return data def cancel_qr(token): key = f"{QR_TOKEN_PREFIX}{token}" data = cache.get(key) if data: data["status"] = "cancelled" cache.set(key, data, 60)