from django.db import models from django.utils import timezone from django.core.files.storage import FileSystemStorage from django.conf import settings from django.utils.html import format_html from django.urls import reverse from django.utils.translation import ugettext_lazy as _ from sortedm2m.fields import SortedManyToManyField class Category(models.Model): category = models.CharField(max_length=200) def __str__(self): return self.category class Question(models.Model): stem = models.TextField( blank=False, help_text="Stem of the question", ) a = models.TextField( blank=False, help_text="The question text", ) a_answer = models.BooleanField( help_text="Answer (check for true)", default=True ) b = models.TextField( blank=False, help_text="The question text", ) b_answer = models.BooleanField( help_text="Answer", default=True ) c = models.TextField( blank=False, help_text="The question text", ) c_answer = models.BooleanField( help_text="Answer", default=True ) d = models.TextField( blank=False, help_text="The question text", ) d_answer = models.BooleanField( help_text="Answer", default=True ) e = models.TextField( blank=False, help_text="The question text", ) e_answer = models.BooleanField( help_text="Answer", default=True ) created_date = models.DateTimeField(default=timezone.now) author = models.ManyToManyField( settings.AUTH_USER_MODEL, blank=True, help_text="Author(s) of question", related_name="physics_authored_questions", ) category = models.ForeignKey( Category, on_delete=models.SET_NULL, null=True, blank=True ) def __str__(self): return self.stem def clean(self): if self.a: self.a = self.a.strip() if self.b: self.b = self.b.strip() if self.c: self.c = self.c.strip() if self.d: self.d = self.d.strip() if self.e: self.e = self.e.strip() class Exam(models.Model): name = models.CharField(max_length=200) exam_questions = SortedManyToManyField( Question, related_name="exams", blank="true" ) active = models.BooleanField( help_text="If an exam should be available", default=True ) publish_results = models.BooleanField( help_text="If an exams results should be available", default=True ) def __str__(self): return self.name def get_exam_name(self): return self.name def get_json_url(self): return reverse("anatomy:exam_json", args=(self.pk,)) def get_question_index(self, question): return list(self.exam_questions.all()).index(question) class CidUserAnswer(models.Model): """User answers by candidate""" question = models.ForeignKey( Question, related_name="cid_user_answers", on_delete=models.CASCADE ) a = models.BooleanField(blank=False) b = models.BooleanField(blank=False) c = models.BooleanField(blank=False) d = models.BooleanField(blank=False) e = models.BooleanField(blank=False) cid = models.IntegerField(blank=True, null=True) # Each user answer is associated with a particular exam exam = models.ForeignKey( Exam, related_name="cid_user_answers", on_delete=models.CASCADE, null=True ) created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) def __str__(self): return "{}/{}/{}".format(self.cid, self.exam, self.question.pk)