mirror of
https://gitlab.com/megazordpobeda/DataRush.git
synced 2026-05-22 23:17:09 +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)
|
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
|
||||||
|
|||||||
@@ -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,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'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -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,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
|
||||||
|
|||||||
Reference in New Issue
Block a user