.
This commit is contained in:
+46
-34
@@ -17,12 +17,14 @@ import reversion
|
|||||||
|
|
||||||
from django.contrib.contenttypes.fields import GenericRelation
|
from django.contrib.contenttypes.fields import GenericRelation
|
||||||
|
|
||||||
|
|
||||||
class Category(models.Model):
|
class Category(models.Model):
|
||||||
category = models.CharField(max_length=200)
|
category = models.CharField(max_length=200)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.category
|
return self.category
|
||||||
|
|
||||||
|
|
||||||
class Question(models.Model):
|
class Question(models.Model):
|
||||||
stem = models.TextField(
|
stem = models.TextField(
|
||||||
blank=False,
|
blank=False,
|
||||||
@@ -32,50 +34,40 @@ class Question(models.Model):
|
|||||||
answer_help_text = "Answer text"
|
answer_help_text = "Answer text"
|
||||||
|
|
||||||
BEST_ANSWER_CHOICES = (
|
BEST_ANSWER_CHOICES = (
|
||||||
('a', 'a_answer'),
|
("a", "a_answer"),
|
||||||
('b', 'b_answer'),
|
("b", "b_answer"),
|
||||||
('c', 'c_answer'),
|
("c", "c_answer"),
|
||||||
('d', 'd_answer'),
|
("d", "d_answer"),
|
||||||
('e', 'e_answer'),
|
("e", "e_answer"),
|
||||||
)
|
)
|
||||||
|
|
||||||
# I doubt this is the best way to structure the model
|
# I doubt this is the best way to structure the model
|
||||||
# (but it should work)
|
# (but it should work)
|
||||||
a_answer = models.TextField(
|
a_answer = models.TextField(help_text=answer_help_text)
|
||||||
help_text=answer_help_text
|
|
||||||
)
|
|
||||||
a_feedback = models.TextField(
|
a_feedback = models.TextField(
|
||||||
blank=True,
|
blank=True,
|
||||||
help_text="Feedback for answer",
|
help_text="Feedback for answer",
|
||||||
)
|
)
|
||||||
|
|
||||||
b_answer = models.TextField(
|
b_answer = models.TextField(help_text=answer_help_text)
|
||||||
help_text=answer_help_text
|
|
||||||
)
|
|
||||||
b_feedback = models.TextField(
|
b_feedback = models.TextField(
|
||||||
blank=True,
|
blank=True,
|
||||||
help_text="Feedback for answer",
|
help_text="Feedback for answer",
|
||||||
)
|
)
|
||||||
|
|
||||||
c_answer = models.TextField(
|
c_answer = models.TextField(help_text=answer_help_text)
|
||||||
help_text=answer_help_text
|
|
||||||
)
|
|
||||||
c_feedback = models.TextField(
|
c_feedback = models.TextField(
|
||||||
blank=True,
|
blank=True,
|
||||||
help_text="Feedback for answer",
|
help_text="Feedback for answer",
|
||||||
)
|
)
|
||||||
|
|
||||||
d_answer = models.TextField(
|
d_answer = models.TextField(help_text=answer_help_text)
|
||||||
help_text=answer_help_text
|
|
||||||
)
|
|
||||||
d_feedback = models.TextField(
|
d_feedback = models.TextField(
|
||||||
blank=True,
|
blank=True,
|
||||||
help_text="Feedback for answer",
|
help_text="Feedback for answer",
|
||||||
)
|
)
|
||||||
|
|
||||||
e_answer = models.TextField(
|
e_answer = models.TextField(help_text=answer_help_text)
|
||||||
help_text=answer_help_text
|
|
||||||
)
|
|
||||||
e_feedback = models.TextField(
|
e_feedback = models.TextField(
|
||||||
blank=True,
|
blank=True,
|
||||||
help_text="Feedback for answer",
|
help_text="Feedback for answer",
|
||||||
@@ -86,7 +78,9 @@ class Question(models.Model):
|
|||||||
help_text="General question feedback",
|
help_text="General question feedback",
|
||||||
)
|
)
|
||||||
|
|
||||||
best_answer = models.CharField(max_length=20, choices=BEST_ANSWER_CHOICES, help_text="The correct answer")
|
best_answer = models.CharField(
|
||||||
|
max_length=20, choices=BEST_ANSWER_CHOICES, help_text="The correct answer"
|
||||||
|
)
|
||||||
|
|
||||||
created_date = models.DateTimeField(default=timezone.now)
|
created_date = models.DateTimeField(default=timezone.now)
|
||||||
|
|
||||||
@@ -122,14 +116,25 @@ class Question(models.Model):
|
|||||||
return reverse("sbas:question_detail", kwargs={"pk": self.pk})
|
return reverse("sbas:question_detail", kwargs={"pk": self.pk})
|
||||||
|
|
||||||
def get_answers(self):
|
def get_answers(self):
|
||||||
return (self.a_answer, self.b_answer, self.c_answer, self.d_answer, self.e_answer)
|
return (
|
||||||
|
self.a_answer,
|
||||||
|
self.b_answer,
|
||||||
|
self.c_answer,
|
||||||
|
self.d_answer,
|
||||||
|
self.e_answer,
|
||||||
|
)
|
||||||
|
|
||||||
def get_correct_answer(self):
|
def get_correct_answer(self):
|
||||||
if self.best_answer == "a": return self.a_answer
|
if self.best_answer == "a":
|
||||||
if self.best_answer == "b": return self.b_answer
|
return self.a_answer
|
||||||
if self.best_answer == "c": return self.c_answer
|
if self.best_answer == "b":
|
||||||
if self.best_answer == "d": return self.d_answer
|
return self.b_answer
|
||||||
if self.best_answer == "e": return self.e_answer
|
if self.best_answer == "c":
|
||||||
|
return self.c_answer
|
||||||
|
if self.best_answer == "d":
|
||||||
|
return self.d_answer
|
||||||
|
if self.best_answer == "e":
|
||||||
|
return self.e_answer
|
||||||
|
|
||||||
def get_correct_answer_stripped(self):
|
def get_correct_answer_stripped(self):
|
||||||
return self.get_correct_answer().replace("<p>", "", 1).replace("</p>", "", 1)
|
return self.get_correct_answer().replace("<p>", "", 1).replace("</p>", "", 1)
|
||||||
@@ -142,9 +147,7 @@ class Question(models.Model):
|
|||||||
class Exam(ExamBase):
|
class Exam(ExamBase):
|
||||||
app_name = "sbas"
|
app_name = "sbas"
|
||||||
|
|
||||||
exam_questions = SortedManyToManyField(
|
exam_questions = SortedManyToManyField(Question, related_name="exams", blank="true")
|
||||||
Question, related_name="exams", blank="true"
|
|
||||||
)
|
|
||||||
|
|
||||||
time_limit = models.IntegerField(
|
time_limit = models.IntegerField(
|
||||||
help_text="Exam time limit (in seconds)",
|
help_text="Exam time limit (in seconds)",
|
||||||
@@ -154,13 +157,18 @@ class Exam(ExamBase):
|
|||||||
|
|
||||||
recreate_json = None
|
recreate_json = None
|
||||||
|
|
||||||
author = models.ManyToManyField(settings.AUTH_USER_MODEL,
|
author = models.ManyToManyField(
|
||||||
|
settings.AUTH_USER_MODEL,
|
||||||
blank=True,
|
blank=True,
|
||||||
help_text='Author of exam',
|
help_text="Author of exam",
|
||||||
related_name="sba_exam_author")
|
related_name="sba_exam_author",
|
||||||
|
)
|
||||||
|
|
||||||
valid_users = models.ManyToManyField(CidUser, blank=True, related_name="sba_exams")
|
valid_users = models.ManyToManyField(CidUser, blank=True, related_name="sba_exams")
|
||||||
|
|
||||||
|
def get_take_url(self):
|
||||||
|
return reverse("physics:exam_start", kwargs={"pk": self.pk})
|
||||||
|
|
||||||
|
|
||||||
@reversion.register
|
@reversion.register
|
||||||
class CidUserAnswer(models.Model):
|
class CidUserAnswer(models.Model):
|
||||||
@@ -169,7 +177,11 @@ class CidUserAnswer(models.Model):
|
|||||||
question = models.ForeignKey(
|
question = models.ForeignKey(
|
||||||
Question, related_name="cid_user_answers", on_delete=models.CASCADE
|
Question, related_name="cid_user_answers", on_delete=models.CASCADE
|
||||||
)
|
)
|
||||||
answer = models.CharField(max_length=20, choices=Question.BEST_ANSWER_CHOICES, help_text="The correct answer")
|
answer = models.CharField(
|
||||||
|
max_length=20,
|
||||||
|
choices=Question.BEST_ANSWER_CHOICES,
|
||||||
|
help_text="The correct answer",
|
||||||
|
)
|
||||||
|
|
||||||
cid = models.IntegerField(blank=True, null=True)
|
cid = models.IntegerField(blank=True, null=True)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user