Merge branch 'master' into quizzes
[oweals/karmaworld.git] / karmaworld / apps / quizzes / create_quiz.py
1 import random
2 from karmaworld.apps.notes.models import Note
3 from karmaworld.apps.quizzes.models import MultipleChoiceQuestion, Quiz, TrueFalseQuestion, MultipleChoiceOption, \
4     Keyword, FlashCardQuestion
5
6 KEYWORD_MULTIPLE_CHOICE = 1
7 DEFINITION_MULTIPLE_CHOICE = 2
8 KEYWORD_DEFINITION_TRUE_FALSE = 3
9 FLASHCARD_KEYWORD_BLANK = 4
10 GENERATED_QUESTION_TYPE = (
11     KEYWORD_MULTIPLE_CHOICE,
12     DEFINITION_MULTIPLE_CHOICE,
13     KEYWORD_DEFINITION_TRUE_FALSE,
14     FLASHCARD_KEYWORD_BLANK,
15 )
16
17 MULTIPLE_CHOICE_CHOICES = 4
18
19
20 def _create_keyword_multiple_choice(keyword, keywords, quiz):
21     question_object = MultipleChoiceQuestion.objects.create(
22         question_text=keyword.definition,
23         quiz=quiz)
24
25     MultipleChoiceOption.objects.create(
26         text=keyword.word,
27         correct=True,
28         question=question_object)
29
30     for other_keyword in random.sample(keywords.exclude(id=keyword.id), MULTIPLE_CHOICE_CHOICES - 1):
31         MultipleChoiceOption.objects.create(
32             text=other_keyword.word,
33             correct=False,
34             question=question_object)
35
36
37 def _create_definition_multiple_choice(keyword, keywords, quiz):
38     question_object = MultipleChoiceQuestion.objects.create(
39         question_text=keyword.word,
40         quiz=quiz)
41
42     MultipleChoiceOption.objects.create(
43         text=keyword.definition,
44         correct=True,
45         question=question_object)
46
47     for other_keyword in random.sample(keywords.exclude(id=keyword.id), MULTIPLE_CHOICE_CHOICES - 1):
48         MultipleChoiceOption.objects.create(
49             text=other_keyword.definition,
50             correct=False,
51             question=question_object)
52
53
54 def _create_keyword_definition_true_false(keyword, keywords, quiz):
55     true = random.choice((True, False))
56
57     if true:
58         definition = keyword.definition
59     else:
60         other_keyword = keywords.exclude(id=keyword.id)
61         definition = other_keyword.definition
62
63     question_text = 'Is the following a correct definition of {w}:<br/>{d}'. \
64         format(w=keyword.word, d=definition)
65
66     TrueFalseQuestion.objects.create(
67         text=question_text,
68         quiz=quiz,
69         true=true)
70
71
72 def _create_keyword_flashcard_blank(keyword, quiz):
73     FlashCardQuestion.objects.create(
74         definition_side=keyword.definition,
75         keyword_side=keyword.word,
76         quiz=quiz)
77
78
79 def quiz_from_keywords(note_id):
80     note_object = Note.objects.get(id=note_id)
81     quiz_object = Quiz.objects.create(note=note_object, name=note_object.name)
82     keywords = Keyword.objects.filter(note=note_object)
83
84     for keyword in keywords:
85         if keyword.word and keyword.definition:
86             question_type = random.choice(GENERATED_QUESTION_TYPE)
87
88             if question_type is KEYWORD_MULTIPLE_CHOICE:
89                 _create_keyword_multiple_choice(keyword, keywords, quiz_object)
90
91             elif question_type is DEFINITION_MULTIPLE_CHOICE:
92                 _create_definition_multiple_choice(keyword, keywords, quiz_object)
93
94             elif question_type is KEYWORD_DEFINITION_TRUE_FALSE:
95                 _create_keyword_definition_true_false(keyword, keywords, quiz_object)
96
97             elif question_type is FLASHCARD_KEYWORD_BLANK:
98                 _create_keyword_flashcard_blank(keyword, quiz_object)
99
100