+from .. import answerdb as _answerdb
+
+
class UserInterface (object):
"Give a quiz over a generic user interface"
- def __init__(self, quiz=None, answers=None):
+ def __init__(self, quiz=None, answers=None, stack=None):
self.quiz = quiz
if answers is None:
- answers = {}
+ answers = _answerdb.AnswerDatabase()
self.answers = answers
+ if stack is None:
+ stack = self.answers.get_never_correctly_answered(
+ questions=quiz.leaf_questions())
+ self.stack = stack
def run(self):
raise NotImplementedError()
raise NotImplementedError()
def get_question(self):
- remaining = self.get_unanswered()
- if remaining:
- return remaining[0]
+ if self.stack:
+ return self.stack.pop(0)
def process_answer(self, question, answer):
- if question not in self.answers:
- self.answers[question] = []
correct = question.check(answer)
- self.answers[question].append({
- 'answer': answer,
- 'correct': correct,
- })
+ self.answers.add(question=question, answer=answer, correct=correct)
+ if not correct:
+ self.stack.insert(0, question)
+ for qid in reversed(question.dependencies):
+ self.stack.insert(0, self.quiz.get(id=qid))
return correct
-
- def get_answered(self):
- return [q for q in self.quiz if q in self.answers]
-
- def get_unanswered(self):
- return [q for q in self.quiz if q not in self.answers]
-
- def get_correctly_answered(self):
- return [q for q in self.quiz
- if True in [a['correct'] for a in self.answers.get(q, [])]]
-
- def get_never_correctly_answered(self):
- return [q for q in self.quiz
- if True not in [a['correct'] for a in self.answers.get(q, [])]]