Example #1
0
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!")
Example #2
0
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!")
Example #3
0
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)
Example #4
0
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)