diff --git a/app.py b/app.py index 5043ccc..078206f 100644 --- a/app.py +++ b/app.py @@ -1,4 +1,4 @@ -from flask import Flask, render_template, jsonify +from flask import Flask, render_template, jsonify, request, session, redirect, url_for from datetime import datetime import os import sys @@ -28,7 +28,11 @@ def get_league_color(league_index): @app.context_processor def inject_apis(): """Make API and version available to all templates""" - return dict(sleeper_api=sleeper_api, app_version=app.config['VERSION']) + return dict( + sleeper_api=sleeper_api, + app_version=app.config['VERSION'], + current_theme=session.get('theme', 'light') + ) @app.route('/') def index(): @@ -36,6 +40,40 @@ def index(): print("DEBUG: Index route accessed", flush=True) return render_template('index.html') +@app.route('/dashboard') +def dashboard_form(): + """Handle form submission from homepage""" + username = request.args.get('username') + if username: + return dashboard_current(username.strip()) + else: + return redirect(url_for('index')) + +# Add theme handling route +@app.route('/toggle_theme', methods=['POST']) +def toggle_theme(): + """Toggle between light and dark theme""" + current_theme = session.get('theme', 'light') + new_theme = 'dark' if current_theme == 'light' else 'light' + session['theme'] = new_theme + + # Get return URL from form or default to index + return_url = request.form.get('return_url', url_for('index')) + return redirect(return_url) + +# Add timezone handling route +@app.route('/set_timezone', methods=['POST']) +def set_timezone(): + """Set user's timezone preference""" + timezone = request.form.get('timezone') + if timezone: + session['user_timezone'] = timezone + print(f"DEBUG: Set user timezone to: {timezone}", flush=True) + + # Get return URL from form or default to index + return_url = request.form.get('return_url', url_for('index')) + return redirect(return_url) + @app.route('/') def dashboard_current(username): """Dashboard for current NFL week""" @@ -89,10 +127,12 @@ def dashboard(username, week): for i, league in enumerate(leagues): print(f"DEBUG: League {i+1}: ID={league.get('league_id')}, Name='{league.get('name')}'", flush=True) - # Get NFL game schedule for the week + # Get NFL game schedule for the week with user's timezone + user_timezone = session.get('user_timezone', 'America/Los_Angeles') # Default to PST + print(f"DEBUG: Using timezone: {user_timezone}", flush=True) print(f"DEBUG: Calling get_week_schedule() for week {week}, season {season}", flush=True) try: - schedule = espn_api.get_week_schedule(week, season) + schedule = espn_api.get_week_schedule(week, season, user_timezone) print(f"DEBUG: Schedule retrieved successfully", flush=True) except Exception as e: print(f"ERROR: ESPN schedule fetch failed: {str(e)}", flush=True) @@ -110,6 +150,7 @@ def dashboard(username, week): matchups = sleeper_api.get_matchups(league_id, week) print(f"DEBUG: Found {len(matchups) if matchups else 0} matchups", flush=True) + # Get rosters to find user's team print(f"DEBUG: Calling get_rosters() for league {league_id}", flush=True) rosters = sleeper_api.get_rosters(league_id) @@ -141,21 +182,56 @@ def dashboard(username, week): opponent_user = sleeper_api.get_user_by_id(opponent_owner_id) print(f"DEBUG: Opponent user: {opponent_user.get('display_name') if opponent_user else 'None'}", flush=True) - # Get all players on user's roster for calendar + # Get all players on user's roster for calendar with starter info all_players = [] - if user_roster and user_roster.get('players'): + if user_roster and user_roster.get('players') and user_matchup: players_list = user_roster['players'] - print(f"DEBUG: Processing {len(players_list)} total players for calendar", flush=True) + starters_list = user_matchup.get('starters', []) + print(f"DEBUG: Processing {len(players_list)} total players, {len(starters_list)} starters", flush=True) for player_id in players_list: try: # Get player details from Sleeper API player = sleeper_api.get_player_info(player_id) if player: + # Add starter status to player data + player['is_starter'] = player_id in starters_list + + # Check multiple possible injury status fields + injury_status = ( + player.get('injury_status') or + player.get('status') or + player.get('injury_designation') or + player.get('practice_participation') + ) + + # Only show injury status if it's not "Active" or None + if injury_status and injury_status.lower() != 'active': + player['injury_status'] = injury_status + else: + player['injury_status'] = None + + # Print any player with injury status (only non-Active) + if player['injury_status']: + player_name = f"{player.get('first_name', '')} {player.get('last_name', '')}".strip() + print(f"DEBUG: {player_name} has injury status: {player['injury_status']}", flush=True) + all_players.append(player) except Exception as e: print(f"ERROR: Failed to get player info for {player_id}: {str(e)}", flush=True) + # Calculate winning/losing status + user_points = user_matchup['points'] if user_matchup else 0 + opponent_points = opponent_matchup['points'] if opponent_matchup else 0 + + # Determine status + if user_points > opponent_points: + match_status = 'winning' + elif user_points < opponent_points: + match_status = 'losing' + else: + match_status = 'tied' + # Store processed league data league_info = { 'league': league, @@ -164,7 +240,10 @@ def dashboard(username, week): 'opponent_matchup': opponent_matchup, 'opponent_user': opponent_user, 'user_roster': user_roster, - 'all_players': all_players + 'all_players': all_players, + 'match_status': match_status, + 'user_points': user_points, + 'opponent_points': opponent_points } league_data.append(league_info) print(f"DEBUG: League '{league['name']}' processed successfully", flush=True) diff --git a/services/sleeper_api.py b/services/sleeper_api.py index dacf9be..80df23a 100644 --- a/services/sleeper_api.py +++ b/services/sleeper_api.py @@ -69,4 +69,7 @@ class SleeperAPI: def get_player_info(self, player_id): """Get specific player info""" players = self.get_players() - return players.get(str(player_id)) + player_info = players.get(str(player_id)) + + + return player_info diff --git a/static/style.css b/static/style.css index 29a6570..78305d1 100644 --- a/static/style.css +++ b/static/style.css @@ -1097,4 +1097,18 @@ body { padding: 0 12px 12px 12px; } +/* Player Injury Status Styling */ +.injury-status { + color: #dc2626 !important; /* Red color */ + font-weight: 700; + font-size: 10px; + margin-left: 4px; + padding: 1px 3px; + background-color: rgba(220, 38, 38, 0.1); + border: 1px solid #dc2626; + border-radius: 3px; + text-transform: uppercase; + letter-spacing: 0.5px; +} + diff --git a/templates/dashboard.html b/templates/dashboard.html index 3fed6f2..2cc9a79 100644 --- a/templates/dashboard.html +++ b/templates/dashboard.html @@ -23,7 +23,7 @@
{% for league_info in league_data %} -
+
@@ -31,16 +31,13 @@
- + {% if league_info.match_status == 'winning' %} ↗️ - W {% elif league_info.match_status == 'losing' %} ↘️ - L {% else %} ↔️ - T {% endif %} @@ -61,10 +58,11 @@

Week {{ week }} Games +
{% if session.get('user_timezone') %} - ({{ session.get('user_timezone')|replace('_', ' ')|replace('America/', '') }}) + timezone: ({{ session.get('user_timezone') }}) {% else %} - (PST/PDT) + timezone: (PST/PDT) {% endif %}

@@ -127,7 +125,11 @@ {% for player in starters %}
{{ player.fantasy_positions[0] if player.fantasy_positions else 'FLEX' }} - {{ player.last_name }} + {{ player.last_name }} + {% if player.injury_status %} + {{ player.injury_status }} + {% endif %} +
{% endfor %}
@@ -139,7 +141,11 @@ {% for player in bench_players %}
{{ player.fantasy_positions[0] if player.fantasy_positions else 'FLEX' }} - {{ player.last_name }} + {{ player.last_name }} + {% if player.injury_status %} + {{ player.injury_status }} + {% endif %} +
{% endfor %}