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)