Add script invocation to ScriptQuestion
[quizzer.git] / quizzer / ui / __init__.py
index 69b120315e463074075c3e91e6e0c84a770441f7..caf2a71c713a845b4f115ab9ddbb41a0d4b96ab1 100644 (file)
@@ -1,10 +1,17 @@
+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()
@@ -13,30 +20,14 @@ class UserInterface (object):
         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, [])]]