update edit problem api

This commit is contained in:
virusdefender 2017-02-04 12:23:36 +08:00
parent 42713341b3
commit f0540d5a00
2 changed files with 39 additions and 15 deletions

View File

@ -33,19 +33,19 @@ class CreateOrEditProblemSerializer(serializers.Serializer):
description = serializers.CharField() description = serializers.CharField()
input_description = serializers.CharField() input_description = serializers.CharField()
output_description = serializers.CharField() output_description = serializers.CharField()
samples = serializers.ListField(child=CreateSampleSerializer()) samples = serializers.ListField(child=CreateSampleSerializer(), allow_empty=False)
test_case_id = serializers.CharField(max_length=32) test_case_id = serializers.CharField(max_length=32)
test_case_score = serializers.ListField(child=CreateTestCaseScoreSerializer()) test_case_score = serializers.ListField(child=CreateTestCaseScoreSerializer(), allow_empty=False)
time_limit = serializers.IntegerField(min_value=1, max_value=1000 * 60) time_limit = serializers.IntegerField(min_value=1, max_value=1000 * 60)
memory_limit = serializers.IntegerField(min_value=1, max_value=1024) memory_limit = serializers.IntegerField(min_value=1, max_value=1024)
languages = serializers.ListField(child=serializers.ChoiceField(choices=language_names)) languages = serializers.ListField(child=serializers.ChoiceField(choices=language_names), allow_empty=False)
rule_type = serializers.ChoiceField(choices=[ProblemRuleType.ACM, ProblemRuleType.OI]) rule_type = serializers.ChoiceField(choices=[ProblemRuleType.ACM, ProblemRuleType.OI])
spj = serializers.BooleanField() spj = serializers.BooleanField()
spj_language = serializers.ChoiceField(choices=spj_language_names, allow_blank=True, allow_null=True) 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_code = serializers.CharField(allow_blank=True, allow_null=True)
visible = serializers.BooleanField() visible = serializers.BooleanField()
difficulty = serializers.ChoiceField(choices=[Difficulty.LOW, Difficulty.MID, Difficulty.HIGH]) difficulty = serializers.ChoiceField(choices=[Difficulty.LOW, Difficulty.MID, Difficulty.HIGH])
tags = serializers.ListField(child=serializers.CharField(max_length=32)) tags = serializers.ListField(child=serializers.CharField(max_length=32), allow_empty=False)
hint = serializers.CharField(allow_blank=True, allow_null=True) hint = serializers.CharField(allow_blank=True, allow_null=True)
source = serializers.CharField(max_length=256, allow_blank=True, allow_null=True) source = serializers.CharField(max_length=256, allow_blank=True, allow_null=True)

View File

@ -111,10 +111,6 @@ class ProblemAPI(APIView):
@validate_serializer(CreateProblemSerializer) @validate_serializer(CreateProblemSerializer)
def post(self, request): def post(self, request):
data = request.data data = request.data
if not data["languages"]:
return self.error("Invalid languages")
if not data["samples"]:
return self.error("Invalid samples")
if data["spj"]: if data["spj"]:
if not data["spj_language"] or not data["spj_code"]: if not data["spj_language"] or not data["spj_code"]:
return self.error("Invalid spj") return self.error("Invalid spj")
@ -123,18 +119,13 @@ class ProblemAPI(APIView):
data["spj_language"] = None data["spj_language"] = None
data["spj_code"] = None data["spj_code"] = None
if data["rule_type"] == ProblemRuleType.OI: if data["rule_type"] == ProblemRuleType.OI:
if not data["test_case_score"]:
return self.error("Test case score is required")
for item in data["test_case_score"]: for item in data["test_case_score"]:
if item["score"] <= 0: if item["score"] <= 0:
return self.error("Invalid score") return self.error("Invalid score")
# todo check filename # todo check filename and score info
else:
data["test_case_score"] = []
data["created_by"] = request.user data["created_by"] = request.user
tags = data.pop("tags") tags = data.pop("tags")
if not tags:
return self.error("Tags is required")
problem = Problem.objects.create(**data) problem = Problem.objects.create(**data)
for item in tags: for item in tags:
try: try:
@ -162,4 +153,37 @@ class ProblemAPI(APIView):
@validate_serializer(EditProblemSerializer) @validate_serializer(EditProblemSerializer)
def put(self, request): def put(self, request):
data = request.data
try:
problem = Problem.objects.get(id=data.pop("id"))
if request.user.is_admin_role():
problem = problem.get(created_by=request.user)
except Problem.DoesNotExist:
return self.error("Problem does not exist")
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:
for item in data["test_case_score"]:
if item["score"] <= 0:
return self.error("Invalid score")
# todo check filename and score info
tags = data.pop("tags")
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() return self.success()