diff --git a/contest/models.py b/contest/models.py index e9e95564..1e4f45aa 100644 --- a/contest/models.py +++ b/contest/models.py @@ -141,7 +141,7 @@ class ContestRank(models.Model): info["ac_time"] = (submission.create_time - self.contest.start_time).total_seconds() # 之前已经提交过,但是是错误的,这次提交是正确的。错误的题目不计入罚时 - self.total_time += (info["ac_time"] + info["error_time"] * 20 * 60) + self.total_time += (info["ac_time"] + info["error_number"] * 20 * 60) problem = ContestProblem.objects.get(id=submission.problem_id) if problem.total_accepted_number == 0: info["is_first_ac"] = True diff --git a/contest/views.py b/contest/views.py index ccf2c953..3d5ff512 100644 --- a/contest/views.py +++ b/contest/views.py @@ -16,7 +16,8 @@ from utils.shortcuts import (serializer_invalid_response, error_response, from account.models import SUPER_ADMIN, User from account.decorators import login_required from group.models import Group -from .models import Contest, ContestProblem, ContestSubmission, CONTEST_ENDED, CONTEST_NOT_START, CONTEST_UNDERWAY +from .models import (Contest, ContestProblem, ContestSubmission, CONTEST_ENDED, + CONTEST_NOT_START, CONTEST_UNDERWAY, ContestRank) from .models import GROUP_CONTEST, PUBLIC_CONTEST, PASSWORD_PROTECTED_CONTEST from .decorators import check_user_contest_permission from .serializers import (CreateContestSerializer, ContestSerializer, EditContestSerializer, @@ -379,81 +380,16 @@ def contest_list_page(request, page=1): "keyword": keyword, "join": join}) -def _cmp(x, y): - if x["total_ac"] > y["total_ac"]: - return 1 - elif x["total_ac"] < y["total_ac"]: - return -1 - else: - if x["total_time"] < y["total_time"]: - return 1 - else: - return -1 - - -def get_the_formatted_time(seconds): - if not seconds: - return "" - result = str(seconds % 60) - if seconds % 60 < 10: - result = "0" + result - result = str((seconds % 3600) / 60) + ":" + result - if (seconds % 3600) / 60 < 10: - result = "0" + result - result = str(seconds / 3600) + ":" + result - if seconds / 3600 < 10: - result = "0" + result - return result - - @check_user_contest_permission def contest_rank_page(request, contest_id): contest = Contest.objects.get(id=contest_id) contest_problems = ContestProblem.objects.filter(contest=contest).order_by("sort_index") - r = redis.Redis(host=REDIS_CACHE["host"], port=REDIS_CACHE["port"], db=REDIS_CACHE["db"]) - if contest.real_time_rank: - # 更新rank - result = ContestSubmission.objects.filter(contest=contest).values("user_id"). \ - annotate(total_submit=Sum("total_submission_number")) - for i in range(0, len(result)): - # 这个人所有的提交 - submissions = ContestSubmission.objects.filter(user_id=result[i]["user_id"], contest_id=contest_id) - result[i]["submissions"] = {} - result[i]["problems"] = [] - for problem in contest_problems: - try: - status = submissions.get(problem=problem) - result[i]["problems"].append({ - "first_achieved": status.first_achieved, - "ac": status.ac, - "failed_number": status.total_submission_number, - "ac_time": get_the_formatted_time(status.ac_time)}) - if status.ac: - result[i]["problems"][-1]["failed_number"] -= 1 - except ContestSubmission.DoesNotExist: - result[i]["problems"].append({}) - result[i]["total_ac"] = submissions.filter(ac=True).count() - user= User.objects.get(id=result[i]["user_id"]) - result[i]["username"] = user.username - result[i]["real_name"] = user.real_name - result[i]["total_time"] = get_the_formatted_time(submissions.filter(ac=True).aggregate(total_time=Sum("total_time"))["total_time"]) - - result = sorted(result, cmp=_cmp, reverse=True) - r.set("contest_rank_" + contest_id, json.dumps(list(result))) - else: - # 从缓存读取排名信息 - result = r.get("contest_rank_" + contest_id) - if result: - result = json.loads(result) - else: - result = [] - - return render(request, "oj/contest/contest_rank.html", - {"contest": contest, "contest_problems": contest_problems, - "result": result, + rank = ContestRank.objects.filter(contest_id=contest_id).order_by("-total_ac_number", "total_time") + return render(request, "oj/contest/contest_rank_new.html", + {"rank": rank, "contest": contest, + "contest_problems": contest_problems, "auto_refresh": request.GET.get("auto_refresh", None) == "true", - "show_real_name": request.GET.get("show_real_name", None) == "true", - "real_time_rank": contest.real_time_rank}) + "show_real_name": request.GET.get("show_real_name", None) == "true",}) class ContestTimeAPIView(APIView): @@ -468,5 +404,4 @@ class ContestTimeAPIView(APIView): return error_response(u"比赛不存在") return success_response({"start": int((contest.start_time - now()).total_seconds() * 1000), "end": int((contest.end_time - now()).total_seconds() * 1000), - "status": contest.status}) - + "status": contest.status}) \ No newline at end of file diff --git a/template/src/oj/contest/contest_rank.html b/template/src/oj/contest/contest_rank.html index 48c9ec60..4b7f9398 100644 --- a/template/src/oj/contest/contest_rank.html +++ b/template/src/oj/contest/contest_rank.html @@ -3,6 +3,7 @@ 比赛排名 {% endblock %} {% block body %} + {% load contest %}