From d969c6fe5e9aae2ce741383e4ddd3ff88b8fe471 Mon Sep 17 00:00:00 2001 From: virusdefender Date: Tue, 12 Mar 2019 16:10:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8E=E7=AB=AF=E5=A2=9E=E5=8A=A0=E9=A2=98?= =?UTF-8?q?=E7=9B=AE=20io=20mode=20=E7=9B=B8=E5=85=B3=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problem/migrations/0013_problem_io_mode.py | 20 ++++++++++++++++++++ problem/models.py | 11 +++++++++++ problem/serializers.py | 18 +++++++++++++++++- 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 problem/migrations/0013_problem_io_mode.py diff --git a/problem/migrations/0013_problem_io_mode.py b/problem/migrations/0013_problem_io_mode.py new file mode 100644 index 00000000..17136c87 --- /dev/null +++ b/problem/migrations/0013_problem_io_mode.py @@ -0,0 +1,20 @@ +# Generated by Django 2.1.7 on 2019-03-12 07:13 + +import django.contrib.postgres.fields.jsonb +from django.db import migrations +import problem.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('problem', '0012_auto_20180501_0436'), + ] + + operations = [ + migrations.AddField( + model_name='problem', + name='io_mode', + field=django.contrib.postgres.fields.jsonb.JSONField(default=problem.models._default_io_mode), + ), + ] diff --git a/problem/models.py b/problem/models.py index 7d5b989e..7cd878da 100644 --- a/problem/models.py +++ b/problem/models.py @@ -25,6 +25,15 @@ class ProblemDifficulty(object): Low = "Low" +class ProblemIOMode(Choices): + standard = "Standard IO" + file = "File IO" + + +def _default_io_mode(): + return {"io_mode": ProblemIOMode.standard, "input": "input.txt", "output": "output.txt"} + + class Problem(models.Model): # display ID _id = models.TextField(db_index=True) @@ -52,6 +61,8 @@ class Problem(models.Model): time_limit = models.IntegerField() # MB memory_limit = models.IntegerField() + # io mode + io_mode = JSONField(default=_default_io_mode) # special judge related spj = models.BooleanField(default=False) spj_language = models.TextField(null=True) diff --git a/problem/serializers.py b/problem/serializers.py index 592c758a..975597a8 100644 --- a/problem/serializers.py +++ b/problem/serializers.py @@ -1,3 +1,5 @@ +import re + from django import forms from options.options import SysOptions @@ -5,7 +7,7 @@ from utils.api import UsernameSerializer, serializers from utils.constants import Difficulty from utils.serializers import LanguageNameMultiChoiceField, SPJLanguageNameChoiceField, LanguageNameChoiceField -from .models import Problem, ProblemRuleType, ProblemTag +from .models import Problem, ProblemRuleType, ProblemTag, ProblemIOMode from .utils import parse_problem_template @@ -29,6 +31,19 @@ class CreateProblemCodeTemplateSerializer(serializers.Serializer): pass +class ProblemIOModeSerializer(serializers.Serializer): + io_mode = serializers.ChoiceField(choices=ProblemIOMode.choices()) + input = serializers.CharField() + output = serializers.CharField() + + def validate(self, attrs): + if attrs["input"] == attrs["output"]: + raise serializers.ValidationError("Invalid io mode") + for item in (attrs["input"], attrs["output"]): + if not re.match("^[a-zA-Z0-9.]+$", item): + raise serializers.ValidationError("Invalid io file name format") + return attrs + class CreateOrEditProblemSerializer(serializers.Serializer): _id = serializers.CharField(max_length=32, allow_blank=True, allow_null=True) title = serializers.CharField(max_length=1024) @@ -43,6 +58,7 @@ class CreateOrEditProblemSerializer(serializers.Serializer): languages = LanguageNameMultiChoiceField() template = serializers.DictField(child=serializers.CharField(min_length=1)) rule_type = serializers.ChoiceField(choices=[ProblemRuleType.ACM, ProblemRuleType.OI]) + io_mode = ProblemIOModeSerializer() spj = serializers.BooleanField() spj_language = SPJLanguageNameChoiceField(allow_blank=True, allow_null=True) spj_code = serializers.CharField(allow_blank=True, allow_null=True)