61 lines
1.4 KiB
Python
61 lines
1.4 KiB
Python
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)
|