Ejemplo n.º 1
0
def list_submissions():
    team = get_team()
    cur_time = datetime.datetime.now()
    submissions = Submission.query.filter_by(team=team.name).filter(Submission.submitted <= cur_time).order_by(Submission.submitted).all()

    def format_verdict_classes(points):
        if points >= 0:
            return 'success'
        else:
            return 'danger'
        return ''

    return render_template('submissions.html',
                           submissions=reversed(submissions),
                           format_verdict_classes=format_verdict_classes,
                           )
Ejemplo n.º 2
0
def view_scoreboard(opts):
    phase = app.contest.get_current_phase()
    if not phase.scoreboard_problems:
        abort(404)
    opts = {s.split('=', 1)[0]: (s.split('=', 1)[1] if '=' in s else True) for s in opts.split(',')}
    opts['groups'] = set(opts.get('groups', '+'.join(app.contest.groups.keys())).split('+'))

    cur_time = datetime.datetime.now()
    subs = Submission.query.filter(Submission.submitted <= cur_time).filter(Submission.problem.in_(phase.scoreboard_problems)).order_by(Submission.submitted).all()
    sb = {team: {problem: ScoreboardTeamProblem() for problem in phase.scoreboard_problems} for team, v in app.contest.teams.items() if len(v.groups & opts['groups']) > 0}

    for sub in subs:
        if sub.problem not in phase.scoreboard_problems:
            continue

        if sub.team not in sb:
            continue

        cur = sb[sub.team][sub.problem]

        if (phase.frozen is not None and \
          sub.submitted >= app.contest.second_format(60.0 * phase.frozen) and \
          (not is_logged_in() or get_team().name != sub.team)):
            cur.submit_new()
        else:
            cur.submit((sub.submitted - app.contest.start).total_seconds(), sub.score, sub.points)

    ssb = sorted((-sum(sb[team][problem].points() for problem in phase.scoreboard_problems),
                  sum(sb[team][problem].time_penalty() for problem in phase.scoreboard_problems),
                  team) for team in sb.keys())

    sb = [(s[2], -s[0], s[1], sb[s[2]]) for s in ssb]

    if opts.get('full', False):
        return render_template('scoreboard_full.html', scoreboard=sb)
    else:
        return render_template('scoreboard.html', scoreboard=sb)
Ejemplo n.º 3
0
def home():
    team = util.get_team()
    venue = util.get_venue()
    return render_template("home.html", team=team, venue=venue)
Ejemplo n.º 4
0
def view_problem(problem_id, sub_id):

    problem = app.contest.problems.get(problem_id)
    phase = app.contest.get_current_phase()

    team = get_team()
    sub = None
    if not problem:
        abort(404)
    if request.method == 'POST':

        if problem_id not in phase.submit_problems:
            abort(404)

        if not is_logged_in():
            return redirect(url_for('default.login', next=request.path))
        if ('answer_file' in request.files or 'answer' in request.form):

            if 'answer_file' in request.files:
                answer = request.files['answer_file'].read()
                try:
                    answer = answer.decode('utf-8')
                except UnicodeDecodeError:
                    answer = text.bytes2unicode(answer)

            if 'answer_file' not in request.files or not answer:
                answer = request.form['answer']

            score, response = problem.score(answer)

            sub = Submission(
                team=team.name,
                problem=problem_id,
                answer=answer,
                submitted=datetime.datetime.now(),
                score=score,
                points=int(round((score/100) * problem.points)),
                judge_response=response
            )


            app.db.session.add(sub)
            app.db.session.flush()
            app.db.session.commit()
        else:
            abort(400)

        # return redirect(url_for('default.list_submissions'))

    if problem_id not in phase.visible_problems:
        abort(404)

    
    if sub_id is not None:
        team = get_team()
        sub = Submission.query.filter_by(id=sub_id).first()
        if not sub or sub.team != team.name:
            abort(404)
    if team:
        max_sub = Submission.query.filter_by(problem=problem_id, team=team.name).order_by(Submission.points.desc(), Submission.submitted.desc()).first()
    else:
        max_sub = None

    if max_sub is not None and sub is not None and max_sub.id == sub.id:
        sub = None
    return render_template('problem.html', problem=problem, sub=sub, max_sub=max_sub)
Ejemplo n.º 5
0
def view_submission(sub_id):
    team = get_team()
    sub = Submission.query.filter_by(id=sub_id).first()
    if not sub or sub.team != team.name:
        abort(404)
    return render_template('submission.html', submission=sub)