1
0
Files
medical-notes/quiz/quiz/models.py
Johan Dahlin 5169a67966
All checks were successful
Deploy Quartz site to GitHub Pages / build (push) Successful in 2m12s
vault backup: 2025-12-22 12:22:20
2025-12-22 12:22:20 +01:00

111 lines
3.8 KiB
Python

from django.db import models
class QuizUser(models.Model):
session_key = models.CharField(max_length=40, unique=True)
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
verbose_name = "Quiz User"
verbose_name_plural = "Quiz Users"
def __str__(self):
return f"User {self.session_key[:8]}"
class Course(models.Model):
name = models.CharField(max_length=200, unique=True)
code = models.CharField(max_length=50, blank=True)
description = models.TextField(blank=True)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.name
class Exam(models.Model):
course = models.ForeignKey(Course, on_delete=models.CASCADE, related_name='exams')
date = models.DateField()
name = models.CharField(max_length=200, blank=True) # e.g., "2022-01-15"
folder_path = models.CharField(max_length=500, blank=True) # Path to exam folder in content
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
unique_together = ['course', 'date']
ordering = ['-date']
def __str__(self):
return f"{self.course.name} - {self.date}"
class Question(models.Model):
exam = models.ForeignKey(Exam, on_delete=models.CASCADE, related_name='questions', null=True, blank=True)
file_path = models.CharField(max_length=500, unique=True)
text = models.TextField()
correct_answer = models.CharField(max_length=50) # Support multi-select answers like "A,B,C"
file_mtime = models.FloatField(null=True, blank=True) # Track file modification time
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
tags = models.ManyToManyField('Tag', blank=True, related_name='questions')
def __str__(self):
return self.text[:50]
class Tag(models.Model):
name = models.CharField(max_length=50, unique=True)
slug = models.SlugField(max_length=50, unique=True)
def __str__(self):
return self.name
class Option(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name='options')
letter = models.CharField(max_length=1)
text = models.TextField()
class Meta:
unique_together = ['question', 'letter']
def __str__(self):
return f"{self.letter}. {self.text[:30]}"
class QuizSession(models.Model):
user = models.ForeignKey(QuizUser, on_delete=models.CASCADE, related_name='quiz_sessions')
course = models.ForeignKey(Course, on_delete=models.SET_NULL, null=True, blank=True)
exams = models.ManyToManyField(Exam, blank=True)
tags = models.ManyToManyField(Tag, blank=True)
question_types = models.JSONField(default=list, blank=True) # Store as list of strings
created_at = models.DateTimeField(auto_now_add=True)
is_active = models.BooleanField(default=True)
class Meta:
ordering = ['-created_at']
def __str__(self):
return f"Session {self.id} for {self.user}"
class QuizResult(models.Model):
user = models.ForeignKey(QuizUser, on_delete=models.CASCADE, related_name='results')
quiz_session = models.ForeignKey(QuizSession, on_delete=models.CASCADE, related_name='results', null=True, blank=True)
question = models.ForeignKey(Question, on_delete=models.CASCADE)
selected_answer = models.CharField(max_length=1)
is_correct = models.BooleanField()
difficulty = models.CharField(max_length=10, blank=True, null=True, choices=[
('again', 'Again'),
('hard', 'Hard'),
('good', 'Good'),
('easy', 'Easy'),
])
answered_at = models.DateTimeField(auto_now_add=True)
class Meta:
unique_together = ['user', 'question']
def __str__(self):
return f"{self.user} - {self.question.text[:30]} - {'' if self.is_correct else ''}"