后端增加题目 io mode 相关逻辑

This commit is contained in:
virusdefender 2019-03-12 16:10:21 +08:00
parent 1adfd35615
commit d969c6fe5e
3 changed files with 48 additions and 1 deletions

View File

@ -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),
),
]

View File

@ -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)

View File

@ -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)