7323c12168
- Added join_requests.html template for displaying pending join requests. - Created join_team.html template for users to submit join requests. - Implemented request_processed.html template to show the result of join request processing. - Developed authentication utilities for user session management. - Introduced convenience redirects for common URL patterns. - Established team management routes and actions for creating, editing, and joining teams. - Added functionality for approving and denying join requests with email notifications. - Enhanced team views to include user permissions and team member details. - Implemented utility functions for team-related operations such as calculating total points and team rank.
179 lines
5.9 KiB
Python
179 lines
5.9 KiB
Python
"""Team-related view functions for rendering templates"""
|
|
from fastapi import Request, HTTPException
|
|
from fastapi.responses import RedirectResponse
|
|
from sqlalchemy.orm import Session
|
|
from sqlalchemy import func
|
|
from datetime import datetime, timedelta
|
|
import random
|
|
from sqlalchemy import inspect
|
|
|
|
from ...models import Team, TeamMembership, User, QRCode, TeamJoinRequest
|
|
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()
|
|
|
|
# Get the user's teams to highlight teams they're already in
|
|
user_team_ids = []
|
|
|
|
# Get user from session for navbar
|
|
user = None
|
|
user_id = request.session.get("user_id")
|
|
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()
|
|
user_team_ids = [membership.team_id for membership in memberships]
|
|
|
|
# Get error message if present
|
|
error = request.query_params.get("error")
|
|
|
|
return templates.TemplateResponse(
|
|
"teams.html",
|
|
{
|
|
"request": request,
|
|
"teams": teams,
|
|
"user_team_ids": user_team_ids,
|
|
"user": user,
|
|
"error": error,
|
|
"brand_colors": {
|
|
"irish_green": "#006837",
|
|
"golden_ale": "#FFB400",
|
|
"cream_white": "#F5F0E1",
|
|
"black_stout": "#1A1A1A",
|
|
"guinness_red": "#B22222"
|
|
}
|
|
}
|
|
)
|
|
|
|
async def join_team_page_view(request: Request, team_id: int, db: Session):
|
|
"""Render the join team page"""
|
|
user_id = request.session.get("user_id")
|
|
current_user = db.query(User).get(user_id) if user_id else None
|
|
|
|
if not current_user:
|
|
return RedirectResponse(f"/auth/login?next=/teams/{team_id}/join", status_code=303)
|
|
|
|
# Check if team exists
|
|
team = db.query(Team).filter(Team.id == team_id, Team.is_active == True).first()
|
|
if not team:
|
|
return templates.TemplateResponse(
|
|
"error.html",
|
|
{"request": request, "error": "Team not found"}
|
|
)
|
|
|
|
# Check if user is already a member
|
|
existing_membership = db.query(TeamMembership).filter(
|
|
TeamMembership.team_id == team_id,
|
|
TeamMembership.user_id == current_user.id
|
|
).first()
|
|
|
|
if existing_membership:
|
|
return templates.TemplateResponse(
|
|
"teams/join_team.html",
|
|
{
|
|
"request": request,
|
|
"team": team,
|
|
"error": "You are already a member of this team"
|
|
}
|
|
)
|
|
|
|
# Check if there's a pending join request
|
|
pending_request = db.query(TeamJoinRequest).filter(
|
|
TeamJoinRequest.team_id == team_id,
|
|
TeamJoinRequest.user_id == current_user.id,
|
|
TeamJoinRequest.status == "pending"
|
|
).first()
|
|
|
|
if pending_request:
|
|
return templates.TemplateResponse(
|
|
"teams/join_team.html",
|
|
{
|
|
"request": request,
|
|
"team": team,
|
|
"error": "You already have a pending join request for this team"
|
|
}
|
|
)
|
|
|
|
return templates.TemplateResponse(
|
|
"teams/join_team.html",
|
|
{"request": request, "team": team, "is_open": team.is_open}
|
|
)
|
|
|
|
def team_detail_view(request: Request, team_id: int, db: Session):
|
|
"""Render the team detail page"""
|
|
# Get team
|
|
team = db.query(Team).filter_by(id=team_id).first()
|
|
if not team:
|
|
raise HTTPException(status_code=404, detail="Team not found")
|
|
|
|
# Get user from session for navbar
|
|
user = None
|
|
user_id = request.session.get("user_id")
|
|
is_team_member = False
|
|
|
|
if user_id:
|
|
user = db.query(User).get(user_id)
|
|
|
|
# Check if user is a team member
|
|
team_membership = db.query(TeamMembership)\
|
|
.filter(TeamMembership.user_id == user_id, TeamMembership.team_id == team_id)\
|
|
.first()
|
|
|
|
is_team_member = team_membership is not None
|
|
|
|
# Get team members with user info
|
|
team_members = utils.get_team_members_with_details(db, team_id)
|
|
|
|
# Check if user is admin or owner
|
|
is_user_admin, is_user_owner, is_captain = utils.check_user_permissions(db, user, team_id, team)
|
|
|
|
# Get team statistics
|
|
total_points = utils.get_team_total_points(db, team_id)
|
|
team_rank = utils.calculate_team_rank(db, team_id)
|
|
points_this_month, point_change, point_change_positive = utils.get_team_points_history(db, team_id)
|
|
|
|
# Activities - simple mock data for now
|
|
activities = utils.get_team_activities()
|
|
|
|
# Get team metadata
|
|
days_ago, founded_date_str = utils.get_team_age(team)
|
|
|
|
# Performance metrics
|
|
performance = {
|
|
"last_quiz": "25 points (2nd place)",
|
|
"average": "18.7 points",
|
|
"best_streak": "3 wins in a row"
|
|
}
|
|
|
|
# Safely get team attributes
|
|
is_public = getattr(team, 'is_public', False)
|
|
is_open = getattr(team, 'is_open', False)
|
|
|
|
return templates.TemplateResponse(
|
|
"team_detail.html",
|
|
{
|
|
"request": request,
|
|
"team": team,
|
|
"team_members": team_members,
|
|
"team_rank": team_rank,
|
|
"total_points": total_points,
|
|
"points_this_month": points_this_month,
|
|
"point_change": point_change,
|
|
"point_change_positive": point_change_positive,
|
|
"activities": activities,
|
|
"performance": performance,
|
|
"is_user_admin": is_user_admin,
|
|
"is_user_owner": is_user_owner,
|
|
"is_team_member": is_team_member,
|
|
"is_captain": is_captain,
|
|
"days_ago": days_ago,
|
|
"founded_date": founded_date_str,
|
|
"user": user,
|
|
"is_open": is_open
|
|
}
|
|
)
|