增加比赛的判题

This commit is contained in:
virusdefender
2015-08-23 18:28:30 +08:00
parent 86d33dd974
commit 7a22d78631
7 changed files with 175 additions and 11 deletions

View File

@@ -0,0 +1,18 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('submission', '0003_auto_20150821_1654'),
]
operations = [
migrations.RemoveField(
model_name='submission',
name='is_counted',
),
]

View File

@@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('submission', '0004_remove_submission_is_counted'),
]
operations = [
migrations.AddField(
model_name='submission',
name='contest_id',
field=models.IntegerField(null=True, blank=True),
),
]

View File

@@ -11,6 +11,7 @@ class Submission(models.Model):
result = models.IntegerField(default=result["waiting"])
language = models.IntegerField()
code = models.TextField()
contest_id = models.IntegerField(blank=True, null=True)
problem_id = models.IntegerField(db_index=True)
# 这个字段可能存储很多数据 比如编译错误、系统错误的时候,存储错误原因字符串
# 正常运行的时候存储 lrun 的判题结果比如cpu时间内存之类的
@@ -18,7 +19,6 @@ class Submission(models.Model):
accepted_answer_time = models.IntegerField(blank=True, null=True)
# 这个字段只有在题目是accepted 的时候才会用到,比赛题目的提交可能还会有得分等信息,存储在这里面
accepted_answer_info = models.TextField(blank=True, null=True)
is_counted = models.BooleanField(default=False)
class Meta:
db_table = "submission"

View File

@@ -19,4 +19,11 @@ class SubmissionSerializer(serializers.ModelSerializer):
fields = ["id", "result", "create_time", "language", "user"]
def _get_submission_user(self, obj):
return User.objects.get(id=obj.user_id).username
return User.objects.get(id=obj.user_id).username
class CreateContestSubmissionSerializer(serializers.Serializer):
contest_id = serializers.IntegerField()
problem_id = serializers.IntegerField()
language = serializers.IntegerField()
code = serializers.CharField(max_length=3000)

View File

@@ -1,21 +1,22 @@
# coding=utf-8
import json
import redis
import redis
from django.shortcuts import render
from django.core.paginator import Paginator
from rest_framework.views import APIView
from judge.judger.result import result
from problem.models import Problem
from judge.judger_controller.tasks import judge
from judge.judger_controller.settings import redis_config
from account.decorators import login_required
from account.models import SUPER_ADMIN
from problem.models import Problem
from contest.models import Contest, ContestProblem
from contest.decorators import check_user_contest_permission
from utils.shortcuts import serializer_invalid_response, error_response, success_response, error_page, paginate
from .models import Submission
from .serializers import CreateSubmissionSerializer, SubmissionSerializer
from django.core.paginator import Paginator
from .serializers import CreateSubmissionSerializer, SubmissionSerializer, CreateContestSubmissionSerializer
class SubmissionAPIView(APIView):
@@ -136,3 +137,44 @@ def my_submission_list_page(request, page=1):
return render(request, "oj/submission/my_submissions_list.html",
{"submissions": current_page, "page": int(page),
"previous_page": previous_page, "next_page": next_page, "start_id": int(page) * 20 - 20})
class ContestSubmissionAPIView(APIView):
@check_user_contest_permission
def post(self, request):
"""
创建比赛的提交
---
request_serializer: ConestSubmissionSerializer
"""
serializer = CreateContestSubmissionSerializer(data=request.data)
if serializer.is_valid():
data = serializer.data
try:
contest = Contest.objects.get(id=data["contest_id"])
except Contest.DoesNotExist:
return error_response(u"比赛不存在")
try:
problem = ContestProblem.objects.get(contest=contest, id=data["problem_id"])
# 更新题目提交计数器
problem.total_submit_number += 1
problem.save()
except Problem.DoesNotExist:
return error_response(u"题目不存在")
submission = Submission.objects.create(user_id=request.user.id, language=int(data["language"]),
contest_id=contest.id, code=data["code"], problem_id=problem.id)
try:
judge.delay(submission.id, problem.time_limit, problem.memory_limit, problem.test_case_id)
except Exception:
return error_response(u"提交判题任务失败")
# 增加redis 中判题队列长度的计数器
r = redis.Redis(host=redis_config["host"], port=redis_config["port"], db=redis_config["db"])
r.incr("judge_queue_length")
return success_response({"submission_id": submission.id})
else:
return serializer_invalid_response(serializer)