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
+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