Пример #1
0
 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())
Пример #2
0
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