修改 admin 界面,ip 太宽了
monitor 不再使用,配置判题服务器的代码移入 judge_dispatcher 里面
添加前端后台判题服务器管理页面一些校验的功能
去掉判题服务器监控的前端和后端
修复比赛 first ac 显示错误的问题
修复两步验证中的错误
tfa 显示 url
增加 qrcode 依赖
完成两步验证的逻辑
fix error package name and add pip mirrorwq
废弃 huey,多数据库连接的时候存在 connection 无法释放的问题,回到 celery
修复 huey 队列不会释放数据库连接的问题,是用法不对
增加关闭两步验证的 api
增加两步验证基础代码
完善 sso 登录部分
规范配置文件写法;数据库用户名也在环境变量中取
个人博客链接前面也增加图标
修改判题机器的配置文件
删除不再使用的配置文件
Squash from a1fff74 to 12f96c6 by virusdefender
This commit is contained in:
25
judge_dispatcher/migrations/0003_auto_20151223_0029.py
Normal file
25
judge_dispatcher/migrations/0003_auto_20151223_0029.py
Normal file
@@ -0,0 +1,25 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('judge_dispatcher', '0002_auto_20151207_2310'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='judgeserver',
|
||||
name='create_time',
|
||||
field=models.DateTimeField(auto_now_add=True, null=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='judgeserver',
|
||||
name='name',
|
||||
field=models.CharField(default='judger', max_length=30),
|
||||
preserve_default=False,
|
||||
),
|
||||
]
|
||||
@@ -3,6 +3,7 @@ from django.db import models
|
||||
|
||||
|
||||
class JudgeServer(models.Model):
|
||||
name = models.CharField(max_length=30)
|
||||
ip = models.GenericIPAddressField()
|
||||
port = models.IntegerField()
|
||||
# 这个服务器最大可能运行的判题实例数量
|
||||
@@ -14,6 +15,7 @@ class JudgeServer(models.Model):
|
||||
lock = models.BooleanField(default=False)
|
||||
# status 为 false 的时候代表不使用这个服务器
|
||||
status = models.BooleanField(default=True)
|
||||
create_time = models.DateTimeField(auto_now_add=True, blank=True, null=True)
|
||||
|
||||
def use_judge_instance(self):
|
||||
# 因为use 和 release 中间是判题时间,可能这个 model 的数据已经被修改了,所以不能直接使用self.xxx,否则取到的是旧数据
|
||||
|
||||
29
judge_dispatcher/serializers.py
Normal file
29
judge_dispatcher/serializers.py
Normal file
@@ -0,0 +1,29 @@
|
||||
# coding=utf-8
|
||||
import json
|
||||
from rest_framework import serializers
|
||||
from .models import JudgeServer
|
||||
|
||||
|
||||
class CreateJudgesSerializer(serializers.Serializer):
|
||||
name = serializers.CharField(max_length=30)
|
||||
ip = serializers.IPAddressField()
|
||||
port = serializers.IntegerField()
|
||||
# 这个服务器最大可能运行的判题实例数量
|
||||
max_instance_number = serializers.IntegerField()
|
||||
token = serializers.CharField(max_length=30)
|
||||
|
||||
|
||||
class EditJudgesSerializer(serializers.Serializer):
|
||||
id = serializers.IntegerField()
|
||||
name = serializers.CharField(max_length=30)
|
||||
ip = serializers.IPAddressField()
|
||||
port = serializers.IntegerField()
|
||||
# 这个服务器最大可能运行的判题实例数量
|
||||
max_instance_number = serializers.IntegerField()
|
||||
token = serializers.CharField(max_length=30)
|
||||
status = serializers.BooleanField()
|
||||
|
||||
|
||||
class JudgesSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = JudgeServer
|
||||
@@ -32,7 +32,7 @@ class JudgeDispatcher(object):
|
||||
if servers.exists():
|
||||
return servers.first()
|
||||
|
||||
def judge(self, is_waiting_task=False):
|
||||
def judge(self):
|
||||
self.submission.judge_start_time = int(time.time() * 1000)
|
||||
|
||||
with transaction.atomic():
|
||||
@@ -89,9 +89,9 @@ class JudgeDispatcher(object):
|
||||
submission = Submission.objects.get(id=waiting_submission.submission_id)
|
||||
waiting_submission.delete()
|
||||
|
||||
_judge(submission, time_limit=waiting_submission.time_limit,
|
||||
memory_limit=waiting_submission.memory_limit, test_case_id=waiting_submission.test_case_id,
|
||||
is_waiting_task=True)
|
||||
_judge.delay(submission, time_limit=waiting_submission.time_limit,
|
||||
memory_limit=waiting_submission.memory_limit, test_case_id=waiting_submission.test_case_id,
|
||||
is_waiting_task=True)
|
||||
|
||||
def update_problem_status(self):
|
||||
problem = Problem.objects.get(id=self.submission.problem_id)
|
||||
@@ -113,13 +113,14 @@ class JudgeDispatcher(object):
|
||||
# 普通题目的话,到这里就结束了
|
||||
|
||||
def update_contest_problem_status(self):
|
||||
# 能运行到这里的都是比赛题目
|
||||
# 能运行到这里的都是比赛题目a
|
||||
contest = Contest.objects.get(id=self.submission.contest_id)
|
||||
if contest.status != CONTEST_UNDERWAY:
|
||||
logger.info("Contest debug mode, id: " + str(contest.id) + ", submission id: " + self.submission.id)
|
||||
return
|
||||
with transaction.atomic():
|
||||
contest_problem = ContestProblem.objects.select_for_update().get(contest=contest, id=self.submission.problem_id)
|
||||
contest_problem = ContestProblem.objects.select_for_update().get(contest=contest,
|
||||
id=self.submission.problem_id)
|
||||
|
||||
contest_problem.add_submission_number()
|
||||
|
||||
|
||||
71
judge_dispatcher/views.py
Normal file
71
judge_dispatcher/views.py
Normal file
@@ -0,0 +1,71 @@
|
||||
# coding=utf-8
|
||||
from rest_framework.views import APIView
|
||||
|
||||
from account.decorators import super_admin_required
|
||||
from utils.shortcuts import success_response, serializer_invalid_response, error_response, paginate
|
||||
from .serializers import CreateJudgesSerializer, JudgesSerializer, EditJudgesSerializer
|
||||
from .models import JudgeServer
|
||||
|
||||
|
||||
class AdminJudgeServerAPIView(APIView):
|
||||
@super_admin_required
|
||||
def post(self, request):
|
||||
"""
|
||||
添加判题服务器 json api接口
|
||||
---
|
||||
request_serializer: CreateJudgesSerializer
|
||||
response_serializer: JudgesSerializer
|
||||
"""
|
||||
serializer = CreateJudgesSerializer(data=request.data)
|
||||
if serializer.is_valid():
|
||||
data = serializer.data
|
||||
judge_server = JudgeServer.objects.create(name=data["name"], ip=data["ip"], port=data["port"],
|
||||
max_instance_number=data["max_instance_number"],
|
||||
token=data["token"],
|
||||
created_by=request.user)
|
||||
return success_response(JudgesSerializer(judge_server).data)
|
||||
else:
|
||||
return serializer_invalid_response(serializer)
|
||||
|
||||
@super_admin_required
|
||||
def put(self, request):
|
||||
"""
|
||||
修改判题服务器信息 json api接口
|
||||
---
|
||||
request_serializer: EditJudgesSerializer
|
||||
response_serializer: JudgesSerializer
|
||||
"""
|
||||
serializer = EditJudgesSerializer(data=request.data)
|
||||
if serializer.is_valid():
|
||||
data = serializer.data
|
||||
try:
|
||||
judge_server = JudgeServer.objects.get(pk=data["id"])
|
||||
except JudgeServer.DoesNotExist:
|
||||
return error_response(u"此判题服务器不存在!")
|
||||
|
||||
judge_server.name = data["name"]
|
||||
judge_server.ip = data["ip"]
|
||||
judge_server.port = data["port"]
|
||||
judge_server.max_instance_number = data["max_instance_number"]
|
||||
judge_server.token = data["token"]
|
||||
judge_server.status = data["status"]
|
||||
judge_server.save()
|
||||
return success_response(JudgesSerializer(judge_server).data)
|
||||
else:
|
||||
return serializer_invalid_response(serializer)
|
||||
|
||||
@super_admin_required
|
||||
def get(self, request):
|
||||
"""
|
||||
获取全部判题服务器
|
||||
"""
|
||||
judge_server_id = request.GET.get("judge_server_id", None)
|
||||
if judge_server_id:
|
||||
try:
|
||||
judge_server = JudgeServer.objects.get(id=judge_server_id)
|
||||
except JudgeServer.DoesNotExist:
|
||||
return error_response(u"判题服务器不存在")
|
||||
return success_response(JudgesSerializer(judge_server).data)
|
||||
judge_server = JudgeServer.objects.all()
|
||||
|
||||
return paginate(request, judge_server, JudgesSerializer)
|
||||
Reference in New Issue
Block a user