first prototype commit

This commit is contained in:
2026-08-09 21:45:06 -04:00
commit 40613a00d5
36 changed files with 4371 additions and 0 deletions
+66
View File
@@ -0,0 +1,66 @@
from fastapi import APIRouter, Depends, Query
from sqlalchemy.orm import Session
from typing import List, Optional
from backend.database import get_db
from backend.models import User, ChoreCompletion, ChoreType
from backend.schemas import WeeklyReportOut, UserWeekProgress
from backend.routers.auth import get_current_user
from backend.config import get_current_week_identifier
router = APIRouter(prefix="/api/reports", tags=["reports"])
@router.get("/weeks")
def get_available_weeks(db: Session = Depends(get_db), current_user: User = Depends(get_current_user)):
# Returns all distinct week_identifiers present in database plus current week
weeks = db.query(ChoreCompletion.week_identifier).distinct().all()
week_set = {w[0] for w in weeks if w[0]}
current_week = get_current_week_identifier()
week_set.add(current_week)
sorted_weeks = sorted(list(week_set), reverse=True)
return {"current_week": current_week, "weeks": sorted_weeks}
@router.get("/weekly", response_model=WeeklyReportOut)
def get_weekly_report(week: Optional[str] = Query(None), db: Session = Depends(get_db), current_user: User = Depends(get_current_user)):
target_week = week if week else get_current_week_identifier()
users = db.query(User).filter(User.is_active == True).order_by(User.id.asc()).all()
user_progress_list: List[UserWeekProgress] = []
total_stars_earned = 0
total_completions = 0
for user in users:
completions = db.query(ChoreCompletion).filter(
ChoreCompletion.user_id == user.id,
ChoreCompletion.week_identifier == target_week
).all()
stars = sum(c.stars_earned for c in completions)
comp_count = len(completions)
total_stars_earned += stars
total_completions += comp_count
quota = user.weekly_star_quota if user.weekly_star_quota > 0 else 1
pct = round(min(100.0, (stars / quota) * 100), 1)
user_progress_list.append(UserWeekProgress(
user_id=user.id,
name=user.name,
email=user.email,
avatar_url=user.avatar_url,
role=user.role,
weekly_star_quota=user.weekly_star_quota,
stars_earned=stars,
percentage=pct,
completions_count=comp_count
))
# Sort users by stars earned descending
user_progress_list.sort(key=lambda u: u.stars_earned, reverse=True)
return WeeklyReportOut(
week_identifier=target_week,
user_progress=user_progress_list,
total_stars_earned=total_stars_earned,
total_completions=total_completions
)