def post_challenge(): form = ChallengeForm() runIds = form.data['runs'] if runIds is None or len(runIds) != 1: return redirect( '/?challengeError=Please select exactly one run to challenge') if current_user is not None and hasattr(current_user, 'id'): prev_challenged_run = db.session.query(Challenge).filter( Challenge.runner_id == current_user.id).first() #found a previosly challenged run, gotta make it unchallenged and then challenge the next one if prev_challenged_run: db.session.delete(prev_challenged_run) if prev_challenged_run.run_id != int(runIds[0]): # I'm not unchallenging a run, but challenging a new one new_challenge = db.session.query(Run).filter( Run.runner_id == current_user.id, Run.id == runIds[0]).first() if new_challenge is not None: challenge = Challenge() challenge.run_id = runIds[0] challenge.runner = current_user challenge.runner_id = current_user.id challenge.run = new_challenge latest_id = db.session.query(func.max(Run.id)).scalar() challenge.latest_run_id = latest_id db.session.add(challenge) db.session.commit() else: # just challenge the new one new_challenge = db.session.query(Run).filter( Run.runner_id == current_user.id, Run.id == runIds[0]).first() if new_challenge is not None: challenge = Challenge() challenge.run_id = runIds[0] challenge.runner = current_user challenge.runner_id = current_user.id challenge.run = new_challenge latest_id = db.session.query(func.max(Run.id)).scalar() challenge.latest_run_id = latest_id db.session.add(challenge) db.session.commit() else: return redirect("/login") return redirect("/")
def rand_chal(cat): t = token_hex(2+int(random()*8)) return Challenge( title=t, flag=t, category=cat, points=int(random()*100), text=' '.join([token_hex(int(random()*12)) for _ in range(10)]), )