From bfb5f574a3a8a8a253d0b28224ad9d06dae2db59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9=20=D0=A1=D1=83=D0=BC?= =?UTF-8?q?=D0=B8=D0=BD?= Date: Sun, 2 Mar 2025 15:42:02 +0300 Subject: [PATCH] feat: added multiple reviewers support --- services/backend/api/v1/review/views.py | 25 +++++++++++++++++-------- services/backend/apps/task/models.py | 18 +++++++++--------- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/services/backend/api/v1/review/views.py b/services/backend/api/v1/review/views.py index 281358b..772ade8 100644 --- a/services/backend/api/v1/review/views.py +++ b/services/backend/api/v1/review/views.py @@ -1,5 +1,6 @@ from datetime import datetime from http import HTTPStatus as status +from statistics import median from uuid import UUID from django.http import HttpRequest @@ -84,15 +85,22 @@ def evaluate_submission( review.evaluation = evaluation review.state = ReviewStatusChoices.CHECKED.value review.submission.checked_at = datetime.now() - - points = 0 - for criterea in evaluation: - points += criterea["mark"] - review.submission.earned_points = ( - points # TODO: оценка не от последнего проверяющего а средняя по всем - ) review.save() + submission_evaluations = Review.objects.filter(submission=submission).values_list('evaluation', flat=True) + + marks = [] + for evaluation in submission_evaluations: + mark = 0 + for criterea in evaluation: + mark += criterea["mark"] + marks.append(mark) + earned_points = median(marks) + + review.submission.earned_points = ( + earned_points + ) + all_checked = not submission.reviews.exclude( state=ReviewStatusChoices.CHECKED ).exists() @@ -100,5 +108,6 @@ def evaluate_submission( review.submission.status = ( CompetitionTaskSubmission.StatusChoices.CHECKED.value ) - review.submission.save() + review.submission.save() + return status.OK, review.submission diff --git a/services/backend/apps/task/models.py b/services/backend/apps/task/models.py index 28cf455..8151452 100644 --- a/services/backend/apps/task/models.py +++ b/services/backend/apps/task/models.py @@ -57,6 +57,7 @@ class CompetitionTask(BaseModel): verbose_name="ревьюверы", help_text="Справа отображаются действующие проверяющие, слева - доступные для выбора. Для перемещения можно кликнуть 2 раза по проверяющему" ) + submission_reviewers_count = models.PositiveSmallIntegerField(default=1, null=True, blank=True) def __str__(self): return self.title @@ -152,8 +153,8 @@ class CompetitionTaskSubmission(BaseModel): if not self.task.reviewers.exists(): return - reviewer = ( - self.task.reviewers.annotate( + reviewers_count = self.task.submission_reviewers_count + reviewers = self.task.reviewers.annotate( pending_count=Count( "review", filter=Q( @@ -163,11 +164,10 @@ class CompetitionTaskSubmission(BaseModel): ] ), ) + ).order_by("pending_count")[:reviewers_count] # да это медленно работает и чо + + for reviewer in reviewers: + Review.objects.create( + reviewer=reviewer, + submission=self, ) - .order_by("pending_count") - .first() - ) - review = Review.objects.create( - reviewer=reviewer, - submission=self, - )