This commit is contained in:
2025-06-15 23:02:47 +08:00
parent ac3c7c4dec
commit 30becb56bc

View File

@@ -6,7 +6,7 @@ from ninja.pagination import paginate
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from account.decorators import admin_required
from .schemas import ( from .schemas import (
SubmissionFilter, SubmissionFilter,
SubmissionIn, SubmissionIn,
@@ -46,22 +46,26 @@ def list_submissions(request, filters: SubmissionFilter = Query(...)):
""" """
获取提交列表,支持按任务和用户过滤 获取提交列表,支持按任务和用户过滤
""" """
submissions = Submission.objects.all() submissions = Submission.objects.select_related("task", "user")
if filters.task_id: if filters.task_id:
task = get_object_or_404(Task, id=filters.task_id) task = get_object_or_404(Task, id=filters.task_id)
submissions = submissions.select_related("task").filter(task=task) submissions = submissions.filter(task=task)
if filters.task_type: elif filters.task_type:
tasks = Task.objects.filter(task_type=filters.task_type) submissions = submissions.filter(task__task_type=filters.task_type)
submissions = submissions.select_related("task").filter(task__in=tasks)
if filters.username: if filters.username:
users = User.objects.filter(username__icontains=filters.username) submissions = submissions.filter(user__username__icontains=filters.username)
submissions = submissions.select_related("user").filter(user__in=users)
ratings = Rating.objects.select_related("user", "submission").filter( submissions = submissions.prefetch_related("ratings").filter(
user=request.user, submission__in=submissions ratings__user=request.user
) )
rating_dict = {rating.submission_id: rating.score for rating in ratings}
rating_dict = {
submission.id: submission.ratings.first().score
for submission in submissions
if submission.ratings.exists()
}
return [SubmissionOut.list(submission, rating_dict) for submission in submissions] return [SubmissionOut.list(submission, rating_dict) for submission in submissions]