def scoreboard_view(): if scores_visible() and not authed(): return redirect(url_for('auth.login', next=request.path)) if not scores_visible(): return render_template('scoreboard.html', errors=['Scores are currently hidden']) standings = get_standings() challenges, categories = get_challenges() return render_template('scoreboard.html', standings=standings, score_frozen=is_scoreboard_frozen(), mode='users' if is_users_mode() else 'teams', challenges=challenges, categories=categories, theme=ctf_theme())
def dump_scoreboard_csv(): # TODO: Add fields to scoreboard data temp = StringIO() writer = csv.writer(temp) standings = get_standings() # Get all user fields in a specific order user_fields = UserFields.query.all() user_field_ids = [f.id for f in user_fields] user_field_names = [f.name for f in user_fields] if is_teams_mode(): team_fields = TeamFields.query.all() team_field_ids = [f.id for f in team_fields] team_field_names = [f.name for f in team_fields] header = ([ "place", "team", "team id", "score", "member name", "member id", "member email", "member score", ] + user_field_names + team_field_names) writer.writerow(header) for i, standing in enumerate(standings): team = Teams.query.filter_by(id=standing.account_id).first() # Build field entries using the order of the field values team_field_entries = { f.field_id: f.value for f in team.field_entries } team_field_values = [ team_field_entries.get(f_id, "") for f_id in team_field_ids ] team_row = [ i + 1, team.name, team.id, standing.score, "", "", ] + team_field_values writer.writerow(team_row) for member in team.members: user_field_entries = { f.field_id: f.value for f in member.field_entries } user_field_values = [ user_field_entries.get(f_id, "") for f_id in user_field_ids ] user_row = [ "", "", "", "", member.name, member.id, member.email, member.score, ] + user_field_values writer.writerow(user_row) elif is_users_mode(): header = ["place", "user", "score"] + user_field_names writer.writerow(header) for i, standing in enumerate(standings): user = Users.query.filter_by(id=standing.account_id).first() # Build field entries using the order of the field values user_field_entries = { f.field_id: f.value for f in user.field_entries } user_field_values = [ user_field_entries.get(f_id, "") for f_id in user_field_ids ] user_row = [i + 1, user.name, standing.score] + user_field_values writer.writerow(user_row) # In Python 3 send_file requires bytes output = BytesIO() output.write(temp.getvalue().encode("utf-8")) output.seek(0) temp.close() return output