def __init__(self, prob: Problem, user: User): probpath = f"/problems/{prob.id}" btn = f"rejudgeAll('{prob.id}')" if user.isAdmin() else None title = prob.title if not user.isAdmin(): # Compute problem status icon = '' result = '' for sub in Submission.all(): if sub.problem != prob or sub.user != user or sub.status == Submission.STATUS_REVIEW: continue if sub.user == user and "ok" == sub.result: icon = "check" break else: icon = "times" if icon != '': result = f'<i class="fa fa-{icon}"></i> ' title = result + title self.html = Card(title, prob.description, probpath, rejudge=btn)
def get_user_subs_map(contest: Contest) -> dict: contest_prob_ids = [prob.id for prob in contest.problems] subs = {} for sub in Submission.all(): if contest.start <= sub.timestamp <= contest.end and not sub.user.isAdmin() and sub.problem.id in contest_prob_ids: subs[sub.user.id] = subs.get(sub.user.id, []) subs[sub.user.id].append(sub) return subs
def generateLogReport(request): user = User.getCurrent(request) contest = Contest.getCurrent() or Contest.getPast() if not contest: return HttpResponse( Page(h1(" "), h1("No Contest Available", cls="center"))) elif contest.isScoreboardOff(user): return HttpResponse( Page(h1(" "), h1("Scoreboard is off.", cls="center"))) start = contest.start end = contest.end users = {} for sub in Submission.all(): if start <= sub.timestamp <= end and not sub.user.isAdmin( ) and sub.result == "ok": username = User.get(sub.user.id).username problemName = Problem.get(sub.problem.id).title if username not in users.keys(): users[username] = {} if problemName not in users[username].keys(): users[username][problemName] = sub if sub.timestamp < users[username][problemName].timestamp: users[username][problemName] = sub correctSubmissions = [] for user in users.keys(): for problem in users[user].keys(): correctSubmissions.append( (user, problem, users[user][problem].timestamp)) correctSubmissions.sort(key=lambda entry: entry[2]) tableRows = constructTableRows(correctSubmissions) return HttpResponse( Page( h2("Correct Submissions Log", cls="page-title"), h.table( h.thead( h.tr( h.th("Contestant Name"), h.th("Problem title"), h.th("Time"), )), h.tbody(*tableRows))))
def __init__(self, contest): logger.warn(f"Submissions: {Submission.all()}") subs = sorted(filter( lambda sub: sub.user.type != "admin" and contest.start <= sub. timestamp <= contest.end, Submission.all()), key=lambda s: s.timestamp) self.html = h.table( h.thead( h.tr( h.th("Contestant"), h.th("Problem"), h.th("Id"), h.th("Language"), h.th("Result"), h.th("Status"), h.th("Checkout"), )), h.tbody(*map(lambda sub: SubmissionRow(sub), subs)), id="submissions")
def rejudgeAll(request): """Ajax method: Rejudge all submissions for problem `id`""" user = User.getCurrent(request) ctime = time.time() * 1000 id = request.POST["id"] subsToRejudge = [ sub for sub in Submission.all() if sub.problem.id == id and sub.timestamp < ctime and sub.result != 'reject' ] if not Status.instance().startRejudge(id, subsToRejudge): return JsonResponse( "Another rejudge all is still progress. See System Status below to monitor progress.", safe=False) RejudgeThread(user, subsToRejudge).start() return JsonResponse( "Rejudge started. Click System Status below to monitor progress.", safe=False)
def __init__(self, x, cont): num, prob = x subs = filter( lambda sub: sub.problem == prob and cont.start <= sub.timestamp <= cont.end, Submission.all()) self.html = div(*map(SubmissionCard, subs), id=f"tabs-{num}")