def topteams(count): if get_config('view_scoreboard_if_authed') and not authed(): return redirect(url_for('auth.login', next=request.path)) if count > 20 or count < 0: count = 10 json = {'scores': {}} standings = get_standings(count=count) for team in standings: user_ids = [ u.id for u in Users.query.with_entities(Users.id).filter_by( teamid=team.teamid) ] solves = Solves.query.filter(Solves.userid.in_(user_ids)).all() awards = Awards.query.filter(Awards.userid.in_(user_ids)).all() json['scores'][team.name] = [] scores = [] for x in solves: json['scores'][team.name].append({ 'chal': x.chalid, 'team': team.teamid, 'value': x.chal.value, 'time': unix_time(x.date) }) for award in awards: json['scores'][team.name].append({ 'chal': None, 'team': team.teamid, 'value': award.value, 'time': unix_time(award.date) }) json['scores'][team.name] = sorted(json['scores'][team.name], key=lambda k: k['time']) return jsonify(json)
def solves(teamid=None): solves = None awards = None if teamid is None: if is_admin(): solves = Solves.query.filter_by(teamid=session['id']).all() elif authed(): solves = Solves.query.join(Teams, Solves.teamid == Teams.id).filter(Solves.teamid==session['id'], Teams.banned==None).all() else: return redirect(url_for('auth.login', next='solves')) else: solves = Solves.query.filter_by(teamid=teamid).all() awards = Awards.query.filter_by(teamid=teamid).all() db.session.close() json = {'solves':[]} for solve in solves: json['solves'].append({ 'chal': solve.chal.name, 'chalid': solve.chalid, 'team': solve.teamid, 'value': solve.chal.value, 'category': solve.chal.category, 'time': unix_time(solve.date) }) for award in awards: json['solves'].append({ 'chal': award.name, 'chalid': None, 'team': award.teamid, 'value': award.value, 'category': award.category, 'time': unix_time(award.date) }) json['solves'].sort(key=lambda k: k['time']) return jsonify(json)
def admin_solves(teamid="all"): if teamid == "all": solves = Solves.query.all() else: solves = Solves.query.filter_by(teamid=teamid).all() awards = Awards.query.filter_by(teamid=teamid).all() db.session.close() json_data = {'solves': []} for x in solves: json_data['solves'].append({ 'id': x.id, 'chal': x.chal.name, 'chalid': x.chalid, 'team': x.teamid, 'value': x.chal.value, 'category': x.chal.category, 'time': unix_time(x.date) }) for award in awards: json_data['solves'].append({ 'chal': award.name, 'chalid': None, 'team': award.teamid, 'value': award.value, 'category': award.category, 'time': unix_time(award.date) }) json_data['solves'].sort(key=lambda k: k['time']) return jsonify(json_data)
def topteams(count): if get_config('view_scoreboard_if_authed') and not authed(): return redirect(url_for('auth.login', next=request.path)) try: count = int(count) except ValueError: count = 10 if count > 20 or count < 0: count = 10 json = {'scores': {}} standings = get_standings(count=count) for team in standings: solves = Solves.query.filter_by(teamid=team.teamid).all() awards = Awards.query.filter_by(teamid=team.teamid).all() json['scores'][team.name] = [] for x in solves: json['scores'][team.name].append({ 'chal': x.chalid, 'team': x.teamid, 'value': x.chal.value, 'time': unix_time(x.date) }) for award in awards: json['scores'][team.name].append({ 'chal': None, 'team': award.teamid, 'value': award.value, 'time': unix_time(award.date) }) json['scores'][team.name] = sorted(json['scores'][team.name], key=lambda k: k['time']) return jsonify(json)
def admin_solves(teamid="all"): if teamid == "all": solves = Solves.query.all() else: solves = Solves.query.filter_by(teamid=teamid).all() awards = Awards.query.filter_by(teamid=teamid).all() db.session.close() json_data = {'solves':[]} for x in solves: json_data['solves'].append({ 'id': x.id, 'chal': x.chal.name, 'chalid': x.chalid, 'team': x.teamid, 'value': x.chal.value, 'category': x.chal.category, 'time': unix_time(x.date) }) for award in awards: json_data['solves'].append({ 'chal': award.name, 'chalid': None, 'team': award.teamid, 'value': award.value, 'category': award.category, 'time': unix_time(award.date) }) json_data['solves'].sort(key=lambda k:k['time']) return jsonify(json_data)
def topteams(count): if get_config('view_scoreboard_if_authed') and not authed(): return redirect(url_for('auth.login', next=request.path)) try: count = int(count) except: count = 10 if count > 20 or count < 0: count = 10 json = {'scores':{}} standings = get_standings(count=count) for team in standings: solves = Solves.query.filter_by(teamid=team.teamid).all() awards = Awards.query.filter_by(teamid=team.teamid).all() json['scores'][team.name] = [] scores = [] for x in solves: json['scores'][team.name].append({ 'chal': x.chalid, 'team': x.teamid, 'value': x.chal.value, 'time': unix_time(x.date) }) for award in awards: json['scores'][team.name].append({ 'chal': None, 'team': award.teamid, 'value': award.value, 'time': unix_time(award.date) }) json['scores'][team.name] = sorted(json['scores'][team.name], key=lambda k: k['time']) return jsonify(json)
def solves_public(teamid=None): solves = None awards = None if utils.authed() and session['id'] == teamid: solves = Solves.query.filter_by(teamid=teamid) awards = Awards.query.filter_by(teamid=teamid) freeze = utils.get_config('freeze') if freeze: freeze = utils.unix_time_to_utc(freeze) if teamid != session.get('id'): solves = solves.filter(Solves.date < freeze) awards = awards.filter(Awards.date < freeze) solves = solves.all() awards = awards.all() elif utils.hide_scores(): # Use empty values to hide scores solves = [] awards = [] else: solves = Solves.query.filter_by(teamid=teamid) awards = Awards.query.filter_by(teamid=teamid) freeze = utils.get_config('freeze') if freeze: freeze = utils.unix_time_to_utc(freeze) if teamid != session.get('id'): solves = solves.filter(Solves.date < freeze) awards = awards.filter(Awards.date < freeze) solves = solves.all() awards = awards.all() db.session.close() response = {'solves': []} for solve in solves: response['solves'].append({ 'chal': solve.chal.name, 'chalid': solve.chalid, 'team': solve.teamid, 'value': solve.chal.value, 'category': solve.chal.category, 'time': utils.unix_time(solve.date) }) if awards: for award in awards: response['solves'].append({ 'chal': award.name, 'chalid': None, 'team': award.teamid, 'value': award.value, 'category': award.category or "Award", 'time': utils.unix_time(award.date) }) response['solves'].sort(key=lambda k: k['time']) return jsonify(response)
def topteams(count): json = {'places': {}} if utils.get_config('view_scoreboard_if_authed') and not utils.authed(): return redirect(url_for('auth.login', next=request.path)) if utils.hide_scores(): return jsonify(json) if count > 20 or count < 0: count = 10 standings = get_standings(count=count) for i, team in enumerate(standings): solves = Solves.query.filter_by(teamid=team.teamid) awards = Awards.query.filter_by(teamid=team.teamid) freeze = utils.get_config('freeze') if freeze: solves = solves.filter( Solves.date < utils.unix_time_to_utc(freeze)) awards = awards.filter( Awards.date < utils.unix_time_to_utc(freeze)) solves = solves.all() awards = awards.all() json['places'][i + 1] = { 'id': team.teamid, 'name': team.name, 'solves': [] } for x in solves: json['places'][i + 1]['solves'].append({ 'chal': x.chalid, 'team': x.teamid, 'value': x.chal.value, 'time': utils.unix_time(x.date) }) for award in awards: json['places'][i + 1]['solves'].append({ 'chal': None, 'team': award.teamid, 'value': award.value, 'time': utils.unix_time(award.date) }) json['places'][i + 1]['solves'] = sorted(json['places'][i + 1]['solves'], key=lambda k: k['time']) return jsonify(json)
def solves(teamid=None): solves = None awards = None if teamid is None: if utils.is_admin(): solves = Solves.query.filter_by(teamid=session['id']).all() elif utils.user_can_view_challenges(): if utils.authed(): solves = Solves.query.join(Teams, Solves.teamid == Teams.id).filter( Solves.teamid == session['id'], Teams.banned == False).all() else: return jsonify({'solves': []}) else: return redirect(url_for('auth.login', next='solves')) else: if utils.hide_scores(): # Use empty values to hide scores solves = [] awards = [] else: solves = Solves.query.filter_by(teamid=teamid) awards = Awards.query.filter_by(teamid=teamid) freeze = utils.get_config('freeze') if freeze: freeze = utils.unix_time_to_utc(freeze) if teamid != session.get('id'): solves = solves.filter(Solves.date < freeze) awards = awards.filter(Awards.date < freeze) solves = solves.all() awards = awards.all() db.session.close() json = {'solves': []} for solve in solves: json['solves'].append({ 'chal': solve.chal.name, 'chalid': solve.chalid, 'team': solve.teamid, 'value': solve.chal.value, 'category': solve.chal.category, 'time': utils.unix_time(solve.date) }) if awards: for award in awards: json['solves'].append({ 'chal': award.name, 'chalid': None, 'team': award.teamid, 'value': award.value, 'category': award.category or "Award", 'time': utils.unix_time(award.date) }) json['solves'].sort(key=lambda k: k['time']) return jsonify(json)
def topteams_endpoint(count): json = {'places': {}} if utils.get_config('view_scoreboard_if_authed') and not utils.authed(): return redirect(url_for('auth.login', next=request.path)) if utils.hide_scores(): return jsonify(json) if count > 20 or count < 0: count = 10 standings = get_standings_monkey_patch(count=count) team_ids = [team.teamid for team in standings] solves = Solves.query.filter(Solves.teamid.in_(team_ids)) awards = Awards.query.filter(Awards.teamid.in_(team_ids)) freeze = utils.get_config('freeze') if freeze: solves = solves.filter(Solves.date < utils.unix_time_to_utc(freeze)) awards = awards.filter(Awards.date < utils.unix_time_to_utc(freeze)) solves = solves.all() awards = awards.all() time_decay_solves = TimeDecaySolves.query.filter(Solves.teamid.in_(team_ids)).all() for i, team in enumerate(team_ids): json['places'][i + 1] = { 'id': standings[i].teamid, 'name': standings[i].name, 'solves': [] } for solve in solves: if solve.teamid == team: score = 0 for t in time_decay_solves: if t.chalid == solve.chalid and t.teamid == solve.teamid: score = t.decayed_value json['places'][i + 1]['solves'].append({ 'chal': solve.chalid, 'team': solve.teamid, 'value': score, 'time': utils.unix_time(solve.date) }) for award in awards: if award.teamid == team: json['places'][i + 1]['solves'].append({ 'chal': None, 'team': award.teamid, 'value': award.value, 'time': utils.unix_time(award.date) }) json['places'][i + 1]['solves'] = sorted(json['places'][i + 1]['solves'], key=lambda k: k['time']) return jsonify(json)
def topteams(count): if get_config('view_scoreboard_if_authed') and not authed(): return redirect(url_for('auth.login', next=request.path)) try: count = int(count) except: count = 10 if count > 20 or count < 0: count = 10 json = {'scores':{}} score = db.func.sum(Challenges.value).label('score') scores = db.session.query(Solves.teamid.label('teamid'), Teams.name.label('name'), score, Solves.date.label('date')) \ .join(Teams) \ .join(Challenges) \ .filter(Teams.banned == None) \ .group_by(Solves.teamid) awards = db.session.query(Teams.id.label('teamid'), Teams.name.label('name'), db.func.sum(Awards.value).label('score'), Awards.date.label('date')) \ .filter(Teams.id == Awards.teamid) \ .group_by(Teams.id) results = union_all(scores, awards) standings = db.session.query(results.columns.teamid, results.columns.name, db.func.sum(results.columns.score).label('score')) \ .group_by(results.columns.teamid) \ .order_by(db.func.sum(results.columns.score).desc(), db.func.max(results.columns.date)) \ .limit(count).all() for team in standings: solves = Solves.query.filter_by(teamid=team.teamid).all() awards = Awards.query.filter_by(teamid=team.teamid).all() json['scores'][team.name] = [] scores = [] for x in solves: json['scores'][team.name].append({ 'chal': x.chalid, 'team': x.teamid, 'value': x.chal.value, 'time': unix_time(x.date) }) for award in awards: json['scores'][team.name].append({ 'chal': None, 'team': award.teamid, 'value': award.value, 'time': unix_time(award.date) }) json['scores'][team.name] = sorted(json['scores'][team.name], key=lambda k: k['time']) return jsonify(json)
def solves(teamid=None): solves = None awards = None if teamid is None: if utils.is_admin(): solves = Solves.query.filter_by(teamid=session['id']).all() elif utils.user_can_view_challenges(): if utils.authed(): solves = Solves.query.join(Teams, Solves.teamid == Teams.id).filter(Solves.teamid == session['id'], Teams.banned == False).all() else: return jsonify({'solves': []}) else: return redirect(url_for('auth.login', next='solves')) else: solves = Solves.query.filter_by(teamid=teamid) awards = Awards.query.filter_by(teamid=teamid) freeze = utils.get_config('freeze') if freeze: freeze = utils.unix_time_to_utc(freeze) if teamid != session.get('id'): solves = solves.filter(Solves.date < freeze) awards = awards.filter(Awards.date < freeze) solves = solves.all() awards = awards.all() db.session.close() json = {'solves': []} for solve in solves: json['solves'].append({ 'chal': solve.chal.name, 'chalid': solve.chalid, 'team': solve.teamid, 'value': solve.chal.value, 'category': solve.chal.category, 'time': utils.unix_time(solve.date) }) if awards: for award in awards: json['solves'].append({ 'chal': award.name, 'chalid': None, 'team': award.teamid, 'value': award.value, 'category': award.category or "Award", 'time': utils.unix_time(award.date) }) json['solves'].sort(key=lambda k: k['time']) return jsonify(json)
def topteams(count): try: count = int(count) except: count = 10 if count > 20 or count < 0: count = 10 json = {'scores': {}} score = db.func.sum(Challenges.value).label('score') quickest = db.func.max(Solves.date).label('quickest') teams = db.session.query(Solves.teamid, Teams.name, score)\ .join(Teams)\ .join(Challenges)\ .filter(Teams.banned == None)\ .group_by(Solves.teamid).order_by(score.desc(), quickest)\ .limit(count) for team in teams: solves = Solves.query.filter_by(teamid=team.teamid).all() json['scores'][team.name] = [] for x in solves: json['scores'][team.name].append({ 'id': x.teamid, 'chal': x.chalid, 'team': x.teamid, 'value': x.chal.value, 'time': unix_time(x.date) }) return jsonify(json)
def topteams(count): try: count = int(count) except: count = 10 if count > 20 or count < 0: count = 10 json = {'scores': {}} #teams = db.engine.execute("SELECT solves.teamid, teams.id, teams.name, SUM(value) as score, MAX(solves.date) as quickest FROM solves JOIN teams ON solves.teamid=teams.id INNER JOIN challenges ON solves.chalid=challenges.id WHERE teams.banned IS NULL GROUP BY solves.teamid ORDER BY score DESC, quickest ASC LIMIT {0};".format(count)) score = db.func.sum(Challenges.value).label('score') teams = db.session.query( Solves.teamid, Teams.name, score, db.func.max(Solves.date).label('quickest')).join(Teams).join( Challenges).filter(Teams.banned == None).group_by( Solves.teamid).order_by(score.desc(), Solves.date).limit(count) for team in teams: solves = Solves.query.filter_by(teamid=team.teamid).all() json['scores'][team.name] = [] for x in solves: json['scores'][team.name].append({ 'id': x.teamid, 'chal': x.chalid, 'team': x.teamid, 'value': x.chal.value, 'time': unix_time(x.date) }) return jsonify(json)
def solves(teamid=None): if teamid is None: if is_admin(): solves = Solves.query.filter_by(teamid=session['id']).all() elif authed(): solves = Solves.query.join(Teams, Solves.teamid == Teams.id).filter( Solves.teamid == session['id'], Teams.banned == None).all() else: return redirect(url_for('auth.login', next='solves')) else: solves = Solves.query.filter_by(teamid=teamid).all() db.session.close() json = {'solves': []} for x in solves: json['solves'].append({ 'chal': x.chal.name, 'chalid': x.chalid, 'team': x.teamid, 'value': x.chal.value, 'category': x.chal.category, 'time': unix_time(x.date) }) return jsonify(json)
def topteams(count): if get_config('view_scoreboard_if_authed') and not authed(): return redirect(url_for('auth.login', next=request.path)) try: count = int(count) except: count = 10 if count > 20 or count < 0: count = 10 json = {'scores':{}} score = db.func.sum(Challenges.value).label('score') quickest = db.func.max(Solves.date).label('quickest') teams = db.session.query(Solves.teamid, Teams.name, score)\ .join(Teams)\ .join(Challenges)\ .filter(Teams.banned == None)\ .group_by(Solves.teamid).order_by(score.desc(), quickest)\ .limit(count) for team in teams: solves = Solves.query.filter_by(teamid=team.teamid).all() json['scores'][team.name] = [] for x in solves: json['scores'][team.name].append({ 'id': x.teamid, 'chal': x.chalid, 'team': x.teamid, 'value': x.chal.value, 'time': unix_time(x.date) }) return jsonify(json)
def topteams(count): try: count = int(count) except: count = 10 if count > 20 or count < 0: count = 10 json = {'scores':{}} score = db.func.sum(Challenges.value).label('score') quickest = db.func.max(Solves.date).label('quickest') teams = db.session.query(Solves.teamid, Teams.name, score)\ .join(Teams)\ .join(Challenges)\ .filter(Teams.banned == None)\ .group_by(Solves.teamid).order_by(score.desc(), quickest)\ .limit(count) for team in teams: solves = Solves.query.filter_by(teamid=team.teamid).all() json['scores'][team.name] = [] for x in solves: json['scores'][team.name].append({ 'id': x.teamid, 'chal': x.chalid, 'team': x.teamid, 'value': x.chal.value, 'time': unix_time(x.date) }) return jsonify(json)
def topteams(count): if get_config('view_scoreboard_if_authed') and not authed(): return redirect(url_for('auth.login', next=request.path)) try: count = int(count) except: count = 10 if count > 20 or count < 0: count = 10 json = {'scores': {}} score = db.func.sum(Challenges.value).label('score') quickest = db.func.max(Solves.date).label('quickest') teams = db.session.query(Solves.teamid, Teams.name, score)\ .join(Teams)\ .join(Challenges)\ .filter(Teams.banned == None)\ .group_by(Solves.teamid).order_by(score.desc(), quickest)\ .limit(count) for team in teams: solves = Solves.query.filter_by(teamid=team.teamid).all() json['scores'][team.name] = [] for x in solves: json['scores'][team.name].append({ 'id': x.teamid, 'chal': x.chalid, 'team': x.teamid, 'value': x.chal.value, 'time': unix_time(x.date) }) return jsonify(json)
def team_solves_view(teamid=None): solves = None awards = None if teamid is None: if is_admin(): solves = Solves.query.filter_by(userid=session['id']).all() elif authed(): user = Users.query.filter_by(id=session.get('id')).first_or_404() user_ids = [ u.id for u in Users.query.with_entities(Users.id).filter_by( teamid=user.teamid) ] solves = Solves.query.filter(Solves.userid.in_(user_ids)).all() else: return redirect(url_for('auth.login', next='solves')) else: team = Teams.query.filter_by(id=teamid).first_or_404() user_ids = [ u.id for u in Users.query.with_entities(Users.id).filter_by( teamid=team.id) ] solves = Solves.query.filter(Solves.userid.in_(user_ids)).all() awards = Awards.query.filter(Awards.userid.in_(user_ids)).all() db.session.close() json = {'solves': []} for solve in solves: json['solves'].append({ 'chal': solve.chal.name, 'chalid': solve.chalid, 'team': solve.userid, 'value': solve.chal.value, 'category': solve.chal.category, 'time': unix_time(solve.date) }) if awards: for award in awards: json['solves'].append({ 'chal': award.name, 'chalid': None, 'team': award.userid, 'value': award.value, 'category': award.category, 'time': unix_time(award.date) }) json['solves'].sort(key=lambda k: k['time']) return jsonify(json)
def solves(teamid=None): solves = None awards = None if teamid is None: if is_admin(): solves = Solves.query.filter_by(teamid=session['id']).all() elif user_can_view_challenges(): if authed(): solves = Solves.query.join(Teams, Solves.teamid == Teams.id).filter( Solves.teamid == session['id'], Teams.banned == False).all() else: return jsonify({'solves': []}) else: return redirect(url_for('auth.login', next='solves')) else: solves = Solves.query.filter_by(teamid=teamid).all() awards = Awards.query.filter_by(teamid=teamid).all() db.session.close() json = {'solves': []} for solve in solves: json['solves'].append({ 'chal': solve.chal.name, 'chalid': solve.chalid, 'team': solve.teamid, 'value': solve.chal.value, 'category': solve.chal.category, 'time': unix_time(solve.date) }) if awards: for award in awards: json['solves'].append({ 'chal': award.name, 'chalid': None, 'team': award.teamid, 'value': award.value, 'category': award.category or "Award", 'time': unix_time(award.date) }) json['solves'].sort(key=lambda k: k['time']) return jsonify(json)
def solves_private(): solves = None awards = None if utils.is_admin(): solves = Solves.query.filter_by(teamid=session['id']).all() elif utils.user_can_view_challenges(): if utils.authed(): solves = Solves.query\ .join(Teams, Solves.teamid == Teams.id)\ .filter(Solves.teamid == session['id'])\ .all() else: return jsonify({'solves': []}) else: return redirect(url_for('auth.login', next='solves')) db.session.close() response = {'solves': []} for solve in solves: response['solves'].append({ 'chal': solve.chal.name, 'chalid': solve.chalid, 'team': solve.teamid, 'value': solve.chal.value, 'category': solve.chal.category, 'time': utils.unix_time(solve.date) }) if awards: for award in awards: response['solves'].append({ 'chal': award.name, 'chalid': None, 'team': award.teamid, 'value': award.value, 'category': award.category or "Award", 'time': utils.unix_time(award.date) }) response['solves'].sort(key=lambda k: k['time']) return jsonify(response)
def topteams(count): if get_config('view_scoreboard_if_authed') or not authed(): return redirect(url_for('auth.login', next=request.path)) try: count = int(count) except ValueError: count = 10 if count > 20 or count < 0: count = 10 user = Students.query.filter_by(id=session['id']).first() json = {'scores': {}} standings = get_standings(count=count) for team in standings: solves = db.session.query(Solves).join(Students).filter( Students.teamid == team.teamid, Students.sectionid == user.sectionid).all() awards = db.session.query(Awards).join(Students).filter( Students.teamid == team.teamid, Students.sectionid == user.sectionid).all() json['scores'][team.name] = [] for x in solves: json['scores'][team.name].append({ 'chal': x.chalid, 'student.id': x.studentid, 'value': x.chal.value, 'time': unix_time(x.date) }) for award in awards: json['scores'][team.name].append({ 'chal': None, 'student.id': award.studentid, 'value': award.value, 'time': unix_time(award.date) }) json['scores'][team.name] = sorted(json['scores'][team.name], key=lambda k: k['time']) return jsonify(json)
def team_solves(compid, teamid): json = {'solves': []} if utils.get_config('view_scoreboard_if_authed') and not utils.authed(): return redirect(url_for('auth.login', next=request.path)) if utils.hide_scores(): return jsonify(json) chalids = [ chal.chalid for chal in Chalcomp.query.filter(Chalcomp.compid == compid) ] solves = Solves.query.filter(Solves.teamid == teamid) awards = Awards.query.filter(Awards.teamid == teamid) solves = solves.filter(Solves.chalid.in_(chalids)) freeze = utils.get_config('freeze') if freeze: solves = solves.filter(Solves.date < utils.unix_time_to_utc(freeze)) awards = awards.filter(Awards.date < utils.unix_time_to_utc(freeze)) solves = solves.all() awards = awards.all() for solve in solves: json['solves'].append({ 'chal': solve.chalid, 'team': solve.teamid, 'value': solve.chal.value, 'time': utils.unix_time(solve.date) }) for award in awards: json['solves'].append({ 'chal': None, 'team': award.teamid, 'value': award.value, 'time': utils.unix_time(award.date) }) json['solves'] = sorted(json['solves'], key=lambda k: k['time']) return jsonify(json)
def last_announcement(): announcement = Announcements.query.join( Challenges, Announcements.chalid == Challenges.id, isouter=True).order_by(Announcements.date.desc()).first() if not announcement: return jsonify(False) elif announcement.chalid: return jsonify({ 'type': 'hint', 'title': announcement.title, 'description': announcement.description, 'date': unix_time(announcement.date), 'chal_id': announcement.chal.id, 'chal_name': announcement.chal.name, }) else: return jsonify({ 'type': 'announcement', 'title': announcement.title, 'description': announcement.description, 'date': unix_time(announcement.date), })
def admin_solves(teamid="all"): if teamid == "all": solves = Solves.query.all() else: solves = Solves.query.filter_by(teamid=teamid).all() db.session.close() json = {'solves': []} for x in solves: json['solves'].append({ 'id': x.id, 'chal': x.chal.name, 'chalid': x.chalid, 'team': x.teamid, 'value': x.chal.value, 'category': x.chal.category, 'time': unix_time(x.date) }) return jsonify(json)
def solves(teamid=None): if teamid is None: if authed(): solves = Solves.query.filter_by(teamid=session['id']).all() else: abort(401) else: solves = Solves.query.filter_by(teamid=teamid).all() db.session.close() json = {'solves': []} for x in solves: json['solves'].append({ 'chal': x.chal.name, 'chalid': x.chalid, 'team': x.teamid, 'value': x.chal.value, 'category': x.chal.category, 'time': unix_time(x.date) }) return jsonify(json)
def solves_public_endpoint(teamid): solves = Solves.query.filter_by(teamid = teamid) time_decay_solves = TimeDecaySolves.query.filter_by(teamid = teamid) db.session.close() response = {'solves': []} for solve in solves: value = 0 for v in time_decay_solves: if v.chalid == solve.chalid: value = v.decayed_value response['solves'].append({ 'chal': solve.chal.name, 'chalid': solve.chalid, 'team': solve.teamid, 'value': value, 'category': solve.chal.category, 'time': utils.unix_time(solve.date) }) response['solves'].sort(key=lambda k: k['time']) return jsonify(response)
def solves(teamid=None): if teamid is None: if is_admin() or user_can_view_challenges(): teamid = session['id'] else: return redirect(url_for('auth.login', next='solves')) teamid = int(teamid) user_solves = [] for solve, value in get_solves_and_value(is_admin=is_admin()): if solve.teamid == teamid: j = { 'team': solve.teamid, 'value': value, 'time': unix_time(solve.date), } if isinstance(solve, Solves) and solve.teamid == session['id']: mark = Marks.query.filter_by(teamid=session['id'], chalid=solve.chalid).first() if mark: j.update({'mark': mark.mark, 'feedback': mark.feedback}) else: j.update({'mark': None, 'feedback': None}) if isinstance(solve, Solves): j['chalid'] = solve.chalid j['chal'] = solve.chal.name j['category'] = solve.chal.category elif isinstance(solve, Awards): j['chalid'] = None j['chal'] = solve.name j['category'] = solve.category else: raise RuntimeError("Objects returned by get_solves_and_value " "should be Solves or Awards") user_solves.append(j) user_solves = sorted(user_solves, key=operator.itemgetter('time')) return jsonify({'solves': user_solves})
def solves(teamid=None): if teamid is None: if authed(): solves = Solves.query.filter_by(teamid=session["id"]).all() else: abort(401) else: solves = Solves.query.filter_by(teamid=teamid).all() db.session.close() json = {"solves": []} for x in solves: json["solves"].append( { "id": x.id, "chal": x.chal.name, "chalid": x.chalid, "team": x.teamid, "value": x.chal.value, "category": x.chal.category, "time": unix_time(x.date), } ) return jsonify(json)
def topteams(count): try: count = int(count) except: count = 10 if count > 20 or count < 0: count = 10 json = {"scores": {}} score = db.func.sum(Challenges.value).label("score") quickest = db.func.max(Solves.date).label("quickest") teams = ( db.session.query(Solves.teamid, Teams.name, score) .join(Teams) .join(Challenges) .filter(Teams.banned == None) .group_by(Solves.teamid) .order_by(score.desc(), quickest) .limit(count) ) for team in teams: solves = Solves.query.filter_by(teamid=team.teamid).all() json["scores"][team.name] = [] for x in solves: json["scores"][team.name].append( { "id": x.teamid, "chal": x.chalid, "team": x.teamid, "value": x.chal.value, "time": unix_time(x.date), } ) return jsonify(json)
def admin_config(): if request.method == "POST": start = None end = None if request.form.get('start'): start = int(request.form['start']) if request.form.get('end'): end = int(request.form['end']) if end < unix_time(datetime.datetime.now()): end = None try: view_challenges_unregistered = bool( request.form.get('view_challenges_unregistered', None)) view_scoreboard_if_authed = bool( request.form.get('view_scoreboard_if_authed', None)) prevent_registration = bool( request.form.get('prevent_registration', None)) prevent_name_change = bool( request.form.get('prevent_name_change', None)) view_after_ctf = bool(request.form.get('view_after_ctf', None)) verify_emails = bool(request.form.get('verify_emails', None)) mail_tls = bool(request.form.get('mail_tls', None)) mail_ssl = bool(request.form.get('mail_ssl', None)) except (ValueError, TypeError): view_challenges_unregistered = None view_scoreboard_if_authed = None prevent_registration = None prevent_name_change = None view_after_ctf = None verify_emails = None mail_tls = None mail_ssl = None finally: view_challenges_unregistered = set_config( 'view_challenges_unregistered', view_challenges_unregistered) view_scoreboard_if_authed = set_config('view_scoreboard_if_authed', view_scoreboard_if_authed) prevent_registration = set_config('prevent_registration', prevent_registration) prevent_name_change = set_config('prevent_name_change', prevent_name_change) view_after_ctf = set_config('view_after_ctf', view_after_ctf) verify_emails = set_config('verify_emails', verify_emails) mail_tls = set_config('mail_tls', mail_tls) mail_ssl = set_config('mail_ssl', mail_ssl) mail_server = set_config("mail_server", request.form.get('mail_server', None)) mail_port = set_config("mail_port", request.form.get('mail_port', None)) mail_username = set_config("mail_username", request.form.get('mail_username', None)) mail_password = set_config("mail_password", request.form.get('mail_password', None)) ctf_name = set_config("ctf_name", request.form.get('ctf_name', None)) ctf_theme = set_config("ctf_theme", request.form.get('ctf_theme', None)) mailfrom_addr = set_config("mailfrom_addr", request.form.get('mailfrom_addr', None)) mg_base_url = set_config("mg_base_url", request.form.get('mg_base_url', None)) mg_api_key = set_config("mg_api_key", request.form.get('mg_api_key', None)) max_tries = set_config("max_tries", request.form.get('max_tries', None)) db_start = Config.query.filter_by(key='start').first() db_start.value = start db_end = Config.query.filter_by(key='end').first() db_end.value = end db.session.add(db_start) db.session.add(db_end) db.session.commit() db.session.close() with app.app_context(): cache.clear() return redirect(url_for('admin.admin_config')) with app.app_context(): cache.clear() ctf_name = get_config('ctf_name') ctf_theme = get_config('ctf_theme') max_tries = get_config('max_tries') mail_server = get_config('mail_server') mail_port = get_config('mail_port') mail_username = get_config('mail_username') mail_password = get_config('mail_password') mailfrom_addr = get_config('mailfrom_addr') mg_api_key = get_config('mg_api_key') mg_base_url = get_config('mg_base_url') if not max_tries: set_config('max_tries', 0) max_tries = 0 view_after_ctf = get_config('view_after_ctf') start = get_config('start') end = get_config('end') mail_tls = get_config('mail_tls') mail_ssl = get_config('mail_ssl') view_challenges_unregistered = get_config('view_challenges_unregistered') view_scoreboard_if_authed = get_config('view_scoreboard_if_authed') prevent_registration = get_config('prevent_registration') prevent_name_change = get_config('prevent_name_change') verify_emails = get_config('verify_emails') db.session.commit() db.session.close() months = [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ] curr_year = datetime.date.today().year start_days = 0 end_days = 0 if start: start = datetime.datetime.fromtimestamp(float(start)) start_days = calendar.monthrange(start.year, start.month)[1] if end: end = datetime.datetime.fromtimestamp(float(end)) end_days = calendar.monthrange(end.year, end.month)[1] themes = get_themes() themes.remove(ctf_theme) return render_template( 'admin/config.html', ctf_name=ctf_name, ctf_theme_config=ctf_theme, start=start, end=end, max_tries=max_tries, mail_server=mail_server, mail_port=mail_port, mail_username=mail_username, mail_password=mail_password, mail_tls=mail_tls, mail_ssl=mail_ssl, view_challenges_unregistered=view_challenges_unregistered, view_scoreboard_if_authed=view_scoreboard_if_authed, prevent_registration=prevent_registration, mailfrom_addr=mailfrom_addr, mg_base_url=mg_base_url, mg_api_key=mg_api_key, prevent_name_change=prevent_name_change, verify_emails=verify_emails, view_after_ctf=view_after_ctf, months=months, curr_year=curr_year, start_days=start_days, end_days=end_days, themes=themes)
def topteams(count): try: count = int(count) except: count = 10 if count > 20 or count < 0: count = 10 json = {'scores':{}} #teams = db.engine.execute("SELECT solves.teamid, teams.id, teams.name, SUM(value) as score, MAX(solves.date) as quickest FROM solves JOIN teams ON solves.teamid=teams.id INNER JOIN challenges ON solves.chalid=challenges.id WHERE teams.banned IS NULL GROUP BY solves.teamid ORDER BY score DESC, quickest ASC LIMIT {0};".format(count)) score = db.func.sum(Challenges.value).label('score') teams = db.session.query(Solves.teamid, Teams.name, score, db.func.max(Solves.date).label('quickest')).join(Teams).join(Challenges).filter(Teams.banned == None).group_by(Solves.teamid).order_by(score.desc(), Solves.date).limit(count) for team in teams: solves = Solves.query.filter_by(teamid=team.teamid).all() json['scores'][team.name] = [] for x in solves: json['scores'][team.name].append({'id':x.teamid, 'chal':x.chalid, 'team':x.teamid, 'value': x.chal.value, 'time':unix_time(x.date)}) return jsonify(json)
def solves(teamid=None): if teamid is None: if authed(): solves = Solves.query.filter_by(teamid=session['id']).all() else: abort(401) else: solves = Solves.query.filter_by(teamid=teamid).all() db.session.close() json = {'solves':[]} for x in solves: json['solves'].append({ 'chal':x.chal.name, 'chalid':x.chalid,'team':x.teamid, 'value': x.chal.value, 'category':x.chal.category, 'time':unix_time(x.date)}) return jsonify(json)
def admin_config(): if request.method == "POST": start = None end = None if request.form.get('start'): start = int(request.form['start']) if request.form.get('end'): end = int(request.form['end']) if end < unix_time(datetime.datetime.now()): end = None try: view_challenges_unregistered = bool(request.form.get('view_challenges_unregistered', None)) view_scoreboard_if_authed = bool(request.form.get('view_scoreboard_if_authed', None)) prevent_registration = bool(request.form.get('prevent_registration', None)) prevent_name_change = bool(request.form.get('prevent_name_change', None)) view_after_ctf = bool(request.form.get('view_after_ctf', None)) verify_emails = bool(request.form.get('verify_emails', None)) mail_tls = bool(request.form.get('mail_tls', None)) mail_ssl = bool(request.form.get('mail_ssl', None)) except (ValueError, TypeError): view_challenges_unregistered = None view_scoreboard_if_authed = None prevent_registration = None prevent_name_change = None view_after_ctf = None verify_emails = None mail_tls = None mail_ssl = None finally: view_challenges_unregistered = set_config('view_challenges_unregistered', view_challenges_unregistered) view_scoreboard_if_authed = set_config('view_scoreboard_if_authed', view_scoreboard_if_authed) prevent_registration = set_config('prevent_registration', prevent_registration) prevent_name_change = set_config('prevent_name_change', prevent_name_change) view_after_ctf = set_config('view_after_ctf', view_after_ctf) verify_emails = set_config('verify_emails', verify_emails) mail_tls = set_config('mail_tls', mail_tls) mail_ssl = set_config('mail_ssl', mail_ssl) mail_server = set_config("mail_server", request.form.get('mail_server', None)) mail_port = set_config("mail_port", request.form.get('mail_port', None)) mail_username = set_config("mail_username", request.form.get('mail_username', None)) mail_password = set_config("mail_password", request.form.get('mail_password', None)) ctf_name = set_config("ctf_name", request.form.get('ctf_name', None)) mg_base_url = set_config("mg_base_url", request.form.get('mg_base_url', None)) mg_api_key = set_config("mg_api_key", request.form.get('mg_api_key', None)) max_tries = set_config("max_tries", request.form.get('max_tries', None)) db_start = Config.query.filter_by(key='start').first() db_start.value = start db_end = Config.query.filter_by(key='end').first() db_end.value = end db.session.add(db_start) db.session.add(db_end) db.session.commit() return redirect(url_for('admin.admin_config')) ctf_name = get_config('ctf_name') max_tries = get_config('max_tries') mail_server = get_config('mail_server') mail_port = get_config('mail_port') mail_username = get_config('mail_username') mail_password = get_config('mail_password') mg_api_key = get_config('mg_api_key') mg_base_url = get_config('mg_base_url') if not max_tries: set_config('max_tries', 0) max_tries = 0 view_after_ctf = get_config('view_after_ctf') start = get_config('start') end = get_config('end') mail_tls = get_config('mail_tls') mail_ssl = get_config('mail_ssl') view_challenges_unregistered = get_config('view_challenges_unregistered') view_scoreboard_if_authed = get_config('view_scoreboard_if_authed') prevent_registration = get_config('prevent_registration') prevent_name_change = get_config('prevent_name_change') verify_emails = get_config('verify_emails') db.session.commit() db.session.close() months = [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ] curr_year = datetime.date.today().year start_days = 0 end_days = 0 if start: start = datetime.datetime.fromtimestamp(float(start)) start_days = calendar.monthrange(start.year, start.month)[1] if end: end = datetime.datetime.fromtimestamp(float(end)) end_days = calendar.monthrange(end.year, end.month)[1] return render_template('admin/config.html', ctf_name=ctf_name, start=start, end=end, max_tries=max_tries, mail_server=mail_server, mail_port=mail_port, mail_username=mail_username, mail_password=mail_password, mail_tls=mail_tls, mail_ssl=mail_ssl, view_challenges_unregistered=view_challenges_unregistered, view_scoreboard_if_authed=view_scoreboard_if_authed, prevent_registration=prevent_registration, mg_base_url=mg_base_url, mg_api_key=mg_api_key, prevent_name_change=prevent_name_change, verify_emails=verify_emails, view_after_ctf=view_after_ctf, months=months, curr_year=curr_year, start_days=start_days, end_days=end_days)
def admin_config(): if request.method == "POST": start = None end = None if request.form.get('start'): start = int(request.form['start']) if request.form.get('end'): end = int(request.form['end']) if end < unix_time(datetime.datetime.now()): end = None try: view_challenges_unregistered = bool( request.form.get('view_challenges_unregistered', None)) prevent_registration = bool( request.form.get('prevent_registration', None)) prevent_name_change = bool( request.form.get('prevent_name_change', None)) view_after_ctf = bool(request.form.get('view_after_ctf', None)) except (ValueError, TypeError): view_challenges_unregistered = None prevent_registration = None prevent_name_change = None view_after_ctf = None finally: view_challenges_unregistered = set_config( 'view_challenges_unregistered', view_challenges_unregistered) prevent_registration = set_config('prevent_registration', prevent_registration) prevent_name_change = set_config('prevent_name_change', prevent_name_change) view_after_ctf = set_config('view_after_ctf', view_after_ctf) ctf_name = set_config("ctf_name", request.form.get('ctf_name', None)) mg_api_key = set_config("mg_api_key", request.form.get('mg_api_key', None)) max_tries = set_config("max_tries", request.form.get('max_tries', None)) db_start = Config.query.filter_by(key='start').first() db_start.value = start db_end = Config.query.filter_by(key='end').first() db_end.value = end db.session.add(db_start) db.session.add(db_end) db.session.commit() return redirect(url_for('admin.admin_config')) ctf_name = get_config('ctf_name') if not ctf_name: set_config('ctf_name', None) mg_api_key = get_config('mg_api_key') if not mg_api_key: set_config('mg_api_key', None) max_tries = get_config('max_tries') if not max_tries: set_config('max_tries', 0) max_tries = 0 view_after_ctf = get_config('view_after_ctf') == '1' if not view_after_ctf: set_config('view_after_ctf', 0) view_after_ctf = 0 start = get_config('start') if not start: set_config('start', None) end = get_config('end') if not end: set_config('end', None) view_challenges_unregistered = get_config( 'view_challenges_unregistered') == '1' if not view_challenges_unregistered: set_config('view_challenges_unregistered', None) prevent_registration = get_config('prevent_registration') == '1' if not prevent_registration: set_config('prevent_registration', None) prevent_name_change = get_config('prevent_name_change') == '1' if not prevent_name_change: set_config('prevent_name_change', None) db.session.commit() db.session.close() months = [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ] curr_year = datetime.date.today().year start_days = 0 end_days = 0 if start: start = datetime.datetime.fromtimestamp(float(start)) start_days = calendar.monthrange(start.year, start.month)[1] if end: end = datetime.datetime.fromtimestamp(float(end)) end_days = calendar.monthrange(end.year, end.month)[1] return render_template( 'admin/config.html', ctf_name=ctf_name, start=start, end=end, max_tries=max_tries, view_challenges_unregistered=view_challenges_unregistered, prevent_registration=prevent_registration, mg_api_key=mg_api_key, prevent_name_change=prevent_name_change, view_after_ctf=view_after_ctf, months=months, curr_year=curr_year, start_days=start_days, end_days=end_days)
def solves(teamid=None): if teamid is None: if is_admin(): solves = Solves.query.filter_by(teamid=session['id']).all() elif authed(): solves = Solves.query.join(Teams, Solves.teamid == Teams.id).filter(Solves.teamid==session['id'], Teams.banned==None).all() else: return redirect(url_for('auth.login', next='solves')) else: solves = Solves.query.filter_by(teamid=teamid).all() db.session.close() json = {'solves':[]} for x in solves: json['solves'].append({ 'chal':x.chal.name, 'chalid':x.chalid,'team':x.teamid, 'value': x.chal.value, 'category':x.chal.category, 'time':unix_time(x.date)}) return jsonify(json)
def admin_solves(teamid="all"): if teamid == "all": solves = Solves.query.all() else: solves = Solves.query.filter_by(teamid=teamid).all() db.session.close() json_data = {'solves':[]} for x in solves: json_data['solves'].append({'id':x.id, 'chal':x.chal.name, 'chalid':x.chalid,'team':x.teamid, 'value': x.chal.value, 'category':x.chal.category, 'time':unix_time(x.date)}) return jsonify(json_data)