用户名不区分大小写;
修复更新problem时的一些问题
This commit is contained in:
@@ -12,7 +12,7 @@ from utils.shortcuts import rand_str
|
||||
|
||||
from ..models import Problem, ProblemRuleType, ProblemTag
|
||||
from ..serializers import (CreateContestProblemSerializer, ContestProblemAdminSerializer,
|
||||
CreateProblemSerializer, EditProblemSerializer,
|
||||
CreateProblemSerializer, EditProblemSerializer, EditContestProblemSerializer,
|
||||
ProblemAdminSerializer, TestCaseUploadForm)
|
||||
|
||||
|
||||
@@ -109,26 +109,14 @@ class TestCaseUploadAPI(CSRFExemptAPIView):
|
||||
return self.success({"id": test_case_id, "info": ret, "hint": hint, "spj": spj})
|
||||
|
||||
|
||||
class ProblemAPI(APIView):
|
||||
@validate_serializer(CreateProblemSerializer)
|
||||
@problem_permission_required
|
||||
def post(self, request):
|
||||
class ProblemBase(APIView):
|
||||
def common_checks(self, request):
|
||||
data = request.data
|
||||
|
||||
_id = data["_id"]
|
||||
if _id:
|
||||
try:
|
||||
Problem.objects.get(_id=_id)
|
||||
return self.error("Display ID already exists")
|
||||
except Problem.DoesNotExist:
|
||||
pass
|
||||
else:
|
||||
data["_id"] = rand_str(8)
|
||||
|
||||
if data["spj"]:
|
||||
if not data["spj_language"] or not data["spj_code"]:
|
||||
return self.error("Invalid spj")
|
||||
data["spj_version"] = hashlib.md5((data["spj_language"] + ":" + data["spj_code"]).encode("utf-8")).hexdigest()
|
||||
return "Invalid spj"
|
||||
data["spj_version"] = hashlib.md5(
|
||||
(data["spj_language"] + ":" + data["spj_code"]).encode("utf-8")).hexdigest()
|
||||
else:
|
||||
data["spj_language"] = None
|
||||
data["spj_code"] = None
|
||||
@@ -136,21 +124,33 @@ class ProblemAPI(APIView):
|
||||
total_score = 0
|
||||
for item in data["test_case_score"]:
|
||||
if item["score"] <= 0:
|
||||
return self.error("Invalid score")
|
||||
return "Invalid score"
|
||||
else:
|
||||
total_score += item["score"]
|
||||
data["total_score"] = total_score
|
||||
# todo check filename and score info
|
||||
data["created_by"] = request.user
|
||||
tags = data.pop("tags")
|
||||
|
||||
data["languages"] = list(data["languages"])
|
||||
|
||||
problem = Problem.objects.create(**data)
|
||||
|
||||
class ProblemAPI(ProblemBase):
|
||||
@validate_serializer(CreateProblemSerializer)
|
||||
@problem_permission_required
|
||||
def post(self, request):
|
||||
data = request.data
|
||||
|
||||
_id = data["_id"]
|
||||
if not _id:
|
||||
problem._id = str(problem.id)
|
||||
problem.save()
|
||||
return self.error("Display ID is required")
|
||||
if Problem.objects.filter(_id=_id, contest_id__isnull=True).exists():
|
||||
return self.error("Display ID already exists")
|
||||
|
||||
error_info = self.common_checks(request)
|
||||
if error_info:
|
||||
return self.error(error_info)
|
||||
|
||||
# todo check filename and score info
|
||||
tags = data.pop("tags")
|
||||
problem = Problem.objects.create(**data)
|
||||
|
||||
for item in tags:
|
||||
try:
|
||||
@@ -196,31 +196,14 @@ class ProblemAPI(APIView):
|
||||
return self.error("Problem does not exist")
|
||||
|
||||
_id = data["_id"]
|
||||
if _id:
|
||||
try:
|
||||
Problem.objects.exclude(id=problem_id).get(_id=_id)
|
||||
return self.error("Display ID already exists")
|
||||
except Problem.DoesNotExist:
|
||||
pass
|
||||
else:
|
||||
data["_id"] = str(problem_id)
|
||||
if not _id:
|
||||
return self.error("Display ID is required")
|
||||
if Problem.objects.exclude(id=problem_id).filter(_id=_id, contest_id__isnull=True).exists():
|
||||
return self.error("Display ID already exists")
|
||||
|
||||
if data["spj"]:
|
||||
if not data["spj_language"] or not data["spj_code"]:
|
||||
return self.error("Invalid spj")
|
||||
data["spj_version"] = hashlib.md5((data["spj_language"] + ":" + data["spj_code"]).encode("utf-8")).hexdigest()
|
||||
else:
|
||||
data["spj_language"] = None
|
||||
data["spj_code"] = None
|
||||
|
||||
if data["rule_type"] == ProblemRuleType.OI:
|
||||
total_score = 0
|
||||
for item in data["test_case_score"]:
|
||||
if item["score"] <= 0:
|
||||
return self.error("Invalid score")
|
||||
else:
|
||||
total_score += item["score"]
|
||||
data["total_score"] = total_score
|
||||
error_info = self.common_checks(request)
|
||||
if error_info:
|
||||
return self.error(error_info)
|
||||
# todo check filename and score info
|
||||
tags = data.pop("tags")
|
||||
data["languages"] = list(data["languages"])
|
||||
@@ -240,11 +223,11 @@ class ProblemAPI(APIView):
|
||||
return self.success()
|
||||
|
||||
|
||||
class ContestProblemAPI(APIView):
|
||||
class ContestProblemAPI(ProblemBase):
|
||||
@validate_serializer(CreateContestProblemSerializer)
|
||||
@problem_permission_required
|
||||
def post(self, request):
|
||||
data = request.data
|
||||
|
||||
try:
|
||||
contest = Contest.objects.get(id=data.pop("contest_id"))
|
||||
if request.user.is_admin() and contest.created_by != request.user:
|
||||
@@ -257,30 +240,18 @@ class ContestProblemAPI(APIView):
|
||||
|
||||
_id = data["_id"]
|
||||
if not _id:
|
||||
return self.error("Display id is required for contest problem")
|
||||
return self.error("Display ID is required")
|
||||
|
||||
if Problem.objects.filter(_id=_id, contest=contest).exists():
|
||||
return self.error("Duplicate Display id")
|
||||
|
||||
if data["spj"]:
|
||||
if not data["spj_language"] or not data["spj_code"]:
|
||||
return self.error("Invalid spj")
|
||||
data["spj_version"] = hashlib.md5((data["spj_language"] + ":" + data["spj_code"]).encode("utf-8")).hexdigest()
|
||||
else:
|
||||
data["spj_language"] = None
|
||||
data["spj_code"] = None
|
||||
error_info = self.common_checks(request)
|
||||
if error_info:
|
||||
return self.error(error_info)
|
||||
|
||||
if data["rule_type"] == ProblemRuleType.OI:
|
||||
for item in data["test_case_score"]:
|
||||
if item["score"] <= 0:
|
||||
return self.error("Invalid score")
|
||||
# todo check filename and score info
|
||||
|
||||
data["created_by"] = request.user
|
||||
data["contest"] = contest
|
||||
tags = data.pop("tags")
|
||||
data["languages"] = list(data["languages"])
|
||||
|
||||
problem = Problem.objects.create(**data)
|
||||
|
||||
for item in tags:
|
||||
@@ -291,6 +262,7 @@ class ContestProblemAPI(APIView):
|
||||
problem.tags.add(tag)
|
||||
return self.success(ContestProblemAdminSerializer(problem).data)
|
||||
|
||||
@problem_permission_required
|
||||
def get(self, request):
|
||||
problem_id = request.GET.get("id")
|
||||
contest_id = request.GET.get("contest_id")
|
||||
@@ -314,3 +286,53 @@ class ContestProblemAPI(APIView):
|
||||
if keyword:
|
||||
problems = problems.filter(title__contains=keyword)
|
||||
return self.success(self.paginate_data(request, problems, ContestProblemAdminSerializer))
|
||||
|
||||
@validate_serializer(EditContestProblemSerializer)
|
||||
@problem_permission_required
|
||||
def put(self, request):
|
||||
data = request.data
|
||||
try:
|
||||
contest = Contest.objects.get(id=data.pop("contest_id"))
|
||||
if request.user.is_admin() and contest.created_by != request.user:
|
||||
return self.error("Contest does not exist")
|
||||
except Contest.DoesNotExist:
|
||||
return self.error("Contest does not exist")
|
||||
|
||||
if data["rule_type"] != contest.rule_type:
|
||||
return self.error("Invalid rule type")
|
||||
|
||||
problem_id = data.pop("id")
|
||||
user = request.user
|
||||
|
||||
try:
|
||||
problem = Problem.objects.get(id=problem_id, contest=contest)
|
||||
if not user.can_mgmt_all_problem() and problem.created_by != user:
|
||||
return self.error("Problem does not exist")
|
||||
except Problem.DoesNotExist:
|
||||
return self.error("Problem does not exist")
|
||||
|
||||
_id = data["_id"]
|
||||
if not _id:
|
||||
return self.error("Display ID is required")
|
||||
if Problem.objects.exclude(id=problem_id).filter(_id=_id, contest=contest).exists():
|
||||
return self.error("Display ID already exists")
|
||||
|
||||
error_info = self.common_checks(request)
|
||||
if error_info:
|
||||
return self.error(error_info)
|
||||
# todo check filename and score info
|
||||
tags = data.pop("tags")
|
||||
data["languages"] = list(data["languages"])
|
||||
|
||||
for k, v in data.items():
|
||||
setattr(problem, k, v)
|
||||
problem.save()
|
||||
|
||||
problem.tags.remove(*problem.tags.all())
|
||||
for tag in tags:
|
||||
try:
|
||||
tag = ProblemTag.objects.get(name=tag)
|
||||
except ProblemTag.DoesNotExist:
|
||||
tag = ProblemTag.objects.create(name=tag)
|
||||
problem.tags.add(tag)
|
||||
return self.success()
|
||||
|
||||
Reference in New Issue
Block a user