add generate user api
This commit is contained in:
@@ -49,6 +49,7 @@ class CreateOrEditProblemSerializer(serializers.Serializer):
|
||||
spj = serializers.BooleanField()
|
||||
spj_language = serializers.ChoiceField(choices=spj_language_names, allow_blank=True, allow_null=True)
|
||||
spj_code = serializers.CharField(allow_blank=True, allow_null=True)
|
||||
spj_compile_ok = serializers.BooleanField(default=False)
|
||||
visible = serializers.BooleanField()
|
||||
difficulty = serializers.ChoiceField(choices=[Difficulty.LOW, Difficulty.MID, Difficulty.HIGH])
|
||||
tags = serializers.ListField(child=serializers.CharField(max_length=32), allow_empty=False)
|
||||
@@ -80,7 +81,6 @@ class TagSerializer(serializers.ModelSerializer):
|
||||
|
||||
|
||||
class CompileSPJSerializer(serializers.Serializer):
|
||||
id = serializers.IntegerField()
|
||||
spj_language = serializers.ChoiceField(choices=spj_language_names)
|
||||
spj_code = serializers.CharField()
|
||||
|
||||
@@ -131,5 +131,3 @@ class ContestProblemSafeSerializer(BaseProblemSerializer):
|
||||
class ContestProblemMakePublicSerializer(serializers.Serializer):
|
||||
id = serializers.IntegerField()
|
||||
display_id = serializers.CharField(max_length=32)
|
||||
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ DEFAULT_PROBLEM_DATA = {"_id": "A-110", "title": "test", "description": "<p>test
|
||||
"output_description": "test", "time_limit": 1000, "memory_limit": 256, "difficulty": "Low",
|
||||
"visible": True, "tags": ["test"], "languages": ["C", "C++", "Java", "Python2"], "template": {},
|
||||
"samples": [{"input": "test", "output": "test"}], "spj": False, "spj_language": "C",
|
||||
"spj_code": "", "test_case_id": "499b26290cc7994e0b497212e842ea85",
|
||||
"spj_code": "", "spj_compile_ok": True, "test_case_id": "499b26290cc7994e0b497212e842ea85",
|
||||
"test_case_score": [{"output_name": "1.out", "input_name": "1.in", "output_size": 0,
|
||||
"stripped_output_md5": "d41d8cd98f00b204e9800998ecf8427e",
|
||||
"input_size": 0, "score": 0}],
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import hashlib
|
||||
import json
|
||||
import os
|
||||
import shutil
|
||||
import zipfile
|
||||
from wsgiref.util import FileWrapper
|
||||
|
||||
@@ -10,6 +11,7 @@ from django.http import StreamingHttpResponse
|
||||
from account.decorators import problem_permission_required
|
||||
from judge.dispatcher import SPJCompiler
|
||||
from contest.models import Contest
|
||||
from submission.models import Submission
|
||||
from utils.api import APIView, CSRFExemptAPIView, validate_serializer
|
||||
from utils.shortcuts import rand_str, natural_sort_key
|
||||
|
||||
@@ -140,23 +142,11 @@ class CompileSPJAPI(APIView):
|
||||
@problem_permission_required
|
||||
def post(self, request):
|
||||
data = request.data
|
||||
try:
|
||||
problem = Problem.objects.get(pk=data["id"])
|
||||
except Problem.DoesNotExist:
|
||||
return self.error("Problem does not exist")
|
||||
spj_version = rand_str(8)
|
||||
problem.spj = True
|
||||
problem.spj_version = spj_version
|
||||
problem.spj_language = data["spj_language"]
|
||||
problem.spj_code = data["spj_code"]
|
||||
error = SPJCompiler(data["spj_code"], spj_version, data["spj_language"]).compile_spj()
|
||||
if error:
|
||||
problem.spj_compile_ok = False
|
||||
problem.save()
|
||||
return self.error(error)
|
||||
else:
|
||||
problem.spj_compile_ok = True
|
||||
problem.save()
|
||||
return self.success()
|
||||
|
||||
|
||||
@@ -166,6 +156,8 @@ class ProblemBase(APIView):
|
||||
if data["spj"]:
|
||||
if not data["spj_language"] or not data["spj_code"]:
|
||||
return "Invalid spj"
|
||||
if not data["spj_compile_ok"]:
|
||||
return "SPJ code must be compiled successfully"
|
||||
data["spj_version"] = hashlib.md5(
|
||||
(data["spj_language"] + ":" + data["spj_code"]).encode("utf-8")).hexdigest()
|
||||
else:
|
||||
@@ -182,6 +174,23 @@ class ProblemBase(APIView):
|
||||
data["created_by"] = request.user
|
||||
data["languages"] = list(data["languages"])
|
||||
|
||||
@problem_permission_required
|
||||
def delete(self, request):
|
||||
id = request.GET.get("id")
|
||||
if not id:
|
||||
return self.error("Invalid parameter, id is requred")
|
||||
try:
|
||||
problem = Problem.objects.get(id=id)
|
||||
except Problem.DoesNotExist:
|
||||
return self.error("Problem does not exists")
|
||||
if Submission.objects.filter(problem=problem).exists():
|
||||
return self.error("Can't delete the problem as it has submissions")
|
||||
d = os.path.join(settings.TEST_CASE_DIR, problem.test_case_id)
|
||||
if os.path.isdir(d):
|
||||
shutil.rmtree(d, ignore_errors=True)
|
||||
problem.delete()
|
||||
return self.success()
|
||||
|
||||
|
||||
class ProblemAPI(ProblemBase):
|
||||
@validate_serializer(CreateProblemSerializer)
|
||||
|
||||
Reference in New Issue
Block a user