problem改用_id作为搜索用主键;submission更加statistic_info字段

This commit is contained in:
zemal 2017-07-04 20:59:25 +08:00
parent 91eb7b5bb6
commit 62274224a9
6 changed files with 46 additions and 10 deletions

View File

@ -101,12 +101,14 @@ class JudgeDispatcher(object):
if resp["err"]: if resp["err"]:
self.submission_obj.result = JudgeStatus.COMPILE_ERROR self.submission_obj.result = JudgeStatus.COMPILE_ERROR
else: 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"])) error_test_case = list(filter(lambda case: case["result"] != 0, resp["data"]))
# 多个测试点全部正确AC否则 ACM模式下取第一个错误的测试点状态, OI模式对应为部分正确 # 多个测试点全部正确AC否则 ACM模式下取第一个错误的测试点状态, OI模式对应为部分正确
if not error_test_case: if not error_test_case:
self.submission_obj.result = JudgeStatus.ACCEPTED 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: elif self.problem_obj.rule_type == ProblemRuleType.ACM:
self.submission_obj.result = error_test_case[0]["result"] self.submission_obj.result = error_test_case[0]["result"]
else: else:

View File

@ -16,7 +16,7 @@ class ProblemAPI(APIView):
problem_id = request.GET.get("id") problem_id = request.GET.get("id")
if problem_id: if problem_id:
try: 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) return self.success(ProblemSerializer(problem).data)
except Problem.DoesNotExist: except Problem.DoesNotExist:
return self.error("Problem does not exist") return self.error("Problem does not exist")

View File

@ -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',
),
]

View File

@ -30,9 +30,8 @@ class Submission(models.Model):
info = JSONField(default={}) info = JSONField(default={})
language = models.CharField(max_length=20) language = models.CharField(max_length=20)
shared = models.BooleanField(default=False) shared = models.BooleanField(default=False)
# 题目状态为 Accepted 时才会存储相关info # 存储该提交所用时间和内存值,方便提交列表显示
accepted_time = models.IntegerField(blank=True, null=True) statistic_info = JSONField(default={})
accepted_info = JSONField(default={})
class Meta: class Meta:
db_table = "submission" db_table = "submission"

View File

@ -1,4 +1,5 @@
from .models import Submission from .models import Submission
from account.models import User
from utils.api import serializers from utils.api import serializers
from judge.languages import language_names from judge.languages import language_names
@ -10,8 +11,13 @@ class CreateSubmissionSerializer(serializers.Serializer):
class SubmissionModelSerializer(serializers.ModelSerializer): class SubmissionModelSerializer(serializers.ModelSerializer):
username = serializers.SerializerMethodField()
info = serializers.JSONField() info = serializers.JSONField()
accepted_info = serializers.JSONField() statistic_info = serializers.JSONField()
class Meta: class Meta:
model = Submission model = Submission
@staticmethod
def get_username(obj):
return User.objects.get(id=obj.user_id).username

View File

@ -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)) return response.error("Please wait %d seconds" % int(bucket.expected_time() + 1))
try: try:
problem = Problem.objects.get(id=problem_id) problem = Problem.objects.get(_id=problem_id)
except Problem.DoesNotExist: except Problem.DoesNotExist:
return response.error("Problem not exist") return response.error("Problem not exist")
submission = Submission.objects.create(user_id=user.id, submission = Submission.objects.create(user_id=user.id,
language=language, language=language,
code=code, code=code,
problem_id=problem.id, problem_id=problem._id,
contest_id=contest_id) contest_id=contest_id)
# todo 暂时保留 方便排错 # todo 暂时保留 方便排错
# JudgeDispatcher(submission.id, problem.id).judge() # JudgeDispatcher(submission.id, problem.id).judge()
@ -60,8 +60,13 @@ class SubmissionAPI(APIView):
return self.error("Submission not exist") return self.error("Submission not exist")
return self.success(SubmissionModelSerializer(submission).data) 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") problem_id = request.GET.get("problem_id")
subs = Submission.objects.filter(contest_id__isnull=True)
if problem_id: if problem_id:
subs = subs.filter(problem_id=problem_id) subs = subs.filter(problem_id=problem_id)