mirror of
https://gitlab.com/megazordpobeda/DataRush.git
synced 2026-05-23 15:37:10 +00:00
feat: added multiple reviewers support
This commit is contained in:
@@ -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()
|
||||||
@@ -101,4 +109,5 @@ def evaluate_submission(
|
|||||||
CompetitionTaskSubmission.StatusChoices.CHECKED.value
|
CompetitionTaskSubmission.StatusChoices.CHECKED.value
|
||||||
)
|
)
|
||||||
review.submission.save()
|
review.submission.save()
|
||||||
|
|
||||||
return status.OK, review.submission
|
return status.OK, review.submission
|
||||||
|
|||||||
@@ -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] # да это медленно работает и чо
|
||||||
.order_by("pending_count")
|
|
||||||
.first()
|
for reviewer in reviewers:
|
||||||
)
|
Review.objects.create(
|
||||||
review = Review.objects.create(
|
|
||||||
reviewer=reviewer,
|
reviewer=reviewer,
|
||||||
submission=self,
|
submission=self,
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user