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)