Source code for oioioi.quizzes.models

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 Quiz(Problem):
[docs] class Meta(object):
[docs] verbose_name = _("Quiz")
[docs] verbose_name_plural = _("Quizzes")
[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 Meta(object):
[docs] ordering = ['order']
[docs] verbose_name = _("Quiz question")
[docs] verbose_name_plural = _("Quiz questions")
[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 Meta(object):
[docs] ordering = ['order']
[docs] verbose_name = _("Quiz answer")
[docs] verbose_name_plural = _("Quiz answers")
[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 Meta(object):
[docs] abstract = True
[docs] ordering = ['order']
[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 Meta(QuizPicture.Meta):
[docs] verbose_name = _("Quiz question picture")
[docs] verbose_name_plural = _("Quiz question pictures")
[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 Meta(QuizPicture.Meta):
[docs] verbose_name = _("Quiz answer picture")
[docs] verbose_name_plural = _("Quiz answer pictures")
[docs]class QuizSubmission(Submission):
[docs] class Meta(object):
[docs] verbose_name = _("Quiz submission")
[docs] verbose_name_plural = _("Quiz submissions")
[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 Meta(object):
[docs] verbose_name = _("Quiz submission answer")
[docs] verbose_name_plural = _("Quiz submission answers")
[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] comment = models.TextField(blank=True, null=True, verbose_name=_("Comment"))
[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"))
[docs] class Meta(object):
[docs] verbose_name = _("Question report")
[docs] verbose_name_plural = _("Question reports")