def submit_flag(team, challenge, flag): if g.redis.get("rl{}".format(team.id)): delta = config.competition_end - datetime.now() if delta.days > 0 or delta.seconds > (config.flag_rl * 6): return FLAG_SUBMISSION_TOO_FAST if team.solved(challenge): return FLAG_SUBMITTED_ALREADY elif not challenge.enabled: return FLAG_CANNOT_SUBMIT_WHILE_DISABLED elif flag.strip().lower() != challenge.flag.strip().lower(): g.redis.set("rl{}".format(team.id), str(datetime.now()), config.flag_rl) ChallengeFailure.create(team=team, challenge=challenge, attempt=flag, time=datetime.now()) return FLAG_INCORRECT else: if int(g.redis.hget("solves", challenge.id).decode()) == 0: if challenge.breakthrough_bonus: ScoreAdjustment.create(team=team, value=challenge.breakthrough_bonus, reason="First solve for {}".format( challenge.name)) g.redis.hincrby("solves", challenge.id, 1) g.redis.delete("scoreboard") g.redis.delete("graph") ChallengeSolve.create(team=team, challenge=challenge, time=datetime.now()) return SUCCESS
def submit_flag(team, challenge, flag): if g.redis.get("rl{}".format(team.id)): delta = config.competition_end - datetime.now() if delta.total_seconds() > (config.flag_rl * 6): return FLAG_SUBMISSION_TOO_FAST if team.solved(challenge): return FLAG_SUBMITTED_ALREADY elif not challenge.enabled: return FLAG_CANNOT_SUBMIT_WHILE_DISABLED elif flag.strip().lower() != challenge.flag.strip().lower(): g.redis.set("rl{}".format(team.id), str(datetime.now()), config.flag_rl) ChallengeFailure.create(team=team, challenge=challenge, attempt=flag, time=datetime.now()) return FLAG_INCORRECT else: g.redis.hincrby("solves", challenge.id, 1) if config.immediate_scoreboard: g.redis.delete("scoreboard") g.redis.delete("graph") ChallengeSolve.create(team=team, challenge=challenge, time=datetime.now()) return SUCCESS
def challenge_show_solves(challenge): chal = Challenge.get(Challenge.id == challenge) solves = ChallengeSolve.select(ChallengeSolve, Team).join(Team).order_by( ChallengeSolve.time).where(ChallengeSolve.challenge == chal) return render_template("challenge_solves.html", challenge=chal, solves=solves)
def dashboard(): if request.method == "GET": team_solves = ChallengeSolve.select(ChallengeSolve, Challenge).join(Challenge).where(ChallengeSolve.team == g.team) team_adjustments = ScoreAdjustment.select().where(ScoreAdjustment.team == g.team) team_score = sum([i.challenge.points for i in team_solves] + [i.value for i in team_adjustments]) first_login = False if g.team.first_login: first_login = True g.team.first_login = False g.team.save() return render_template("dashboard.html", team_solves=team_solves, team_adjustments=team_adjustments, team_score=team_score, first_login=first_login) elif request.method == "POST": if g.redis.get("ul{}".format(session["team_id"])): flash("You're changing your information too fast!") return redirect(url_for('dashboard')) team_name = request.form["team_name"].strip() team_email = request.form["team_email"].strip() affiliation = request.form["affiliation"].strip() team_elig = "team_eligibility" in request.form if len(team_name) > 50 or not team_name: flash("You must have a team name!") return redirect(url_for('dashboard')) if not (team_email and "." in team_email and "@" in team_email): flash("You must have a valid team email!") return redirect(url_for('dashboard')) if not affiliation or len(affiliation) > 100: affiliation = "No affiliation" email_changed = (team_email != g.team.email) g.team.name = team_name g.team.email = team_email g.team.affiliation = affiliation if not g.team.eligibility_locked: g.team.eligible = team_elig g.redis.set("ul{}".format(session["team_id"]), str(datetime.now()), 120) if email_changed: if not email.is_valid_email(team_email): flash("You're lying") return redirect(url_for('dashboard')) g.team.email_confirmation_key = misc.generate_confirmation_key() g.team.email_confirmed = False email.send_confirmation_email(team_email, g.team.email_confirmation_key, g.team.key) flash("Changes saved. Please check your email for a new confirmation key.") else: flash("Changes saved.") g.team.save() return redirect(url_for('dashboard'))
def admin_dashboard(): teams = Team.select() solves = ChallengeSolve.select(ChallengeSolve, Challenge).join(Challenge) adjustments = ScoreAdjustment.select() scoredata = utils.scoreboard.get_all_scores(teams, solves, adjustments) lastsolvedata = utils.scoreboard.get_last_solves(teams, solves) tickets = list(TroubleTicket.select().where(TroubleTicket.active == True)) return render_template("admin/dashboard.html", teams=teams, scoredata=scoredata, lastsolvedata=lastsolvedata, tickets=tickets)
def calculate_graph(scoredata): solves = list(ChallengeSolve.select(ChallengeSolve, Challenge).join(Challenge).order_by(ChallengeSolve.time)) adjustments = list(ScoreAdjustment.select()) scoredata = [i for i in scoredata if i[0]] # Only eligible teams are on the score graph graph_data = [] for eligible, tid, name, affiliation, score in scoredata[:config.teams_on_graph]: our_solves = [i for i in solves if i.team_id == tid] team_data = [] s = sum([i.value for i in adjustments if i.team_id == tid]) for i in sorted(our_solves, key=lambda k: k.time): team_data.append((str(i.time), s)) s += i.challenge.points team_data.append((str(i.time + timedelta(microseconds=1000)), s)) team_data.append((str(datetime.now()), score)) graph_data.append((name, team_data)) return graph_data
def calculate_scores(): solves = ChallengeSolve.select(ChallengeSolve, Challenge).join(Challenge) adjustments = ScoreAdjustment.select() teams = Team.select() team_solves = {team.id: [] for team in teams} team_mapping = {team.id: team for team in teams} scores = {team.id: 0 for team in teams} for solve in solves: scores[solve.team_id] += solve.challenge.points team_solves[solve.team_id].append(solve) for adjustment in adjustments: scores[adjustment.team_id] += adjustment.value most_recent_solve = {tid: max([i.time for i in team_solves[tid]]) for tid in team_solves if team_solves[tid]} scores = {i: j for i, j in scores.items() if i in most_recent_solve} # eligible, teamid, teamname, affiliation, score return [(team_mapping[i[0]].eligible, i[0], team_mapping[i[0]].name, team_mapping[i[0]].affiliation, i[1]) for idx, i in enumerate(sorted(scores.items(), key=lambda k: (-k[1], most_recent_solve[k[0]])))]
def dynamic_display(): chal_failed = ChallengeFailure.select() chal_solved = ChallengeSolve.select() submits = dynamics.sort(chal_failed,chal_solved) results = dynamics.handle_solving(submits) result = [] page,per_page,offset=get_page_args() if int(page) == int(len(results)/per_page) + 1: for i in range((page-1)*per_page, len(results)): if results[i] is not None: result.append(results[i]) else: for i in range((page-1)*per_page, page*per_page): if results[i] is not None: result.append(results[i]) pagination = Pagination(page=page,total=len(results),per_page=per_page,record_name='result') notices = NewsItem.select().order_by(-NewsItem.time) return render_template("dynamics.html", notices=notices, result=result, pagination=pagination)
def team_dashboard(): if request.method == "GET": if "team_id" in session: team_solves = ChallengeSolve.select(ChallengeSolve, Challenge).join(Challenge).where( ChallengeSolve.team == g.team) team_adjustments = ScoreAdjustment.select().where(ScoreAdjustment.team == g.team) team_score = sum([i.challenge.points for i in team_solves] + [i.value for i in team_adjustments]) first_login = False if g.team.first_login: first_login = True g.team.first_login = False g.team.save() if g.team.team_leader.id == g.user.id: team_members = User.select().join(TeamMember).join(Team).where(Team.id == g.team.id) users = TeamMember.select().where(TeamMember.team == g.team) return render_template("team_dashboard.html", team_solves=team_solves, team_adjustments=team_adjustments, team_score=team_score, first_login=first_login, team_members=team_members, users=users) else: return render_template("team_dashboard.html", team_solves=team_solves, team_adjustments=team_adjustments, team_score=team_score, first_login=first_login) else: return render_template("team_dashboard.html")
def challenge_show_solves(challenge): chal = Challenge.get(Challenge.id == challenge) solves = ChallengeSolve.select(ChallengeSolve, Team).join(Team).order_by(ChallengeSolve.time).where(ChallengeSolve.challenge == chal) return render_template("challenge_solves.html", challenge=chal, solves=solves)
def dashboard(): if request.method == "GET": team_solves = ChallengeSolve.select( ChallengeSolve, Challenge).join(Challenge).where(ChallengeSolve.team == g.team) team_adjustments = ScoreAdjustment.select().where( ScoreAdjustment.team == g.team) team_score = sum([i.challenge.points for i in team_solves] + [i.value for i in team_adjustments]) first_login = False if g.team.first_login: first_login = True g.team.first_login = False g.team.save() return render_template("dashboard.html", team_solves=team_solves, team_adjustments=team_adjustments, team_score=team_score, first_login=first_login) elif request.method == "POST": if g.redis.get("ul{}".format(session["team_id"])): flash("You're changing your information too fast!") return redirect(url_for('dashboard')) team_name = request.form["team_name"].strip() team_email = request.form["team_email"].strip() affiliation = request.form["affiliation"].strip() team_elig = "team_eligibility" in request.form if len(team_name) > 50 or not team_name: flash("You must have a team name!") return redirect(url_for('dashboard')) if not (team_email and "." in team_email and "@" in team_email): flash("You must have a valid team email!") return redirect(url_for('dashboard')) if not affiliation or len(affiliation) > 100: affiliation = "No affiliation" email_changed = (team_email != g.team.email) g.team.name = team_name g.team.email = team_email g.team.affiliation = affiliation if not g.team.eligibility_locked: g.team.eligible = team_elig g.redis.set("ul{}".format(session["team_id"]), str(datetime.now()), 120) if email_changed: if not email.is_valid_email(team_email): flash("You're lying") return redirect(url_for('dashboard')) g.team.email_confirmation_key = misc.generate_confirmation_key() g.team.email_confirmed = False email.send_confirmation_email(team_email, g.team.email_confirmation_key, g.team.key) flash( "Changes saved. Please check your email for a new confirmation key." ) else: flash("Changes saved.") g.team.save() return redirect(url_for('dashboard'))