def problem_submit(): params = utils.flat_multi(request.form) pid = params.get("pid") flag = params.get("flag") tid = session.get("tid") _user = user.get_user().first() username = _user.username problem = Problems.query.filter_by(pid=pid).first() team = Teams.query.filter_by(tid=tid).first() solved = Solves.query.filter_by(pid=pid, tid=tid, correct=1).first() if solved: raise WebException("You already solved this problem.") flag_tried = Solves.query.filter_by(pid=pid, flag=flag).first() if flag_tried: raise WebException("Your team has already tried this solution.") if problem: if problem.category == "Programming": raise WebException( "Please submit programming problems using the Programming interface." ) grader = imp.load_source("grader", problem.grader) random = None if problem.autogen: random = autogen.get_random(pid, tid) correct, response = grader.grade(random, flag) solve = Solves(pid, _user.uid, tid, flag, correct) db.session.add(solve) db.session.commit() if correct: # Wait until after the solve has been added to the database before adding bonus solves = get_solves(pid) solve.bonus = [-1, solves][solves < 4] cache.invalidate_memoization(get_solves, pid) if _user: activity = UserActivity(_user.uid, 3, tid=tid, pid=pid) db.session.add(activity) db.session.commit() logger.log(__name__, "%s has solved %s by submitting %s" % (team.teamname, problem.title, flag), level=logger.WARNING) return {"success": 1, "message": response} else: logger.log(__name__, "%s has incorrectly submitted %s to %s" % (team.teamname, flag, problem.title), level=logger.WARNING) raise WebException(response) else: raise WebException("Problem does not exist!")
def problem_submit(): params = utils.flat_multi(request.form) pid = params.get("pid") flag = params.get("flag") tid = session.get("tid") _user = user.get_user().first() username = _user.username problem = Problems.query.filter_by(pid=pid).first() team = Teams.query.filter_by(tid=tid).first() solved = Solves.query.filter_by(pid=pid, tid=tid, correct=1).first() if solved: raise WebException("You already solved this problem.") flag_tried = Solves.query.filter_by(pid=pid, flag=flag).first() if flag_tried: raise WebException("Your team has already tried this solution.") if problem: if problem.category == "Programming": raise WebException("Please submit programming problems using the Programming interface.") grader = imp.load_source("grader", problem.grader) random = None if problem.autogen: random = autogen.get_random(pid, tid) correct, response = grader.grade(random, flag) solve = Solves(pid, _user.uid, tid, flag, correct) db.session.add(solve) db.session.commit() if correct: # Wait until after the solve has been added to the database before adding bonus solves = get_solves(pid) solve.bonus = [-1, solves][solves < 4] cache.invalidate_memoization(get_solves, pid) if _user: activity = UserActivity(_user.uid, 3, tid=tid, pid=pid) db.session.add(activity) db.session.commit() logger.log(__name__, "%s has solved %s by submitting %s" % (team.teamname, problem.title, flag), level=logger.WARNING) return { "success": 1, "message": response } else: logger.log(__name__, "%s has incorrectly submitted %s to %s" % (team.teamname, flag, problem.title), level=logger.WARNING) raise WebException(response) else: raise WebException("Problem does not exist!")
def problem_data(): if "admin" in session and session["admin"]: pass elif "tid" not in session or session["tid"] <= 0: raise WebException("You need a team.") elif team.get_team(tid=session.get("tid")).first().finalized != True: raise WebException("Your team is not finalized.") problems = Problems.query.order_by(Problems.value).all() problems_return = [] for problem in problems: solves = get_solves(problem.pid) solved = Solves.query.filter_by(pid=problem.pid, tid=session.get("tid", None), correct=1).first() solved = ["Solved", "Unsolved"][solved is None] description = process_description(problem.description) data = { "pid": problem.pid, "title": problem.title, "category": problem.category, "description": description, "hint": problem.hint, "value": problem.value, "solves": solves, "solved": solved } admin_data = { "description_source": problem.description, "threshold": problem.threshold, "weightmap": problem.weightmap, "grader_contents": open(problem.grader, "r").read(), "bonus": problem.bonus, "autogen": problem.autogen == True } if "admin" in session and session["admin"]: data.update(admin_data) if problem.autogen: grader = imp.load_source("grader", problem.grader) tid = session.get("tid", "team") try: data.update( grader.generate_problem( autogen.get_random(problem.pid, tid), problem.pid)) except Exception, e: logger.log( __name__, "The grader for \"%s\" has thrown an error: %s" % (problem.title, e)) problems_return.append(data)
def problem_data(): if "admin" in session and session["admin"]: pass elif "tid" not in session or session["tid"] <= 0: raise WebException("You need a team.") elif team.get_team(tid=session.get("tid")).first().finalized != True: raise WebException("Your team is not finalized.") problems = Problems.query.order_by(Problems.value).all() problems_return = [ ] for problem in problems: solves = get_solves(problem.pid) solved = Solves.query.filter_by(pid=problem.pid, tid=session.get("tid", None), correct=1).first() solved = ["Solved", "Unsolved"][solved is None] description = process_description(problem.description) data = { "pid": problem.pid, "title": problem.title, "category": problem.category, "description": description, "hint": problem.hint, "value": problem.value, "solves": solves, "solved": solved } admin_data = { "description_source": problem.description, "threshold": problem.threshold, "weightmap": problem.weightmap, "grader_contents": open(problem.grader, "r").read(), "bonus": problem.bonus, "autogen": problem.autogen == True } if "admin" in session and session["admin"]: data.update(admin_data) if problem.autogen: grader = imp.load_source("grader", problem.grader) tid = session.get("tid", "team") try: data.update(grader.generate_problem(autogen.get_random(problem.pid, tid), problem.pid)) except Exception, e: logger.log(__name__, "The grader for \"%s\" has thrown an error: %s" % (problem.title, e)) problems_return.append(data)