Skip to content

Commit dc72360

Browse files
committed
judge in dramatiq
1 parent 25a825d commit dc72360

File tree

3 files changed

+58
-36
lines changed

3 files changed

+58
-36
lines changed

judge/tasks.py

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import dramatiq
22

3-
from account.models import User
3+
from account.models import User, UserProfile
44
from submission.models import Submission
5+
from problem.models import Problem
56
from utils.shortcuts import DRAMATIQ_WORKER_ARGS
67

78
from .dispatcher import JudgeDispatcher
@@ -17,8 +18,34 @@ def judge_task(submission_id, problem_id):
1718

1819

1920
@dramatiq.actor(**DRAMATIQ_WORKER_ARGS())
20-
def local_judge_task(submission_id, problem_id):
21-
uid = Submission.objects.get(id=submission_id).user_id
22-
if User.objects.get(id=uid).is_disabled:
23-
return
24-
SubmissionTester(submission_id, problem_id).judge()
21+
def local_judge_task(submission_id, problem_id, user_id):
22+
submission = Submission.objects.get(id=submission_id)
23+
24+
problem = Problem.objects.get(_id=problem_id)
25+
problem.submission_number += 1
26+
try:
27+
if SubmissionTester(submission).judge():
28+
problem.accepted_number += 1
29+
except Exception as e:
30+
raise
31+
problem.save()
32+
33+
score = submission.grade
34+
user = User.objects.get(id=user_id)
35+
assert user
36+
profile = UserProfile.objects.get(user=user)
37+
assert profile
38+
profile.total_submissions += 1
39+
if problem._id not in profile.problems_status:
40+
profile.problems_status[problem._id] = score
41+
profile.total_score += score
42+
if score == 100:
43+
profile.accepted_number += 1
44+
else:
45+
prev_score = profile.problems_status[problem._id]
46+
if score > prev_score:
47+
profile.problems_status[problem._id] = score
48+
profile.total_score += (score - prev_score)
49+
if score == 100:
50+
profile.accepted_number += 1
51+
profile.save()

run.sh

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ clean() {
1111
rm -rf ./data/submissions
1212
find . -type d -name 'migrations' -not -path './venv/*' | xargs rm -r;
1313
rm onl.db
14+
docker rm -f oj-redis-dev
1415
}
1516

1617
if [[ $cmd == "make" || $cmd == "makemigrations" ]]; then
@@ -29,4 +30,24 @@ elif [[ $cmd == "rebuild" ]]; then
2930
done
3031
python3 manage.py migrate
3132
python manage.py inituser --username=root --password=rootroot --action=create_super_admin
33+
elif [[ $cmd == "run" ]]; then
34+
# run dramatiq
35+
pgrep dramatiq > /dev/null
36+
37+
if [[ $? -ne 0 ]]; then
38+
echo "running dramatiq ..."
39+
python3 manage.py rundramatiq &>data/log/dramatiq.log &
40+
else
41+
echo "dramatiq is already running ..."
42+
fi
43+
docker container ls > /dev/null
44+
45+
if [[ $? -ne 0 ]]; then
46+
echo "running redis in docker ..."
47+
docker run -it -d -p 6380:6379 --name oj-redis-dev redis:4.0-alpine
48+
else
49+
echo "redis is already running"
50+
fi
51+
52+
python3 manage.py runserver 0.0.0.0:7890
3253
fi

submission/views/user.py

Lines changed: 4 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -115,42 +115,16 @@ def post(self, request):
115115
contest=contest,
116116
problem=problem,
117117
username=request.user.username,
118-
result=JudgeStatus.PENDING,
118+
result=JudgeStatus.JUDGING,
119119
language=data["language"],
120120
code_list=data["code_list"],
121121
ip=request.session["ip"],
122122
)
123123

124-
# execute judge task in dramatiq
125-
# local_judge_task.send(submission.id, problem._id)
124+
submission.save()
126125

127-
problem.submission_number += 1
128-
try:
129-
if SubmissionTester(submission).judge():
130-
problem.accepted_number += 1
131-
except Exception as e:
132-
self.error(str(e))
133-
problem.save()
134-
135-
score = submission.grade
136-
user = User.objects.get(id=request.user.id)
137-
assert user
138-
profile = UserProfile.objects.get(user=user)
139-
assert profile
140-
profile.total_submissions += 1
141-
if problem._id not in profile.problems_status:
142-
profile.problems_status[problem._id] = score
143-
profile.total_score += score
144-
if score == 100:
145-
profile.accepted_number += 1
146-
else:
147-
prev_score = profile.problems_status[problem._id]
148-
if score > prev_score:
149-
profile.problems_status[problem._id] = score
150-
profile.total_score += (score - prev_score)
151-
if score == 100:
152-
profile.accepted_number += 1
153-
profile.save()
126+
# execute judge task in dramatiq
127+
local_judge_task.send(submission.id, problem._id, str(request.user.id))
154128

155129
return self.success(SubmissionModelSerializer(submission).data)
156130

0 commit comments

Comments
 (0)