from django.db import models
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
from oioioi.base.fields import EnumField
from oioioi.contests.fields import ScoreField
from oioioi.contests.models import Submission, SubmissionReport, submission_statuses
from oioioi.problems.models import Problem
[docs]class QuizQuestion(models.Model):
[docs] question = models.TextField(verbose_name=_("Question"))
[docs] points = models.IntegerField(default=1, verbose_name=_("Points"))
[docs] is_multiple_choice = models.BooleanField(
default=False, verbose_name=_("Is multiple choice")
)
[docs] quiz = models.ForeignKey(Quiz, verbose_name=_("Quiz"), on_delete=models.CASCADE)
[docs] order = models.IntegerField(default=0, verbose_name=_("Order"))
[docs] is_text_input = models.BooleanField(
default=False,
verbose_name=_("Hide answers"),
help_text=_(
"Instead of listing answers, expect the contestant to type in their answer."
),
)
[docs]class QuizAnswer(models.Model):
[docs] question = models.ForeignKey(
QuizQuestion, verbose_name=_("Question"), on_delete=models.CASCADE
)
[docs] answer = models.TextField(verbose_name=_("Answer"))
[docs] is_correct = models.BooleanField(default=False, verbose_name=_("Is answer correct"))
[docs] order = models.IntegerField(default=0, verbose_name=_("Order"))
[docs]class QuizPicture(models.Model):
[docs] caption = models.TextField(verbose_name=_("Caption"), blank=True)
[docs] file = models.FileField(verbose_name=_("Image file"))
[docs] order = models.IntegerField(default=0, verbose_name=_("Order"))
[docs] def get_absolute_url(self):
raise NotImplementedError
@property
[docs] def quiz(self):
raise NotImplementedError
[docs]class QuizQuestionPicture(QuizPicture):
[docs] question = models.ForeignKey(QuizQuestion, on_delete=models.CASCADE)
[docs] def get_absolute_url(self):
return reverse('picture_view', args=['q', self.id])
@property
[docs] def quiz(self):
return self.question.quiz
[docs]class QuizAnswerPicture(QuizPicture):
[docs] answer = models.ForeignKey(QuizAnswer, on_delete=models.CASCADE)
[docs] def get_absolute_url(self):
return reverse('picture_view', args=['a', self.id])
@property
[docs] def quiz(self):
return self.answer.question.quiz
[docs]class QuizSubmission(Submission):
[docs]class QuizSubmissionAnswer(models.Model):
[docs] quiz_submission = models.ForeignKey(
QuizSubmission, verbose_name=_("Quiz submission"), on_delete=models.CASCADE
)
[docs] answer = models.ForeignKey(
QuizAnswer, verbose_name=_("Answer"), on_delete=models.SET_NULL, null=True
)
[docs] is_selected = models.BooleanField(
default=False, verbose_name=_("Is answer selected")
)
[docs]class QuizSubmissionTextAnswer(models.Model):
[docs] quiz_submission = models.ForeignKey(
QuizSubmission, verbose_name=_("Quiz submission"), on_delete=models.CASCADE
)
[docs] question = models.ForeignKey(
QuizQuestion, verbose_name=_("Question"), on_delete=models.SET_NULL, null=True
)
[docs] text_answer = models.TextField(verbose_name=_("Text answer"))
[docs] class Meta(object):
[docs] unique_together = (('quiz_submission', 'question'),)
[docs] verbose_name = _("Quiz submission text answer")
[docs] verbose_name_plural = _("Quiz submission text answers")
[docs]class QuestionReport(models.Model):
[docs] submission_report = models.ForeignKey(
SubmissionReport, verbose_name=_("Submission report"), on_delete=models.CASCADE
)
[docs] score = ScoreField(verbose_name=_("Score"))
[docs] question = models.ForeignKey(
QuizQuestion,
blank=True,
null=True,
on_delete=models.SET_NULL,
verbose_name=_("Question"),
)
[docs] question_max_score = models.IntegerField(verbose_name=_("Question max score"))
[docs] status = EnumField(submission_statuses, default='WA', verbose_name=_("Status"))