You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

102 lines
4.1 KiB

from django.db import models
from django.utils.translation import gettext_lazy as _
from apps.account.models import User
from apps.course.models.course import extract_text_from_json, format_multilingual_field
class Quiz(models.Model):
lesson = models.ForeignKey("course.CourseLesson", verbose_name=_('Lesson'), related_name='quizzes', on_delete=models.SET_NULL, null=True, blank=True)
course = models.ForeignKey("course.Course", verbose_name=_('Course'), related_name='quizzes', on_delete=models.CASCADE , null=True, blank=True)
lesson_number = models.PositiveIntegerField(default=0, verbose_name=_("Lesson Number"))
title = models.JSONField(default=list, verbose_name=_('Title'), help_text=_("Quiz Title"))
description = models.JSONField(default=list, blank=True, verbose_name=_("Description"))
each_question_timing = models.PositiveIntegerField(verbose_name=_("Each Question Timing"))
status = models.BooleanField(default=True, verbose_name=_("Status"))
class Meta:
verbose_name = _("Quiz")
verbose_name_plural = _("Quizzes")
ordering = ("-id",)
def __str__(self):
return f"Quiz: {self.id}"
def __repr__(self):
return f"Quiz(id={self.id})"
@property
def lesson_computed(self):
if self.lesson_number and self.lesson_number > 0 and self.course_id:
from apps.course.models import CourseLesson
from django.db.models import Q
lessons = list(CourseLesson.objects.filter(
course_id=self.course_id,
is_active=True
).filter(
Q(chapter__isnull=True) | Q(chapter__is_active=True)
).order_by('chapter__priority', 'priority'))
if len(lessons) >= self.lesson_number:
return lessons[self.lesson_number - 1]
return self.lesson
def save(self, *args, **kwargs):
# Automatically set the course based on the selected lesson
if self.lesson_id and hasattr(self.lesson, 'course'):
self.course = self.lesson.course
self.title = format_multilingual_field(self.title)
self.description = format_multilingual_field(self.description)
super().save(*args, **kwargs)
class Question(models.Model):
CHOICES = [
(1, _('Option 1')),
(2, _('Option 2')),
(3, _('Option 3')),
(4, _('Option 4')),
]
quiz = models.ForeignKey(Quiz, verbose_name=_('Quiz'), on_delete=models.CASCADE, related_name='questions')
question = models.JSONField(default=list, verbose_name=_('Question'))
option1 = models.JSONField(default=list, verbose_name=_('Option 1'))
option2 = models.JSONField(default=list, verbose_name=_('Option 2'))
option3 = models.JSONField(default=list, verbose_name=_('Option 3'))
option4 = models.JSONField(default=list, verbose_name=_('Option 4'))
correct_answer = models.PositiveSmallIntegerField(choices=CHOICES, verbose_name=_('Correct Answer'))
created_at = models.DateTimeField(auto_now_add=True, verbose_name=_('Created At'))
priority = models.IntegerField(null=True, blank=True, verbose_name=_('Priority'))
class Meta:
verbose_name = _("Question")
verbose_name_plural = _("Questions")
ordering = ("priority", "id",)
def __str__(self):
return extract_text_from_json(self.question)
def __repr__(self):
return f"Question(id={self.id})"
def save(self, *args, **kwargs):
if self.priority is None:
max_priority = Question.objects.filter(quiz=self.quiz).aggregate(models.Max('priority'))['priority__max']
self.priority = (max_priority or 0) + 1
self.question = format_multilingual_field(self.question)
self.option1 = format_multilingual_field(self.option1)
self.option2 = format_multilingual_field(self.option2)
self.option3 = format_multilingual_field(self.option3)
self.option4 = format_multilingual_field(self.option4)
super().save(*args, **kwargs)
class QuizRankUser(User):
class Meta:
proxy = True
verbose_name = _('Rank Quiz')
verbose_name_plural = _('Rank Quizzes')