feat: added appointment of reviewer to a submission

This commit is contained in:
Андрей Сумин
2025-03-02 12:08:33 +03:00
parent 511e98339a
commit 1504cf1cf5
6 changed files with 65 additions and 5 deletions
+15 -2
View File
@@ -41,7 +41,11 @@ def get_submission(
review = Review.objects.get(reviewer=reviewer, submission=submission)
if review.state == ReviewStatusChoices.NOT_CHECKED.value:
review.state = ReviewStatusChoices.CHECKING.value
review.submission.state = (
CompetitionTaskSubmission.StatusChoices.CHECKING.value
)
review.save()
review.submission.save()
return status.OK, submission
@@ -84,8 +88,17 @@ def evaluate_submission(
points = 0
for criterea in evaluation:
points += criterea["mark"]
review.submission.earned_points = points
review.submission.earned_points = (
points # TODO: оценка не от последнего проверяющего а средняя по всем
)
review.save()
all_checked = not submission.reviews.exclude(
state=ReviewStatusChoices.CHECKED
).exists()
if all_checked:
review.submission.status = (
CompetitionTaskSubmission.StatusChoices.CHECKED.value
)
review.submission.save()
return status.OK, review.submission
+1
View File
@@ -113,6 +113,7 @@ def submit_task(
status=CompetitionTaskSubmission.StatusChoices.SENT,
content=content,
)
submission.send_on_review()
if task.type == CompetitionTask.CompetitionTaskType.CHECKER:
submission = CompetitionTaskSubmission.objects.create(
user=user,
+1 -2
View File
@@ -1,7 +1,6 @@
from django.db import models
from apps.core.models import BaseModel
from apps.task.models import CompetitionTaskSubmission
class Reviewer(BaseModel):
@@ -20,7 +19,7 @@ class ReviewStatusChoices(models.TextChoices):
class Review(BaseModel):
reviewer = models.ForeignKey(Reviewer, on_delete=models.CASCADE)
submission = models.ForeignKey(
CompetitionTaskSubmission,
"task.CompetitionTaskSubmission",
on_delete=models.CASCADE,
related_name="reviews",
)
@@ -0,0 +1,19 @@
# Generated by Django 5.1.6 on 2025-03-02 08:30
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('review', '0001_initial'),
('task', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='competitiontask',
name='reviewers',
field=models.ManyToManyField(blank=True, to='review.reviewer'),
),
]
+29
View File
@@ -1,10 +1,12 @@
from uuid import uuid4
from django.db import models
from django.db.models import Count, Q
from tinymce.models import HTMLField
from apps.competition.models import Competition
from apps.core.models import BaseModel
from apps.review.models import Review, Reviewer, ReviewStatusChoices
from apps.task.validators import ContestTaskCriteriesValidator
from apps.user.models import User
@@ -56,6 +58,9 @@ class CompetitionTask(BaseModel):
verbose_name="критерии",
)
# only when "review" type
reviewers = models.ManyToManyField(Reviewer, blank=True)
def clean(self):
ContestTaskCriteriesValidator()(self)
@@ -116,3 +121,27 @@ class CompetitionTaskSubmission(BaseModel):
reviewed_at = models.DateTimeField(null=True, blank=True)
timestamp = models.DateTimeField(auto_now_add=True)
def send_on_review(self):
if not self.task.reviewers.exists():
return
reviewer = (
self.task.reviewers.annotate(
pending_count=Count(
"review",
filter=Q(
review__state__in=[
ReviewStatusChoices.NOT_CHECKED,
ReviewStatusChoices.CHECKING,
]
),
)
)
.order_by("pending_count")
.first()
)
review = Review.objects.create(
reviewer=reviewer,
submission=self,
)
-1
View File
@@ -1,4 +1,3 @@
from django.db import models
from apps.core.models import BaseModel