diff --git a/problem/serializers.py b/problem/serializers.py index 47063a3b..3038e470 100644 --- a/problem/serializers.py +++ b/problem/serializers.py @@ -33,19 +33,19 @@ class CreateOrEditProblemSerializer(serializers.Serializer): description = serializers.CharField() input_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_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) 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]) 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) visible = serializers.BooleanField() 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) source = serializers.CharField(max_length=256, allow_blank=True, allow_null=True) diff --git a/problem/views/admin.py b/problem/views/admin.py index 9e1bef00..6955d554 100644 --- a/problem/views/admin.py +++ b/problem/views/admin.py @@ -111,10 +111,6 @@ class ProblemAPI(APIView): @validate_serializer(CreateProblemSerializer) def post(self, request): 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 not data["spj_language"] or not data["spj_code"]: return self.error("Invalid spj") @@ -123,18 +119,13 @@ class ProblemAPI(APIView): data["spj_language"] = None data["spj_code"] = None 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"]: if item["score"] <= 0: return self.error("Invalid score") - # todo check filename - else: - data["test_case_score"] = [] + # todo check filename and score info data["created_by"] = request.user tags = data.pop("tags") - if not tags: - return self.error("Tags is required") + problem = Problem.objects.create(**data) for item in tags: try: @@ -162,4 +153,37 @@ class ProblemAPI(APIView): @validate_serializer(EditProblemSerializer) 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()