support fps problems import; fix qduoj problems import
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
from django import forms
|
||||
|
||||
from options.options import SysOptions
|
||||
from judge.languages import language_names, spj_language_names
|
||||
from utils.api import UsernameSerializer, serializers
|
||||
from utils.constants import Difficulty
|
||||
|
||||
from .models import Problem, ProblemRuleType, ProblemTag
|
||||
from .utils import parse_problem_template
|
||||
@@ -27,12 +29,6 @@ class CreateProblemCodeTemplateSerializer(serializers.Serializer):
|
||||
pass
|
||||
|
||||
|
||||
class Difficulty(object):
|
||||
LOW = "Low"
|
||||
MID = "Mid"
|
||||
HIGH = "High"
|
||||
|
||||
|
||||
class CreateOrEditProblemSerializer(serializers.Serializer):
|
||||
_id = serializers.CharField(max_length=32, allow_blank=True, allow_null=True)
|
||||
title = serializers.CharField(max_length=128)
|
||||
@@ -41,7 +37,7 @@ class CreateOrEditProblemSerializer(serializers.Serializer):
|
||||
output_description = serializers.CharField()
|
||||
samples = serializers.ListField(child=CreateSampleSerializer(), allow_empty=False)
|
||||
test_case_id = serializers.CharField(max_length=32)
|
||||
test_case_score = serializers.ListField(child=CreateTestCaseScoreSerializer(), allow_empty=False)
|
||||
test_case_score = serializers.ListField(child=CreateTestCaseScoreSerializer(), allow_empty=True)
|
||||
time_limit = serializers.IntegerField(min_value=1, max_value=1000 * 60)
|
||||
memory_limit = serializers.IntegerField(min_value=1, max_value=1024)
|
||||
languages = serializers.MultipleChoiceField(choices=language_names)
|
||||
@@ -52,7 +48,7 @@ class CreateOrEditProblemSerializer(serializers.Serializer):
|
||||
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])
|
||||
difficulty = serializers.ChoiceField(choices=Difficulty.choices())
|
||||
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)
|
||||
@@ -128,41 +124,42 @@ class ContestProblemMakePublicSerializer(serializers.Serializer):
|
||||
|
||||
|
||||
class ExportProblemSerializer(serializers.ModelSerializer):
|
||||
display_id = serializers.SerializerMethodField()
|
||||
description = serializers.SerializerMethodField()
|
||||
input_description = serializers.SerializerMethodField()
|
||||
output_description = serializers.SerializerMethodField()
|
||||
test_case_score = serializers.SerializerMethodField()
|
||||
hint = serializers.SerializerMethodField()
|
||||
time_limit = serializers.SerializerMethodField()
|
||||
memory_limit = serializers.SerializerMethodField()
|
||||
spj = serializers.SerializerMethodField()
|
||||
template = serializers.SerializerMethodField()
|
||||
source = serializers.SerializerMethodField()
|
||||
tags = serializers.SlugRelatedField(many=True, slug_field="name", read_only=True)
|
||||
|
||||
def get_display_id(self, obj):
|
||||
return obj._id
|
||||
|
||||
def _html_format_value(self, value):
|
||||
return {"format": "html", "value": value}
|
||||
|
||||
def get_description(self, obj):
|
||||
return {"format": "html", "value": obj.description}
|
||||
return self._html_format_value(obj.description)
|
||||
|
||||
def get_input_description(self, obj):
|
||||
return {"format": "html", "value": obj.input_description}
|
||||
return self._html_format_value(obj.input_description)
|
||||
|
||||
def get_output_description(self, obj):
|
||||
return {"format": "html", "value": obj.output_description}
|
||||
return self._html_format_value(obj.output_description)
|
||||
|
||||
def get_hint(self, obj):
|
||||
return {"format": "html", "value": obj.hint}
|
||||
return self._html_format_value(obj.hint)
|
||||
|
||||
def get_test_case_score(self, obj):
|
||||
return obj.test_case_score if obj.rule_type == ProblemRuleType.OI else []
|
||||
|
||||
def get_time_limit(self, obj):
|
||||
return {"unit": "ms", "value": obj.time_limit}
|
||||
|
||||
def get_memory_limit(self, obj):
|
||||
return {"unit": "MB", "value": obj.memory_limit}
|
||||
return [{"score": item["score"], "input_name": item["input_name"]}
|
||||
for item in obj.test_case_score] if obj.rule_type == ProblemRuleType.OI else None
|
||||
|
||||
def get_spj(self, obj):
|
||||
return {"enabled": obj.spj,
|
||||
"code": obj.spj_code if obj.spj else None,
|
||||
"language": obj.spj_language if obj.spj else None}
|
||||
return {"code": obj.spj_code,
|
||||
"language": obj.spj_language} if obj.spj else None
|
||||
|
||||
def get_template(self, obj):
|
||||
ret = {}
|
||||
@@ -170,9 +167,12 @@ class ExportProblemSerializer(serializers.ModelSerializer):
|
||||
ret[k] = parse_problem_template(v)
|
||||
return ret
|
||||
|
||||
def get_source(self, obj):
|
||||
return obj.source or f"{SysOptions.website_name} {SysOptions.website_base_url}"
|
||||
|
||||
class Meta:
|
||||
model = Problem
|
||||
fields = ("_id", "title", "description",
|
||||
fields = ("display_id", "title", "description", "tags",
|
||||
"input_description", "output_description",
|
||||
"test_case_score", "hint", "time_limit", "memory_limit", "samples",
|
||||
"template", "spj", "rule_type", "source", "template")
|
||||
@@ -182,3 +182,76 @@ class AddContestProblemSerializer(serializers.Serializer):
|
||||
contest_id = serializers.IntegerField()
|
||||
problem_id = serializers.IntegerField()
|
||||
display_id = serializers.CharField()
|
||||
|
||||
|
||||
class ExportProblemRequestSerialzier(serializers.Serializer):
|
||||
problem_id = serializers.ListField(child=serializers.IntegerField(), allow_empty=False)
|
||||
|
||||
|
||||
class UploadProblemForm(forms.Form):
|
||||
file = forms.FileField()
|
||||
|
||||
|
||||
class FormatValueSerializer(serializers.Serializer):
|
||||
format = serializers.ChoiceField(choices=["html", "markdown"])
|
||||
value = serializers.CharField(allow_blank=True)
|
||||
|
||||
|
||||
class TestCaseScoreSerializer(serializers.Serializer):
|
||||
score = serializers.IntegerField(min_value=1)
|
||||
input_name = serializers.CharField(max_length=32)
|
||||
|
||||
|
||||
class TemplateSerializer(serializers.Serializer):
|
||||
prepend = serializers.CharField()
|
||||
template = serializers.CharField()
|
||||
append = serializers.CharField()
|
||||
|
||||
|
||||
class SPJSerializer(serializers.Serializer):
|
||||
code = serializers.CharField()
|
||||
language = serializers.ChoiceField(choices=spj_language_names)
|
||||
|
||||
|
||||
class AnswerSerializer(serializers.Serializer):
|
||||
code = serializers.CharField()
|
||||
language = serializers.ChoiceField(choices=language_names)
|
||||
|
||||
|
||||
class ImportProblemSerializer(serializers.Serializer):
|
||||
display_id = serializers.CharField(max_length=128)
|
||||
title = serializers.CharField(max_length=128)
|
||||
description = FormatValueSerializer()
|
||||
input_description = FormatValueSerializer()
|
||||
output_description = FormatValueSerializer()
|
||||
hint = FormatValueSerializer()
|
||||
test_case_score = serializers.ListField(child=TestCaseScoreSerializer(), allow_null=True)
|
||||
time_limit = serializers.IntegerField(min_value=1, max_value=60000)
|
||||
memory_limit = serializers.IntegerField(min_value=1, max_value=10240)
|
||||
samples = serializers.ListField(child=CreateSampleSerializer())
|
||||
template = serializers.DictField(child=TemplateSerializer())
|
||||
spj = SPJSerializer(allow_null=True)
|
||||
rule_type = serializers.ChoiceField(choices=ProblemRuleType.choices())
|
||||
source = serializers.CharField(max_length=200, allow_blank=True, allow_null=True)
|
||||
answers = serializers.ListField(child=AnswerSerializer())
|
||||
tags = serializers.ListField(child=serializers.CharField())
|
||||
|
||||
|
||||
class FPSProblemSerializer(serializers.Serializer):
|
||||
class UnitSerializer(serializers.Serializer):
|
||||
unit = serializers.ChoiceField(choices=["MB", "s", "ms"])
|
||||
value = serializers.IntegerField(min_value=1, max_value=60000)
|
||||
|
||||
title = serializers.CharField(max_length=128)
|
||||
description = serializers.CharField()
|
||||
input = serializers.CharField()
|
||||
output = serializers.CharField()
|
||||
hint = serializers.CharField(allow_blank=True, allow_null=True)
|
||||
time_limit = UnitSerializer()
|
||||
memory_limit = UnitSerializer()
|
||||
samples = serializers.ListField(child=CreateSampleSerializer())
|
||||
source = serializers.CharField(max_length=200, allow_blank=True, allow_null=True)
|
||||
spj = SPJSerializer(allow_null=True)
|
||||
template = serializers.ListField(child=serializers.DictField(), allow_empty=True, allow_null=True)
|
||||
append = serializers.ListField(child=serializers.DictField(), allow_empty=True, allow_null=True)
|
||||
prepend = serializers.ListField(child=serializers.DictField(), allow_empty=True, allow_null=True)
|
||||
|
||||
Reference in New Issue
Block a user