feat: open teaching analytics to Teacher Admin

StuckProblems, TopACTrend, AI user analysis, and problemset user
progress are now accessible to Teacher Admin (previously super-only).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-02 18:17:26 -06:00
parent f94d29cf93
commit 385d04505b
3 changed files with 8 additions and 8 deletions

View File

@@ -234,7 +234,7 @@ class AIDetailDataAPI(APIView):
return self.error("end 格式无效,请使用 ISO 8601 格式") return self.error("end 格式无效,请使用 ISO 8601 格式")
user = request.user user = request.user
if username and request.user.is_super_admin(): if username and request.user.is_teacher_or_above():
try: try:
user = User.objects.get(username=username) user = User.objects.get(username=username)
except User.DoesNotExist: except User.DoesNotExist:
@@ -444,7 +444,7 @@ class AIDurationDataAPI(APIView):
username = request.GET.get("username") username = request.GET.get("username")
user = request.user user = request.user
if username and request.user.is_super_admin(): if username and request.user.is_teacher_or_above():
try: try:
user = User.objects.get(username=username) user = User.objects.get(username=username)
except User.DoesNotExist: except User.DoesNotExist:
@@ -856,7 +856,7 @@ class AIHeatmapDataAPI(APIView):
def get(self, request): def get(self, request):
username = request.GET.get("username") username = request.GET.get("username")
user = request.user user = request.user
if username and request.user.is_super_admin(): if username and request.user.is_teacher_or_above():
try: try:
user = User.objects.get(username=username) user = User.objects.get(username=username)
except User.DoesNotExist: except User.DoesNotExist:

View File

@@ -11,7 +11,7 @@ from django.db.models import Count, Q
from django.db.models.functions import ExtractYear from django.db.models.functions import ExtractYear
from django.http import StreamingHttpResponse from django.http import StreamingHttpResponse
from account.decorators import ensure_created_by, problem_permission_required, super_admin_required from account.decorators import ensure_created_by, problem_permission_required, teacher_admin_required
from contest.models import Contest, ContestStatus from contest.models import Contest, ContestStatus
from submission.models import Submission from submission.models import Submission
from utils.api import APIError, APIView, CSRFExemptAPIView, validate_serializer from utils.api import APIError, APIView, CSRFExemptAPIView, validate_serializer
@@ -508,7 +508,7 @@ class ProblemFlowchartAIGen(APIView):
class StuckProblemsAPI(APIView): class StuckProblemsAPI(APIView):
@super_admin_required @teacher_admin_required
def get(self, request): def get(self, request):
from submission.models import JudgeStatus from submission.models import JudgeStatus
@@ -545,7 +545,7 @@ class StuckProblemsAPI(APIView):
class TopACTrendAPI(APIView): class TopACTrendAPI(APIView):
@super_admin_required @teacher_admin_required
def get(self, request): def get(self, request):
import datetime import datetime
from collections import defaultdict from collections import defaultdict

View File

@@ -1,7 +1,7 @@
from django.db.models import Avg, Count, Prefetch, Q from django.db.models import Avg, Count, Prefetch, Q
from django.utils import timezone from django.utils import timezone
from account.decorators import admin_role_required, login_required from account.decorators import login_required, teacher_admin_required
from account.models import User from account.models import User
from problem.models import Problem from problem.models import Problem
from problemset.models import ( from problemset.models import (
@@ -300,7 +300,7 @@ class ProblemSetBadgeAPI(AsyncAPIView):
class ProblemSetUserProgressAPI(AsyncAPIView): class ProblemSetUserProgressAPI(AsyncAPIView):
"""题单用户进度列表API""" """题单用户进度列表API"""
@admin_role_required @teacher_admin_required
async def get(self, request, problem_set_id: int): async def get(self, request, problem_set_id: int):
"""获取题单的用户进度列表""" """获取题单的用户进度列表"""
try: try: