feat: added multiple reviewers support

This commit is contained in:
Андрей Сумин
2025-03-02 15:42:02 +03:00
parent dca1d1b7d9
commit bfb5f574a3
2 changed files with 26 additions and 17 deletions
+16 -7
View File
@@ -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()
@@ -101,4 +109,5 @@ def evaluate_submission(
CompetitionTaskSubmission.StatusChoices.CHECKED.value
)
review.submission.save()
return status.OK, review.submission
+7 -7
View File
@@ -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")
.first()
)
review = Review.objects.create(
).order_by("pending_count")[:reviewers_count] # да это медленно работает и чо
for reviewer in reviewers:
Review.objects.create(
reviewer=reviewer,
submission=self,
)