精简 Problem 模型:移除 rule_type / total_score / io_mode
系统只用 ACM 模式且题目固定标准 IO,这三列已无实际用途: - rule_type / total_score:OI 专用,删除后 judge/dispatcher 的 OI 分支全部塌缩为 ACM - io_mode:判题改为固定发送 Standard IO 常量;languages.py 的 seccomp_rule 保留 dict 形态但改用字面量 key,不改判题机 wire 契约 - prompt 字段保留(预留给未来 AI 分析) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
# Generated by Django 5.2.3 on 2025-06-14 08:51
|
||||
|
||||
import django.db.models.deletion
|
||||
import problem.models
|
||||
import utils.models
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
@@ -47,7 +46,7 @@ class Migration(migrations.Migration):
|
||||
('last_update_time', models.DateTimeField(auto_now=True, null=True)),
|
||||
('time_limit', models.IntegerField()),
|
||||
('memory_limit', models.IntegerField()),
|
||||
('io_mode', models.JSONField(default=problem.models._default_io_mode)),
|
||||
('io_mode', models.JSONField(default=dict)),
|
||||
('spj', models.BooleanField(default=False)),
|
||||
('spj_language', models.TextField(null=True)),
|
||||
('spj_code', models.TextField(null=True)),
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
# Generated by Django 6.0.4 on 2026-07-04 17:27
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('problem', '0012_problem_sql_display'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveField(
|
||||
model_name='problem',
|
||||
name='io_mode',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='problem',
|
||||
name='rule_type',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='problem',
|
||||
name='total_score',
|
||||
),
|
||||
]
|
||||
@@ -13,24 +13,6 @@ class ProblemTag(models.Model):
|
||||
db_table = "problem_tag"
|
||||
|
||||
|
||||
class ProblemRuleType(models.TextChoices):
|
||||
ACM = "ACM", "ACM"
|
||||
OI = "OI", "OI"
|
||||
|
||||
|
||||
class ProblemIOMode(models.TextChoices):
|
||||
STANDARD = "Standard IO", "Standard IO"
|
||||
FILE = "File IO", "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)
|
||||
@@ -58,18 +40,14 @@ class Problem(models.Model):
|
||||
time_limit = models.IntegerField()
|
||||
# MB
|
||||
memory_limit = models.IntegerField()
|
||||
# io mode
|
||||
io_mode = models.JSONField(default=_default_io_mode)
|
||||
rule_type = models.TextField(choices=ProblemRuleType.choices)
|
||||
visible = models.BooleanField(default=True, db_default=True)
|
||||
difficulty = models.TextField(choices=Difficulty.choices)
|
||||
tags = models.ManyToManyField(ProblemTag)
|
||||
source = models.TextField(null=True)
|
||||
# 预留:题目考察知识点,供未来 AI 分析使用(当前未接线)
|
||||
prompt = models.TextField(null=True)
|
||||
# [{language: "python", code: "..."}]
|
||||
answers = models.JSONField(null=True)
|
||||
# for OI mode
|
||||
total_score = models.IntegerField(default=0, db_default=0)
|
||||
submission_number = models.BigIntegerField(default=0, db_default=0)
|
||||
accepted_number = models.BigIntegerField(default=0, db_default=0)
|
||||
# {JudgeStatus.ACCEPTED: 3, JudgeStatus.WRONG_ANSWER: 11}, the number means count
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
import re
|
||||
|
||||
from django import forms
|
||||
|
||||
from utils.api import UsernameSerializer, serializers
|
||||
@@ -9,7 +7,7 @@ from utils.serializers import (
|
||||
LanguageNameMultiChoiceField,
|
||||
)
|
||||
|
||||
from .models import Problem, ProblemIOMode, ProblemRuleType, ProblemTag
|
||||
from .models import Problem, ProblemTag
|
||||
from .utils import parse_problem_template
|
||||
|
||||
|
||||
@@ -48,20 +46,6 @@ class SQLTestCasePreviewSerializer(serializers.Serializer):
|
||||
mode = serializers.ChoiceField(choices=["query", "modify"])
|
||||
|
||||
|
||||
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)
|
||||
@@ -75,8 +59,6 @@ class CreateOrEditProblemSerializer(serializers.Serializer):
|
||||
memory_limit = serializers.IntegerField(min_value=1, max_value=1024)
|
||||
languages = LanguageNameMultiChoiceField()
|
||||
template = serializers.DictField(child=serializers.CharField(min_length=1))
|
||||
rule_type = serializers.ChoiceField(choices=ProblemRuleType.choices)
|
||||
io_mode = ProblemIOModeSerializer()
|
||||
visible = serializers.BooleanField()
|
||||
difficulty = serializers.ChoiceField(choices=Difficulty.choices)
|
||||
tags = serializers.ListField(child=serializers.CharField(max_length=32), allow_empty=False)
|
||||
|
||||
@@ -19,7 +19,7 @@ from utils.api import APIError, APIView, CSRFExemptAPIView, validate_serializer
|
||||
from utils.openai import get_ai_client
|
||||
from utils.shortcuts import natural_sort_key, rand_str
|
||||
|
||||
from ..models import Problem, ProblemRuleType, ProblemTag
|
||||
from ..models import Problem, ProblemTag
|
||||
from ..serializers import (
|
||||
AddContestProblemSerializer,
|
||||
ContestProblemMakePublicSerializer,
|
||||
@@ -195,14 +195,6 @@ class TestCaseAPI(CSRFExemptAPIView, TestCaseZipProcessor):
|
||||
class ProblemBase(APIView):
|
||||
def common_checks(self, request):
|
||||
data = request.data
|
||||
if data["rule_type"] == ProblemRuleType.OI:
|
||||
total_score = 0
|
||||
for item in data["test_case_score"]:
|
||||
if item["score"] <= 0:
|
||||
return "Invalid score"
|
||||
else:
|
||||
total_score += item["score"]
|
||||
data["total_score"] = total_score
|
||||
data["languages"] = list(data["languages"])
|
||||
|
||||
# SQL 题校验:.sql 测试点与 .in/.out 沙箱判题互斥,SQL 必须是唯一语言
|
||||
|
||||
Reference in New Issue
Block a user