Commit 4ff14f271aab2bb07212cccbbf10567ee0090990
1 parent
d5cd0d10
Exists in
master
and in
1 other branch
- fixed previous comments reset on each new answer submission
Showing
4 changed files
with
18 additions
and
22 deletions
Show diff stats
BUGS.md
... | ... | @@ -2,7 +2,6 @@ |
2 | 2 | # BUGS |
3 | 3 | |
4 | 4 | - default prefix should be obtained from each course (yaml conf)? |
5 | -- quando a pergunta devolve comments, este é apresentado, mas fica persistente nas tentativas seguintes. devia ser limpo apos a segunda submissao. | |
6 | 5 | - a opcao max_tries na especificacao das perguntas é cumbersome... usar antes tries? |
7 | 6 | - tabelas nas perguntas radio/checkbox não ocupam todo o espaço como em question. |
8 | 7 | - nas perguntas de código, quando erra nao se devia acrescentar mesma pergunta no fim. |
... | ... | @@ -29,6 +28,8 @@ |
29 | 28 | - normalizar com perguntations. |
30 | 29 | |
31 | 30 | # FIXED |
31 | + | |
32 | +- quando a pergunta devolve comments, este é apresentado, mas fica persistente nas tentativas seguintes. devia ser limpo apos a segunda submissao. | |
32 | 33 | - na definicao dos topicos, indicar: |
33 | 34 | "file: questions.yaml" (default questions.yaml) |
34 | 35 | "shuffle: True/False" (default False) | ... | ... |
knowledge.py
... | ... | @@ -104,7 +104,6 @@ class StudentKnowledge(object): |
104 | 104 | def finish_topic(self): |
105 | 105 | logger.debug(f'StudentKnowledge.finish_topic({self.current_topic})') |
106 | 106 | |
107 | - self.current_question = None | |
108 | 107 | self.state[self.current_topic] = { |
109 | 108 | 'date': datetime.now(), |
110 | 109 | 'level': self.correct_answers / (self.correct_answers + self.wrong_answers) |
... | ... | @@ -128,29 +127,27 @@ class StudentKnowledge(object): |
128 | 127 | |
129 | 128 | logger.debug(f'Grade {grade:.2} ({q["ref"]})') |
130 | 129 | |
131 | - # if answer is correct, get next question | |
132 | 130 | if grade > 0.999: |
133 | 131 | self.correct_answers += 1 |
134 | 132 | self.next_question() |
133 | + action = 'new_question' | |
135 | 134 | |
136 | - # if wrong, keep same question and append a similar one at the end | |
137 | 135 | else: |
138 | 136 | self.wrong_answers += 1 |
139 | - | |
140 | 137 | self.current_question['tries'] -= 1 |
141 | - | |
142 | 138 | logger.debug(f'Wrong answers = {self.wrong_answers}; Tries = {self.current_question["tries"]}') |
143 | 139 | |
144 | - # append a new instance of the current question to the end and | |
145 | - # move to the next question | |
146 | 140 | if self.current_question['tries'] <= 0: |
147 | 141 | logger.debug("Appending new instance of this question to the end") |
148 | - factory = self.factory # self.deps.node[self.current_topic]['factory'] | |
149 | - self.questions.append(factory[q['ref']].generate()) | |
142 | + self.questions.append(self.factory[q['ref']].generate()) | |
150 | 143 | self.next_question() |
144 | + action = 'new_question' | |
145 | + | |
146 | + else: | |
147 | + action = 'wrong' | |
151 | 148 | |
152 | 149 | # returns answered and corrected question (not new one) |
153 | - return q | |
150 | + return q, action | |
154 | 151 | |
155 | 152 | |
156 | 153 | # ------------------------------------------------------------------------ |
... | ... | @@ -160,12 +157,14 @@ class StudentKnowledge(object): |
160 | 157 | try: |
161 | 158 | self.current_question = self.questions.pop(0) |
162 | 159 | except IndexError: |
160 | + self.current_question = None | |
163 | 161 | self.finish_topic() |
164 | 162 | else: |
165 | 163 | self.current_question['start_time'] = datetime.now() |
166 | 164 | self.current_question['tries'] = self.current_question.get('max_tries', 3) # FIXME hardcoded 3 |
167 | 165 | logger.debug(f'Next question is "{self.current_question["ref"]}"') |
168 | 166 | |
167 | + return self.current_question # question or None | |
169 | 168 | |
170 | 169 | # ======================================================================== |
171 | 170 | # pure functions of the state (no side effects) | ... | ... |
learnapp.py
... | ... | @@ -136,7 +136,7 @@ class LearnApp(object): |
136 | 136 | # ------------------------------------------------------------------------ |
137 | 137 | async def check_answer(self, uid, answer): |
138 | 138 | knowledge = self.online[uid]['state'] |
139 | - q = await knowledge.check_answer(answer) # also moves to next question | |
139 | + q, action = await knowledge.check_answer(answer) # also moves to next question | |
140 | 140 | logger.info(f'User "{uid}" got {q["grade"]:.2} in question "{q["ref"]}"') |
141 | 141 | topic = knowledge.get_current_topic() |
142 | 142 | |
... | ... | @@ -175,15 +175,10 @@ class LearnApp(object): |
175 | 175 | s.add(a) |
176 | 176 | |
177 | 177 | logger.debug(f'Saved topic "{topic}" into database') |
178 | - return 'finished_topic' | |
178 | + action = 'finished_topic' # FIXME | |
179 | + | |
180 | + return action | |
179 | 181 | |
180 | - if q['tries'] > 0 and q['grade'] <= 0.999: | |
181 | - return 'wrong' | |
182 | - # elif q['tries'] <= 0 and q['grade'] <= 0.999: | |
183 | - # return 'max_tries_exceeded' | |
184 | - else: | |
185 | - return 'new_question' | |
186 | - # return q['grade'] | |
187 | 182 | |
188 | 183 | # ------------------------------------------------------------------------ |
189 | 184 | # Start new topic |
... | ... | @@ -252,11 +247,11 @@ class LearnApp(object): |
252 | 247 | topics = config.get('topics', {}) |
253 | 248 | g = self.deps # the dependency graph |
254 | 249 | |
250 | + g.add_nodes_from(topics.keys()) | |
255 | 251 | for tref, attr in topics.items(): |
256 | - # g.add_node(tref) | |
257 | 252 | g.add_edges_from((d,tref) for d in attr.get('deps', [])) |
258 | 253 | |
259 | - t = g.node[tref] # current topic node | |
254 | + t = g.node[tref] # get current topic node | |
260 | 255 | t['type'] = attr.get('type', 'topic') |
261 | 256 | t['name'] = attr.get('name', tref) |
262 | 257 | t['path'] = path.join(g.graph['prefix'], tref) # prefix/topic | ... | ... |