diff --git a/judge/dispatcher.py b/judge/dispatcher.py index bdc9a0cb..f96fd4c2 100644 --- a/judge/dispatcher.py +++ b/judge/dispatcher.py @@ -101,12 +101,14 @@ class JudgeDispatcher(object): if resp["err"]: self.submission_obj.result = JudgeStatus.COMPILE_ERROR else: + # 用时和内存占用保存为多个测试点中最长的那个 + self.submission_obj.statistic_info["time_cost"] = max([x["cpu_time"] for x in resp["data"]]) + self.submission_obj.statistic_info["memory_cost"] = max([x["memory"] for x in resp["data"]]) + error_test_case = list(filter(lambda case: case["result"] != 0, resp["data"])) # 多个测试点全部正确AC,否则 ACM模式下取第一个错误的测试点状态, OI模式对应为部分正确 if not error_test_case: self.submission_obj.result = JudgeStatus.ACCEPTED - # AC 用时保存为多个测试点中最长的那个 - self.submission_obj.accepted_time = max([x["cpu_time"] for x in resp["data"]]) elif self.problem_obj.rule_type == ProblemRuleType.ACM: self.submission_obj.result = error_test_case[0]["result"] else: diff --git a/problem/views/oj.py b/problem/views/oj.py index 2edde238..a6875206 100644 --- a/problem/views/oj.py +++ b/problem/views/oj.py @@ -16,7 +16,7 @@ class ProblemAPI(APIView): problem_id = request.GET.get("id") if problem_id: try: - problem = Problem.objects.get(id=problem_id, visible=True) + problem = Problem.objects.get(_id=problem_id, visible=True) return self.success(ProblemSerializer(problem).data) except Problem.DoesNotExist: return self.error("Problem does not exist") diff --git a/submission/migrations/0003_auto_20170704_1243.py b/submission/migrations/0003_auto_20170704_1243.py new file mode 100644 index 00000000..58fa83c3 --- /dev/null +++ b/submission/migrations/0003_auto_20170704_1243.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.6 on 2017-07-04 12:43 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('submission', '0002_auto_20170509_1203'), + ] + + operations = [ + migrations.RenameField( + model_name='submission', + old_name='accepted_info', + new_name='statistic_info', + ), + migrations.RemoveField( + model_name='submission', + name='accepted_time', + ), + ] diff --git a/submission/models.py b/submission/models.py index 2687004c..d690cfe6 100644 --- a/submission/models.py +++ b/submission/models.py @@ -30,9 +30,8 @@ class Submission(models.Model): info = JSONField(default={}) language = models.CharField(max_length=20) shared = models.BooleanField(default=False) - # 题目状态为 Accepted 时才会存储相关info - accepted_time = models.IntegerField(blank=True, null=True) - accepted_info = JSONField(default={}) + # 存储该提交所用时间和内存值,方便提交列表显示 + statistic_info = JSONField(default={}) class Meta: db_table = "submission" diff --git a/submission/serializers.py b/submission/serializers.py index da439458..8b79970a 100644 --- a/submission/serializers.py +++ b/submission/serializers.py @@ -1,4 +1,5 @@ from .models import Submission +from account.models import User from utils.api import serializers from judge.languages import language_names @@ -10,8 +11,13 @@ class CreateSubmissionSerializer(serializers.Serializer): class SubmissionModelSerializer(serializers.ModelSerializer): + username = serializers.SerializerMethodField() info = serializers.JSONField() - accepted_info = serializers.JSONField() + statistic_info = serializers.JSONField() class Meta: model = Submission + + @staticmethod + def get_username(obj): + return User.objects.get(id=obj.user_id).username diff --git a/submission/views/oj.py b/submission/views/oj.py index f13e3c9e..57172b7b 100644 --- a/submission/views/oj.py +++ b/submission/views/oj.py @@ -28,14 +28,14 @@ def _submit(response, user, problem_id, language, code, contest_id=None): return response.error("Please wait %d seconds" % int(bucket.expected_time() + 1)) try: - problem = Problem.objects.get(id=problem_id) + problem = Problem.objects.get(_id=problem_id) except Problem.DoesNotExist: return response.error("Problem not exist") submission = Submission.objects.create(user_id=user.id, language=language, code=code, - problem_id=problem.id, + problem_id=problem._id, contest_id=contest_id) # todo 暂时保留 方便排错 # JudgeDispatcher(submission.id, problem.id).judge() @@ -60,8 +60,13 @@ class SubmissionAPI(APIView): return self.error("Submission not exist") return self.success(SubmissionModelSerializer(submission).data) + contest_id = request.GET.get("contest_id") + if contest_id: + subs = Submission.objects.filter(contest_id__isnull=False) + else: + subs = Submission.objects.filter(contest_id__isnull=True) + problem_id = request.GET.get("problem_id") - subs = Submission.objects.filter(contest_id__isnull=True) if problem_id: subs = subs.filter(problem_id=problem_id)