From 803d6ca58db2d3f5cd09885fbce69b48004d3854 Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Fri, 3 Jul 2026 19:25:47 -0600 Subject: [PATCH] =?UTF-8?q?feat:=20SQL=20=E9=A2=98=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=82=B9=E9=A2=84=E8=A7=88=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- problem/serializers.py | 6 ++++++ problem/urls/admin.py | 2 ++ problem/views/admin.py | 14 ++++++++++++++ 3 files changed, 22 insertions(+) diff --git a/problem/serializers.py b/problem/serializers.py index 51e4682..ee98f9c 100644 --- a/problem/serializers.py +++ b/problem/serializers.py @@ -42,6 +42,12 @@ class SQLConfigSerializer(serializers.Serializer): order_sensitive = serializers.BooleanField(default=False) +class SQLTestCasePreviewSerializer(serializers.Serializer): + init_sql = serializers.CharField(trim_whitespace=False) + ref_sql = serializers.CharField(trim_whitespace=False) + mode = serializers.ChoiceField(choices=["query", "modify"]) + + class ProblemIOModeSerializer(serializers.Serializer): io_mode = serializers.ChoiceField(choices=ProblemIOMode.choices) input = serializers.CharField() diff --git a/problem/urls/admin.py b/problem/urls/admin.py index 1941a1c..613baac 100644 --- a/problem/urls/admin.py +++ b/problem/urls/admin.py @@ -7,6 +7,7 @@ from ..views.admin import ( ProblemAPI, ProblemFlowchartAIGen, ProblemVisibleAPI, + SQLTestCasePreviewAPI, StuckProblemsAPI, TestCaseAPI, TopACTrendAPI, @@ -14,6 +15,7 @@ from ..views.admin import ( urlpatterns = [ path("test_case", TestCaseAPI.as_view()), + path("sql_test_case_preview", SQLTestCasePreviewAPI.as_view()), path("problem", ProblemAPI.as_view()), path("problem/visible", ProblemVisibleAPI.as_view()), path("problem/stuck", StuckProblemsAPI.as_view()), diff --git a/problem/views/admin.py b/problem/views/admin.py index 09e72b0..3abab3f 100644 --- a/problem/views/admin.py +++ b/problem/views/admin.py @@ -13,6 +13,7 @@ from django.http import StreamingHttpResponse from account.decorators import ensure_created_by, problem_permission_required, teacher_admin_required from contest.models import Contest, ContestStatus +from judge.sql_runner import SQLCaseError, build_display from submission.models import Submission from utils.api import APIError, APIView, CSRFExemptAPIView, validate_serializer from utils.openai import get_ai_client @@ -28,6 +29,7 @@ from ..serializers import ( EditProblemSerializer, ProblemAdminListSerializer, ProblemAdminSerializer, + SQLTestCasePreviewSerializer, TestCaseUploadForm, ) from ..utils import generate_sql_display @@ -676,3 +678,15 @@ class TopACTrendAPI(APIView): ) return self.success(result) + + +class SQLTestCasePreviewAPI(APIView): + @validate_serializer(SQLTestCasePreviewSerializer) + @problem_permission_required + def post(self, request): + data = request.data + try: + display = build_display(data["init_sql"], data["ref_sql"], data["mode"]) + except SQLCaseError as e: + return self.error(e.message) + return self.success(display)