From deae73cd88b56baf7be91360a4f62fb5406c8646 Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Fri, 3 Jul 2026 19:29:51 -0600 Subject: [PATCH] =?UTF-8?q?feat:=20SQL=20=E9=A2=98=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=82=B9=E8=84=9A=E6=9C=AC=E5=9B=9E=E6=98=BE=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/urls/admin.py | 2 ++ problem/views/admin.py | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/problem/urls/admin.py b/problem/urls/admin.py index 613baac..fecf9a3 100644 --- a/problem/urls/admin.py +++ b/problem/urls/admin.py @@ -8,6 +8,7 @@ from ..views.admin import ( ProblemFlowchartAIGen, ProblemVisibleAPI, SQLTestCasePreviewAPI, + SQLTestCaseScriptsAPI, StuckProblemsAPI, TestCaseAPI, TopACTrendAPI, @@ -16,6 +17,7 @@ from ..views.admin import ( urlpatterns = [ path("test_case", TestCaseAPI.as_view()), path("sql_test_case_preview", SQLTestCasePreviewAPI.as_view()), + path("sql_test_case_scripts", SQLTestCaseScriptsAPI.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 3abab3f..977a06c 100644 --- a/problem/views/admin.py +++ b/problem/views/admin.py @@ -690,3 +690,38 @@ class SQLTestCasePreviewAPI(APIView): except SQLCaseError as e: return self.error(e.message) return self.success(display) + + +class SQLTestCaseScriptsAPI(APIView, TestCaseZipProcessor): + @problem_permission_required + def get(self, request): + problem_id = request.GET.get("problem_id") + if not problem_id: + return self.error("Parameter error, problem_id is required") + try: + problem = Problem.objects.get(id=problem_id) + except Problem.DoesNotExist: + return self.error("Problem does not exists") + + if problem.contest: + ensure_created_by(problem.contest, request.user) + else: + ensure_created_by(problem, request.user) + + test_case_dir = os.path.join(settings.TEST_CASE_DIR, problem.test_case_id) + try: + with open(os.path.join(test_case_dir, "info"), encoding="utf-8") as f: + info = json.load(f) + except (OSError, json.JSONDecodeError): + return self.error("测试点信息读取失败") + if not info.get("sql"): + return self.error("该题的测试点不是 SQL 类型") + + scripts = [] + for name in self.filter_sql_name_list(os.listdir(test_case_dir)): + try: + with open(os.path.join(test_case_dir, name), encoding="utf-8") as f: + scripts.append({"name": name, "content": f.read()}) + except OSError: + return self.error(f"测试点脚本 {name} 读取失败") + return self.success(scripts)