mirror of
https://gitlab.com/megazordpobeda/DataRush.git
synced 2026-05-22 22:07:10 +00:00
feat: added appointment of reviewer to a submission
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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,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'),
|
||||
),
|
||||
]
|
||||
@@ -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,4 +1,3 @@
|
||||
|
||||
from django.db import models
|
||||
|
||||
from apps.core.models import BaseModel
|
||||
|
||||
Reference in New Issue
Block a user