mirror of
https://github.com/QingdaoU/OnlineJudge.git
synced 2025-11-04 14:49:58 +08:00
make check similar not shared task
This commit is contained in:
parent
44abd7ff6b
commit
d917b9dc7b
@ -1,65 +0,0 @@
|
||||
from celery import shared_task
|
||||
|
||||
from submission.models import Submission
|
||||
|
||||
import os
|
||||
from django.conf import settings
|
||||
from contest.models import Contest
|
||||
from problem.models import Problem
|
||||
from submission.models import JudgeStatus
|
||||
|
||||
|
||||
@shared_task(time_limit=30)
|
||||
def similar_task(contest_id):
|
||||
problems = Problem.objects.filter(contest_id=contest_id)
|
||||
owner = {}
|
||||
data_to_write = []
|
||||
|
||||
for problem in problems:
|
||||
check_dir = os.path.join(settings.TEST_CASE_DIR, str(problem.id) + "_similar_tmp")
|
||||
if not os.path.exists(check_dir):
|
||||
os.mkdir(check_dir)
|
||||
os.chmod(check_dir, 0o710)
|
||||
|
||||
submissions = Submission.objects.filter(problem_id=problem.id, result=JudgeStatus.ACCEPTED)
|
||||
for submission in submissions:
|
||||
owner[submission.id] = submission.username
|
||||
file_path = os.path.join(check_dir, submission.id)
|
||||
f = open(file_path, "w")
|
||||
f.write(submission.code)
|
||||
f.close()
|
||||
|
||||
output_dir = os.path.join(check_dir, "result")
|
||||
check_files = check_dir + "/*"
|
||||
os.system(f"/app/sim_c -p -t40 -o {output_dir} {check_files}")
|
||||
f = open(output_dir)
|
||||
for line in f:
|
||||
# xxxx consists for xx % of xxxx material
|
||||
if "consists" in line:
|
||||
splited_line = line.split()
|
||||
sub1 = splited_line[0].split("/")[-1]
|
||||
sub2 = splited_line[-2].split("/")[-1]
|
||||
if owner[sub1] == owner[sub2]:
|
||||
continue
|
||||
sim = splited_line[3]
|
||||
to_append = {
|
||||
"problem_id": problem._id,
|
||||
"submission_a": sub1,
|
||||
"user_a": owner[sub1],
|
||||
"submission_b": sub2,
|
||||
"user_b": owner[sub2],
|
||||
"similarity": sim
|
||||
}
|
||||
data_to_write.append(to_append)
|
||||
f.close()
|
||||
|
||||
os.remove(output_dir)
|
||||
for submission in submissions:
|
||||
owner[submission.id] = submission.username
|
||||
file_path = os.path.join(check_dir, submission.id)
|
||||
os.remove(file_path)
|
||||
os.rmdir(check_dir)
|
||||
|
||||
contest = Contest.objects.get(id=contest_id)
|
||||
contest.similarity_check_result = data_to_write
|
||||
contest.save()
|
||||
@ -5,9 +5,12 @@ from ipaddress import ip_network
|
||||
|
||||
import dateutil.parser
|
||||
from django.http import FileResponse
|
||||
from django.conf import settings
|
||||
|
||||
from account.decorators import check_contest_permission, ensure_created_by
|
||||
from account.models import User
|
||||
from contest.models import ContestStatus
|
||||
from problem.models import Problem
|
||||
from submission.models import Submission, JudgeStatus
|
||||
from utils.api import APIView, validate_serializer
|
||||
from utils.cache import cache
|
||||
@ -20,7 +23,6 @@ from ..serializers import (ContestAnnouncementSerializer, ContestAdminSerializer
|
||||
EditConetestSeriaizer, EditContestAnnouncementSerializer,
|
||||
ACMContesHelperSerializer, )
|
||||
from account.decorators import super_admin_required
|
||||
from contest.tasks import similar_task
|
||||
|
||||
|
||||
class ContestAPI(APIView):
|
||||
@ -247,5 +249,65 @@ class ContestCheckSimilarAPI(APIView):
|
||||
@super_admin_required
|
||||
def get(self, request):
|
||||
cid = request.GET.get("contest_id")
|
||||
similar_task.delay(cid)
|
||||
contest = Contest.objects.get(id=cid)
|
||||
if contest.status != ContestStatus.CONTEST_ENDED:
|
||||
return self.error("Contest not ended")
|
||||
problems = Problem.objects.filter(contest_id=cid)
|
||||
owner = {}
|
||||
data_to_write = []
|
||||
|
||||
for problem in problems:
|
||||
check_dir = os.path.join(settings.TEST_CASE_DIR, str(problem.id) + "_similar_tmp")
|
||||
if not os.path.exists(check_dir):
|
||||
os.mkdir(check_dir)
|
||||
os.chmod(check_dir, 0o710)
|
||||
|
||||
submissions = Submission.objects.filter(problem_id=problem.id, result=JudgeStatus.ACCEPTED)
|
||||
for submission in submissions:
|
||||
owner[submission.id] = submission.username
|
||||
file_path = os.path.join(check_dir, submission.id)
|
||||
f = open(file_path, "w")
|
||||
f.write(submission.code)
|
||||
f.close()
|
||||
|
||||
output_dir = os.path.join(check_dir, "result")
|
||||
check_files = check_dir + "/*"
|
||||
os.system(f"/app/sim_c -p -t40 -o {output_dir} {check_files}")
|
||||
f = open(output_dir)
|
||||
similar_submissions = []
|
||||
for line in f:
|
||||
# xxxx consists for xx % of xxxx material
|
||||
if "consists" in line:
|
||||
splited_line = line.split()
|
||||
sub1 = splited_line[0].split("/")[-1]
|
||||
sub2 = splited_line[-2].split("/")[-1]
|
||||
if owner[sub1] == owner[sub2]:
|
||||
continue
|
||||
similar_submissions.append(sub1)
|
||||
similar_submissions.append(sub2)
|
||||
sim = splited_line[3]
|
||||
to_append = {
|
||||
"problem_id": problem._id,
|
||||
"submission_a": sub1,
|
||||
"user_a": owner[sub1],
|
||||
"submission_b": sub2,
|
||||
"user_b": owner[sub2],
|
||||
"similarity": sim
|
||||
}
|
||||
data_to_write.append(to_append)
|
||||
f.close()
|
||||
|
||||
os.remove(output_dir)
|
||||
for submission in submissions:
|
||||
owner[submission.id] = submission.username
|
||||
file_path = os.path.join(check_dir, submission.id)
|
||||
os.remove(file_path)
|
||||
if submission.id in similar_submissions:
|
||||
submission.shared = True
|
||||
submission.save()
|
||||
os.rmdir(check_dir)
|
||||
|
||||
contest.similarity_check_result = data_to_write
|
||||
contest.save()
|
||||
|
||||
return self.success()
|
||||
|
||||
Loading…
Reference in New Issue
Block a user