Add multi-league foundation
This commit is contained in:
@@ -7,6 +7,7 @@ from starlette.status import HTTP_303_SEE_OTHER
|
||||
from fastapi.templating import Jinja2Templates
|
||||
|
||||
from ...models import Team, TeamMembership, User, TeamJoinRequest
|
||||
from ...league_context import resolve_selected_league
|
||||
from ...utils.auth import get_current_user
|
||||
from ...utils.mail import send_team_join_request_notification, send_join_request_response
|
||||
from ...templates_config import templates
|
||||
@@ -19,6 +20,7 @@ async def create_team_post(
|
||||
description: str = Form(""),
|
||||
logo_url: str = Form(""),
|
||||
is_open: bool = Form(False),
|
||||
league_id: int = Form(None),
|
||||
db: Session = Depends(get_db),
|
||||
current_user: User = Depends(get_current_user)
|
||||
):
|
||||
@@ -26,14 +28,23 @@ async def create_team_post(
|
||||
if not current_user:
|
||||
return RedirectResponse("/auth/login", status_code=HTTP_303_SEE_OTHER)
|
||||
|
||||
# Check if team name already exists
|
||||
existing_team = db.query(Team).filter(Team.name == name).first()
|
||||
selected_league = resolve_selected_league(db, league_id)
|
||||
|
||||
# Check if team name already exists in this league
|
||||
existing_team = db.query(Team).filter(
|
||||
Team.name == name,
|
||||
Team.league_id == selected_league.id
|
||||
).first()
|
||||
if existing_team:
|
||||
return RedirectResponse("/teams/?error=Team+name+already+exists", status_code=HTTP_303_SEE_OTHER)
|
||||
return RedirectResponse(
|
||||
f"/teams/?league_id={selected_league.id}&error=Team+name+already+exists",
|
||||
status_code=HTTP_303_SEE_OTHER
|
||||
)
|
||||
|
||||
# Create team with only the fields that exist in the model
|
||||
team_data = {
|
||||
"name": name,
|
||||
"league_id": selected_league.id,
|
||||
"description": description,
|
||||
"is_open": is_open,
|
||||
"owner_id": current_user.id
|
||||
@@ -60,7 +71,7 @@ async def create_team_post(
|
||||
db.add(team_membership)
|
||||
db.commit()
|
||||
|
||||
return RedirectResponse("/teams/", status_code=HTTP_303_SEE_OTHER)
|
||||
return RedirectResponse(f"/teams/?league_id={selected_league.id}", status_code=HTTP_303_SEE_OTHER)
|
||||
|
||||
async def edit_team_post(
|
||||
request: Request,
|
||||
|
||||
@@ -73,13 +73,20 @@ def get_team_total_points(db: Session, team_id: int):
|
||||
def calculate_team_rank(db: Session, team_id: int):
|
||||
"""Calculate team rank based on points"""
|
||||
try:
|
||||
# First, get the aggregated points for all teams
|
||||
team = db.query(Team).filter(Team.id == team_id).first()
|
||||
if not team:
|
||||
return 1
|
||||
|
||||
# First, get the aggregated points for teams in the same league
|
||||
team_points = db.query(
|
||||
QRCode.redeemed_at_team,
|
||||
Team.id.label("team_id"),
|
||||
func.sum(QRCode.points).label('total')
|
||||
).outerjoin(
|
||||
QRCode,
|
||||
QRCode.redeemed_at_team == Team.id
|
||||
).filter(
|
||||
QRCode.redeemed_at_team != None
|
||||
).group_by(QRCode.redeemed_at_team).all()
|
||||
Team.league_id == team.league_id
|
||||
).group_by(Team.id).all()
|
||||
|
||||
# Sort them by points (descending)
|
||||
sorted_teams = sorted(team_points, key=lambda x: x.total or 0, reverse=True)
|
||||
@@ -87,7 +94,7 @@ def calculate_team_rank(db: Session, team_id: int):
|
||||
# Find our team's position
|
||||
team_rank = 1
|
||||
for idx, team_data in enumerate(sorted_teams):
|
||||
if team_data.redeemed_at_team == team_id:
|
||||
if team_data.team_id == team_id:
|
||||
team_rank = idx + 1
|
||||
break
|
||||
|
||||
|
||||
@@ -8,13 +8,17 @@ import random
|
||||
from sqlalchemy import inspect
|
||||
|
||||
from ...models import Team, TeamMembership, User, QRCode, TeamJoinRequest
|
||||
from ...league_context import get_active_leagues, parse_league_id, resolve_selected_league
|
||||
from ...templates_config import templates
|
||||
from ...utils.auth import get_current_user
|
||||
from . import utils
|
||||
|
||||
def list_teams_view(request: Request, db: Session):
|
||||
"""Render the teams list view"""
|
||||
teams = db.query(Team).all()
|
||||
league_id = request.query_params.get("league_id")
|
||||
selected_league = resolve_selected_league(db, parse_league_id(league_id))
|
||||
leagues = get_active_leagues(db)
|
||||
teams = db.query(Team).filter(Team.league_id == selected_league.id).all()
|
||||
|
||||
# Get the user's teams to highlight teams they're already in
|
||||
user_team_ids = []
|
||||
@@ -25,7 +29,15 @@ def list_teams_view(request: Request, db: Session):
|
||||
if user_id:
|
||||
user = db.query(User).get(user_id)
|
||||
# Get teams that user is a member of
|
||||
memberships = db.query(TeamMembership).filter(TeamMembership.user_id == user_id).all()
|
||||
memberships = (
|
||||
db.query(TeamMembership)
|
||||
.join(Team)
|
||||
.filter(
|
||||
TeamMembership.user_id == user_id,
|
||||
Team.league_id == selected_league.id
|
||||
)
|
||||
.all()
|
||||
)
|
||||
user_team_ids = [membership.team_id for membership in memberships]
|
||||
|
||||
# Get error message if present
|
||||
@@ -36,6 +48,8 @@ def list_teams_view(request: Request, db: Session):
|
||||
{
|
||||
"request": request,
|
||||
"teams": teams,
|
||||
"leagues": leagues,
|
||||
"selected_league": selected_league,
|
||||
"user_team_ids": user_team_ids,
|
||||
"user": user,
|
||||
"error": error,
|
||||
|
||||
Reference in New Issue
Block a user