Show daily streak count on leaderboard as well
This commit is contained in:
@@ -1,51 +1,11 @@
|
||||
from flask import Blueprint, render_template
|
||||
from app.auth import login_required, get_current_user
|
||||
from app.db import query, query_one
|
||||
from app import SYDNEY_TZ
|
||||
from datetime import datetime, timezone, timedelta
|
||||
from app.utils import calculate_streak
|
||||
|
||||
bp = Blueprint("dashboard", __name__)
|
||||
|
||||
|
||||
def calculate_streak(user_id):
|
||||
"""Calculate current and best consecutive-day check-in streaks."""
|
||||
rows = query(
|
||||
"""SELECT DISTINCT (checked_in_at AT TIME ZONE 'UTC' AT TIME ZONE 'Australia/Sydney')::date AS d
|
||||
FROM checkins WHERE user_id = %s ORDER BY d DESC""",
|
||||
(user_id,),
|
||||
)
|
||||
if not rows:
|
||||
return {"current": 0, "best": 0}
|
||||
|
||||
days = [r["d"] for r in rows]
|
||||
today = datetime.now(SYDNEY_TZ).date()
|
||||
|
||||
# Current streak: must include today or yesterday to count
|
||||
current = 0
|
||||
expected = today
|
||||
if days[0] == today or days[0] == today - timedelta(days=1):
|
||||
expected = days[0]
|
||||
for d in days:
|
||||
if d == expected:
|
||||
current += 1
|
||||
expected -= timedelta(days=1)
|
||||
else:
|
||||
break
|
||||
|
||||
# Best streak
|
||||
best = 1
|
||||
run = 1
|
||||
for i in range(1, len(days)):
|
||||
if days[i] == days[i - 1] - timedelta(days=1):
|
||||
run += 1
|
||||
best = max(best, run)
|
||||
else:
|
||||
run = 1
|
||||
|
||||
best = max(best, current)
|
||||
return {"current": current, "best": best}
|
||||
|
||||
|
||||
@bp.route("/")
|
||||
@login_required
|
||||
def index():
|
||||
|
||||
Reference in New Issue
Block a user