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) review = Review.objects.get(reviewer=reviewer, submission=submission)
if review.state == ReviewStatusChoices.NOT_CHECKED.value: if review.state == ReviewStatusChoices.NOT_CHECKED.value:
review.state = ReviewStatusChoices.CHECKING.value review.state = ReviewStatusChoices.CHECKING.value
review.submission.state = (
CompetitionTaskSubmission.StatusChoices.CHECKING.value
)
review.save() review.save()
review.submission.save()
return status.OK, submission return status.OK, submission
@@ -84,8 +88,17 @@ def evaluate_submission(
points = 0 points = 0
for criterea in evaluation: for criterea in evaluation:
points += criterea["mark"] points += criterea["mark"]
review.submission.earned_points = points review.submission.earned_points = (
points # TODO: оценка не от последнего проверяющего а средняя по всем
)
review.save() 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 return status.OK, review.submission
+1
View File
@@ -113,6 +113,7 @@ def submit_task(
status=CompetitionTaskSubmission.StatusChoices.SENT, status=CompetitionTaskSubmission.StatusChoices.SENT,
content=content, content=content,
) )
submission.send_on_review()
if task.type == CompetitionTask.CompetitionTaskType.CHECKER: if task.type == CompetitionTask.CompetitionTaskType.CHECKER:
submission = CompetitionTaskSubmission.objects.create( submission = CompetitionTaskSubmission.objects.create(
user=user, user=user,
+1 -2
View File
@@ -1,7 +1,6 @@
from django.db import models from django.db import models
from apps.core.models import BaseModel from apps.core.models import BaseModel
from apps.task.models import CompetitionTaskSubmission
class Reviewer(BaseModel): class Reviewer(BaseModel):
@@ -20,7 +19,7 @@ class ReviewStatusChoices(models.TextChoices):
class Review(BaseModel): class Review(BaseModel):
reviewer = models.ForeignKey(Reviewer, on_delete=models.CASCADE) reviewer = models.ForeignKey(Reviewer, on_delete=models.CASCADE)
submission = models.ForeignKey( submission = models.ForeignKey(
CompetitionTaskSubmission, "task.CompetitionTaskSubmission",
on_delete=models.CASCADE, on_delete=models.CASCADE,
related_name="reviews", 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 uuid import uuid4
from django.db import models from django.db import models
from django.db.models import Count, Q
from tinymce.models import HTMLField from tinymce.models import HTMLField
from apps.competition.models import Competition from apps.competition.models import Competition
from apps.core.models import BaseModel from apps.core.models import BaseModel
from apps.review.models import Review, Reviewer, ReviewStatusChoices
from apps.task.validators import ContestTaskCriteriesValidator from apps.task.validators import ContestTaskCriteriesValidator
from apps.user.models import User from apps.user.models import User
@@ -56,6 +58,9 @@ class CompetitionTask(BaseModel):
verbose_name="критерии", verbose_name="критерии",
) )
# only when "review" type
reviewers = models.ManyToManyField(Reviewer, blank=True)
def clean(self): def clean(self):
ContestTaskCriteriesValidator()(self) ContestTaskCriteriesValidator()(self)
@@ -116,3 +121,27 @@ class CompetitionTaskSubmission(BaseModel):
reviewed_at = models.DateTimeField(null=True, blank=True) reviewed_at = models.DateTimeField(null=True, blank=True)
timestamp = models.DateTimeField(auto_now_add=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 django.db import models
from apps.core.models import BaseModel from apps.core.models import BaseModel