From 69381337755adb962c41c698de49a6e3d75e3a7a Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Thu, 11 Jun 2026 19:53:13 -0600 Subject: [PATCH] rating when ai is steaming --- submission/api.py | 33 ++++++++++++++++++++ submission/schemas.py | 31 +++++++++++++++++++ submission/tests.py | 71 ++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 134 insertions(+), 1 deletion(-) diff --git a/submission/api.py b/submission/api.py index 9dd357f..35a1a4e 100644 --- a/submission/api.py +++ b/submission/api.py @@ -20,6 +20,7 @@ from django.db.models import ( Q, Subquery, ) +from django.utils import timezone from account.decorators import admin_required from prompt.models import Conversation, Message from .classifier import classify_conversation_messages @@ -44,6 +45,7 @@ from .schemas import ( SubmissionIn, SubmissionOut, RatingScoreIn, + RandomRatingOut, TaskStatsOut, TopViewedItem, UserTag, @@ -288,6 +290,37 @@ def list_by_user_task(request, user_id: int, task_id: int): ) +@router.get("/random-for-rating/", response=Optional[RandomRatingOut]) +@login_required +def get_random_for_rating(request, exclude_id: Optional[UUID] = None): + """ + 随机返回一个待打分的其他同学的提交(用于AI生成期间的随手打分弹窗) + """ + if request.user.role == RoleChoices.NORMAL: + today_start = timezone.now().replace( + hour=0, minute=0, second=0, microsecond=0 + ) + today_end = today_start + timezone.timedelta(days=1) + rating_count = Rating.objects.filter( + user=request.user, created__range=(today_start, today_end) + ).count() + if rating_count >= 30: + return None + + candidates = ( + Submission.objects.select_related("task", "user") + .exclude(user=request.user) + .exclude(ratings__user=request.user) + ) + if exclude_id: + candidates = candidates.exclude(pk=exclude_id) + + pending = candidates.annotate(rating_count=Count("ratings")).filter( + rating_count__lt=5 + ) + return pending.order_by("?").first() or candidates.order_by("?").first() + + @router.delete("/flags") @login_required def clear_all_flags(request): diff --git a/submission/schemas.py b/submission/schemas.py index 13f60cd..dab2e87 100644 --- a/submission/schemas.py +++ b/submission/schemas.py @@ -296,3 +296,34 @@ class PromptRoundOut(Schema): html: Optional[str] = None css: Optional[str] = None js: Optional[str] = None + + +class RandomRatingOut(Schema): + submission_id: UUID + username: str + task_title: str + task_display: int + task_type: Literal["tutorial", "challenge"] + html: Optional[str] = None + css: Optional[str] = None + js: Optional[str] = None + + @staticmethod + def resolve_submission_id(obj): + return obj.id + + @staticmethod + def resolve_username(obj): + return obj.user.username + + @staticmethod + def resolve_task_title(obj): + return obj.task.title + + @staticmethod + def resolve_task_display(obj): + return obj.task.display + + @staticmethod + def resolve_task_type(obj): + return obj.task.task_type diff --git a/submission/tests.py b/submission/tests.py index 6faf14e..b09f9b7 100644 --- a/submission/tests.py +++ b/submission/tests.py @@ -10,7 +10,7 @@ from account.models import RoleChoices from prompt.models import Conversation, Message from task.models import Task -from .models import Award, Submission, SubmissionAward +from .models import Award, Rating, Submission, SubmissionAward User = get_user_model() @@ -533,3 +533,72 @@ class GradebookApiTest(TestCase): self.assertEqual(rows[1][2], "alice") self.assertEqual(rows[1][4], "4") self.assertEqual(rows[1][7], "4") + + +class RandomForRatingApiTest(TestCase): + def setUp(self): + self.viewer = _make_user("viewer") + self.author = _make_user("author") + self.task = _make_task() + + def _submission(self, user, html="