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
+17 -8
View File
@@ -1,5 +1,6 @@
from datetime import datetime from datetime import datetime
from http import HTTPStatus as status from http import HTTPStatus as status
from statistics import median
from uuid import UUID from uuid import UUID
from django.http import HttpRequest from django.http import HttpRequest
@@ -84,15 +85,22 @@ def evaluate_submission(
review.evaluation = evaluation review.evaluation = evaluation
review.state = ReviewStatusChoices.CHECKED.value review.state = ReviewStatusChoices.CHECKED.value
review.submission.checked_at = datetime.now() review.submission.checked_at = datetime.now()
points = 0
for criterea in evaluation:
points += criterea["mark"]
review.submission.earned_points = (
points # TODO: оценка не от последнего проверяющего а средняя по всем
)
review.save() 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( all_checked = not submission.reviews.exclude(
state=ReviewStatusChoices.CHECKED state=ReviewStatusChoices.CHECKED
).exists() ).exists()
@@ -100,5 +108,6 @@ def evaluate_submission(
review.submission.status = ( review.submission.status = (
CompetitionTaskSubmission.StatusChoices.CHECKED.value CompetitionTaskSubmission.StatusChoices.CHECKED.value
) )
review.submission.save() review.submission.save()
return status.OK, review.submission return status.OK, review.submission
+9 -9
View File
@@ -57,6 +57,7 @@ class CompetitionTask(BaseModel):
verbose_name="ревьюверы", verbose_name="ревьюверы",
help_text="Справа отображаются действующие проверяющие, слева - доступные для выбора. Для перемещения можно кликнуть 2 раза по проверяющему" help_text="Справа отображаются действующие проверяющие, слева - доступные для выбора. Для перемещения можно кликнуть 2 раза по проверяющему"
) )
submission_reviewers_count = models.PositiveSmallIntegerField(default=1, null=True, blank=True)
def __str__(self): def __str__(self):
return self.title return self.title
@@ -152,8 +153,8 @@ class CompetitionTaskSubmission(BaseModel):
if not self.task.reviewers.exists(): if not self.task.reviewers.exists():
return return
reviewer = ( reviewers_count = self.task.submission_reviewers_count
self.task.reviewers.annotate( reviewers = self.task.reviewers.annotate(
pending_count=Count( pending_count=Count(
"review", "review",
filter=Q( 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,
)