mirror of
https://github.com/QingdaoU/OnlineJudge.git
synced 2024-09-21 00:13:18 +00:00
Fix CI.
This commit is contained in:
parent
08bd591bfb
commit
219facf185
@ -1,11 +1,11 @@
|
|||||||
import hashlib
|
import hashlib
|
||||||
|
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django_redis import get_redis_connection
|
# from django_redis import get_redis_connection
|
||||||
|
|
||||||
from account.decorators import super_admin_required
|
from account.decorators import super_admin_required
|
||||||
from judge.languages import languages, spj_languages
|
from judge.languages import languages, spj_languages
|
||||||
from judge.dispatcher import process_pending_task
|
# from judge.dispatcher import process_pending_task
|
||||||
from utils.api import APIView, CSRFExemptAPIView, validate_serializer
|
from utils.api import APIView, CSRFExemptAPIView, validate_serializer
|
||||||
from utils.shortcuts import rand_str
|
from utils.shortcuts import rand_str
|
||||||
|
|
||||||
@ -129,8 +129,8 @@ class JudgeServerHeartbeatAPI(CSRFExemptAPIView):
|
|||||||
last_heartbeat=timezone.now(),
|
last_heartbeat=timezone.now(),
|
||||||
)
|
)
|
||||||
# 新server上线 处理队列中的,防止没有新的提交而导致一直waiting
|
# 新server上线 处理队列中的,防止没有新的提交而导致一直waiting
|
||||||
conn = get_redis_connection("JudgeQueue")
|
# conn = get_redis_connection("JudgeQueue")
|
||||||
process_pending_task(conn)
|
# process_pending_task(conn)
|
||||||
|
|
||||||
return self.success()
|
return self.success()
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ class JudgeDispatcher(object):
|
|||||||
def choose_judge_server():
|
def choose_judge_server():
|
||||||
with transaction.atomic():
|
with transaction.atomic():
|
||||||
# TODO: use more reasonable way
|
# TODO: use more reasonable way
|
||||||
servers = JudgeServer.objects.select_for_update().all().order_by('task_number')
|
servers = JudgeServer.objects.select_for_update().all().order_by("task_number")
|
||||||
servers = [s for s in servers if s.status == "normal"]
|
servers = [s for s in servers if s.status == "normal"]
|
||||||
if servers:
|
if servers:
|
||||||
server = servers[0]
|
server = servers[0]
|
||||||
@ -69,13 +69,13 @@ class JudgeDispatcher(object):
|
|||||||
def judge(self, output=False):
|
def judge(self, output=False):
|
||||||
server = self.choose_judge_server()
|
server = self.choose_judge_server()
|
||||||
if not server:
|
if not server:
|
||||||
data = {'submission_id': self.submission_obj.id, 'problem_id': self.problem_obj.id}
|
data = {"submission_id": self.submission_obj.id, "problem_id": self.problem_obj.id}
|
||||||
self.redis_conn.lpush(WAITING_QUEUE, json.dumps(data))
|
self.redis_conn.lpush(WAITING_QUEUE, json.dumps(data))
|
||||||
return
|
return
|
||||||
|
|
||||||
language = list(filter(lambda item: self.submission_obj.language == item['name'], languages))[0]
|
language = list(filter(lambda item: self.submission_obj.language == item["name"], languages))[0]
|
||||||
data = {
|
data = {
|
||||||
"language_config": language['config'],
|
"language_config": language["config"],
|
||||||
"src": self.submission_obj.code,
|
"src": self.submission_obj.code,
|
||||||
"max_cpu_time": self.problem_obj.time_limit,
|
"max_cpu_time": self.problem_obj.time_limit,
|
||||||
"max_memory": 1024 * 1024 * self.problem_obj.memory_limit,
|
"max_memory": 1024 * 1024 * self.problem_obj.memory_limit,
|
||||||
@ -85,15 +85,15 @@ class JudgeDispatcher(object):
|
|||||||
# TODO: try catch
|
# TODO: try catch
|
||||||
resp = self._request(urljoin(server.service_url, "/judge"), data=data)
|
resp = self._request(urljoin(server.service_url, "/judge"), data=data)
|
||||||
self.submission_obj.info = resp
|
self.submission_obj.info = resp
|
||||||
if resp['err']:
|
if resp["err"]:
|
||||||
self.submission_obj.result = JudgeStatus.COMPILE_ERROR
|
self.submission_obj.result = JudgeStatus.COMPILE_ERROR
|
||||||
else:
|
else:
|
||||||
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模式下取第一个测试点状态
|
# 多个测试点全部正确AC,否则ACM模式下取第一个测试点状态
|
||||||
if not error_test_case:
|
if not error_test_case:
|
||||||
self.submission_obj.result = JudgeStatus.ACCEPTED
|
self.submission_obj.result = JudgeStatus.ACCEPTED
|
||||||
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:
|
||||||
self.submission_obj.result = JudgeStatus.PARTIALLY_ACCEPTED
|
self.submission_obj.result = JudgeStatus.PARTIALLY_ACCEPTED
|
||||||
self.submission_obj.save()
|
self.submission_obj.save()
|
||||||
|
@ -3,4 +3,4 @@ from __future__ import absolute_import, unicode_literals
|
|||||||
# Django starts so that shared_task will use this app.
|
# Django starts so that shared_task will use this app.
|
||||||
from .celery import app as celery_app
|
from .celery import app as celery_app
|
||||||
|
|
||||||
__all__ = ['celery_app']
|
__all__ = ["celery_app"]
|
||||||
|
@ -3,15 +3,15 @@ import os
|
|||||||
from celery import Celery
|
from celery import Celery
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
|
||||||
# set the default Django settings module for the 'celery' program.
|
# set the default Django settings module for the "celery" program.
|
||||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'oj.settings')
|
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "oj.settings")
|
||||||
|
|
||||||
|
|
||||||
app = Celery('oj')
|
app = Celery("oj")
|
||||||
|
|
||||||
# Using a string here means the worker will not have to
|
# Using a string here means the worker will not have to
|
||||||
# pickle the object when using Windows.
|
# pickle the object when using Windows.
|
||||||
app.config_from_object('django.conf:settings')
|
app.config_from_object("django.conf:settings")
|
||||||
|
|
||||||
# load task modules from all registered Django app configs.
|
# load task modules from all registered Django app configs.
|
||||||
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
|
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
|
||||||
|
@ -64,11 +64,11 @@ class AbstractProblem(models.Model):
|
|||||||
|
|
||||||
def add_submission_number(self):
|
def add_submission_number(self):
|
||||||
self.total_submit_number = models.F("total_submit_number") + 1
|
self.total_submit_number = models.F("total_submit_number") + 1
|
||||||
self.save(update_fields=['total_submit_number'])
|
self.save(update_fields=["total_submit_number"])
|
||||||
|
|
||||||
def add_ac_number(self):
|
def add_ac_number(self):
|
||||||
self.total_accepted_number = models.F("total_accepted_number") + 1
|
self.total_accepted_number = models.F("total_accepted_number") + 1
|
||||||
self.save(update_fields=['total_accepted_number'])
|
self.save(update_fields=["total_accepted_number"])
|
||||||
|
|
||||||
|
|
||||||
class Problem(AbstractProblem):
|
class Problem(AbstractProblem):
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
django==1.9.6
|
|
||||||
django-redis
|
|
||||||
djangorestframework==3.4.0
|
|
||||||
otpauth
|
|
||||||
pillow
|
|
||||||
python-dateutil
|
|
||||||
celery
|
|
||||||
Envelopes
|
|
||||||
pytz
|
|
||||||
jsonfield
|
|
||||||
qrcode
|
|
||||||
requests
|
|
@ -30,13 +30,13 @@ class SubmissionAPI(APIView):
|
|||||||
|
|
||||||
data = request.data
|
data = request.data
|
||||||
try:
|
try:
|
||||||
problem = Problem.objects.get(id=data['problem_id'])
|
problem = Problem.objects.get(id=data["problem_id"])
|
||||||
except Problem.DoesNotExist:
|
except Problem.DoesNotExist:
|
||||||
return self.error("Problem not exist")
|
return self.error("Problem not exist")
|
||||||
# TODO: user_id
|
# TODO: user_id
|
||||||
submission = Submission.objects.create(user_id=1,
|
submission = Submission.objects.create(user_id=1,
|
||||||
language=data['language'],
|
language=data["language"],
|
||||||
code=data['code'],
|
code=data["code"],
|
||||||
problem_id=problem.id)
|
problem_id=problem.id)
|
||||||
judge_task.delay(submission.id, problem.id)
|
judge_task.delay(submission.id, problem.id)
|
||||||
# JudgeDispatcher(submission.id, problem.id).judge()
|
# JudgeDispatcher(submission.id, problem.id).judge()
|
||||||
|
Loading…
Reference in New Issue
Block a user