Files
WeightTracker/app/routes/dashboard.py
2026-02-24 21:12:45 +11:00

79 lines
2.2 KiB
Python

from flask import Blueprint, render_template
from app.auth import login_required, get_current_user
from app.db import query, query_one
from app.utils import calculate_streak
bp = Blueprint("dashboard", __name__)
@bp.route("/")
@login_required
def index():
user = get_current_user()
# Get latest check-in
latest = query_one(
"SELECT * FROM checkins WHERE user_id = %s ORDER BY checked_in_at DESC LIMIT 1",
(user["id"],),
)
# Get check-in count
stats = query_one(
"SELECT COUNT(*) as total_checkins FROM checkins WHERE user_id = %s",
(user["id"],),
)
# Calculate weight change
first_checkin = query_one(
"SELECT weight_kg FROM checkins WHERE user_id = %s ORDER BY checked_in_at ASC LIMIT 1",
(user["id"],),
)
weight_change = None
weight_change_pct = None
if latest and first_checkin:
start_w = float(first_checkin["weight_kg"])
current_w = float(latest["weight_kg"])
weight_change = round(current_w - start_w, 1)
if start_w > 0:
weight_change_pct = round((weight_change / start_w) * 100, 1)
# Recent check-ins (last 5)
recent_checkins = query(
"SELECT * FROM checkins WHERE user_id = %s ORDER BY checked_in_at DESC LIMIT 5",
(user["id"],),
)
# Activity feed (recent check-ins from all users)
activity = query("""
SELECT c.*, u.display_name, u.username
FROM checkins c
JOIN users u ON c.user_id = u.id
WHERE u.is_private = FALSE OR u.id = %s
ORDER BY c.checked_in_at DESC
LIMIT 10
""", (user["id"],))
# Milestones
milestones = query(
"SELECT * FROM milestones WHERE user_id = %s ORDER BY achieved_at DESC",
(user["id"],),
)
# Streak
streak = calculate_streak(user["id"])
return render_template(
"dashboard.html",
user=user,
latest=latest,
stats=stats,
weight_change=weight_change,
weight_change_pct=weight_change_pct,
recent_checkins=recent_checkins,
activity=activity,
milestones=milestones,
streak=streak,
)