Commit 720ccbfade51bc4749ea432c808b75b423e4d581
1 parent
b6f3badf
Exists in
master
and in
1 other branch
- more type annotations in student.py
Showing
3 changed files
with
19 additions
and
14 deletions
Show diff stats
BUGS.md
| 1 | 1 | |
| 2 | 2 | # BUGS |
| 3 | 3 | |
| 4 | +- duplo clicks no botao "responder" dessincroniza as questões, ver debounce em https://stackoverflow.com/questions/20281546/how-to-prevent-calling-of-en-event-handler-twice-on-fast-clicks | |
| 4 | 5 | - quando termina topico devia apagar as perguntas todas (se falhar a gerar novo topico, aparecem perguntas do antigo) |
| 5 | 6 | - apos clicar no botao responder, inactivar o input (importante quando o tempo de correcção é grande) |
| 6 | 7 | - devia mostrar timeout para o aluno saber a razao. | ... | ... |
aprendizations/learnapp.py
| ... | ... | @@ -195,9 +195,9 @@ class LearnApp(object): |
| 195 | 195 | # ------------------------------------------------------------------------ |
| 196 | 196 | async def check_answer(self, uid, answer): |
| 197 | 197 | knowledge = self.online[uid]['state'] |
| 198 | + topic = knowledge.get_current_topic() | |
| 198 | 199 | q, action = await knowledge.check_answer(answer) # may move questions |
| 199 | 200 | logger.info(f'User "{uid}" got {q["grade"]:.2} in "{q["ref"]}"') |
| 200 | - topic = knowledge.get_current_topic() | |
| 201 | 201 | |
| 202 | 202 | # always save grade of answered question |
| 203 | 203 | with self.db_session() as s: | ... | ... |
aprendizations/student.py
| ... | ... | @@ -3,11 +3,15 @@ |
| 3 | 3 | import random |
| 4 | 4 | from datetime import datetime |
| 5 | 5 | import logging |
| 6 | -from typing import List | |
| 6 | +from typing import List, Optional | |
| 7 | 7 | |
| 8 | 8 | # third party libraries |
| 9 | 9 | import networkx as nx |
| 10 | 10 | |
| 11 | +# this project | |
| 12 | +from .questions import Question | |
| 13 | + | |
| 14 | + | |
| 11 | 15 | # setup logger for this module |
| 12 | 16 | logger = logging.getLogger(__name__) |
| 13 | 17 | |
| ... | ... | @@ -68,12 +72,12 @@ class StudentState(object): |
| 68 | 72 | # questions: list of generated questions to do in the topic |
| 69 | 73 | # current_question: the current question to be presented |
| 70 | 74 | # ------------------------------------------------------------------------ |
| 71 | - async def start_topic(self, topic): | |
| 75 | + async def start_topic(self, topic: str): | |
| 72 | 76 | logger.debug(f'[start_topic] topic "{topic}"') |
| 73 | 77 | |
| 74 | - if self.current_topic == topic: | |
| 75 | - logger.info('Restarting current topic is not allowed.') | |
| 76 | - return | |
| 78 | + # if self.current_topic == topic: | |
| 79 | + # logger.info('Restarting current topic is not allowed.') | |
| 80 | + # return | |
| 77 | 81 | |
| 78 | 82 | # do not allow locked topics |
| 79 | 83 | if self.is_locked(topic): |
| ... | ... | @@ -115,7 +119,7 @@ class StudentState(object): |
| 115 | 119 | 'level': self.correct_answers / (self.correct_answers + |
| 116 | 120 | self.wrong_answers) |
| 117 | 121 | } |
| 118 | - # self.current_topic = None | |
| 122 | + self.current_topic = None | |
| 119 | 123 | self.unlock_topics() |
| 120 | 124 | |
| 121 | 125 | # ------------------------------------------------------------------------ |
| ... | ... | @@ -155,9 +159,9 @@ class StudentState(object): |
| 155 | 159 | return q, action |
| 156 | 160 | |
| 157 | 161 | # ------------------------------------------------------------------------ |
| 158 | - # Move to next question | |
| 162 | + # Move to next question, or None | |
| 159 | 163 | # ------------------------------------------------------------------------ |
| 160 | - def next_question(self): | |
| 164 | + def next_question(self) -> Optional[Question]: | |
| 161 | 165 | try: |
| 162 | 166 | self.current_question = self.questions.pop(0) |
| 163 | 167 | except IndexError: |
| ... | ... | @@ -177,7 +181,7 @@ class StudentState(object): |
| 177 | 181 | # ======================================================================== |
| 178 | 182 | |
| 179 | 183 | def topic_has_finished(self) -> bool: |
| 180 | - return self.current_question is None | |
| 184 | + return self.current_topic is None | |
| 181 | 185 | |
| 182 | 186 | # ------------------------------------------------------------------------ |
| 183 | 187 | # compute recommended sequence of topics ['a', 'b', ...] |
| ... | ... | @@ -196,11 +200,11 @@ class StudentState(object): |
| 196 | 200 | return unlocked + locked |
| 197 | 201 | |
| 198 | 202 | # ------------------------------------------------------------------------ |
| 199 | - def get_current_question(self): | |
| 203 | + def get_current_question(self) -> Optional[Question]: | |
| 200 | 204 | return self.current_question |
| 201 | 205 | |
| 202 | 206 | # ------------------------------------------------------------------------ |
| 203 | - def get_current_topic(self) -> str: | |
| 207 | + def get_current_topic(self) -> Optional[str]: | |
| 204 | 208 | return self.current_topic |
| 205 | 209 | |
| 206 | 210 | # ------------------------------------------------------------------------ |
| ... | ... | @@ -221,12 +225,12 @@ class StudentState(object): |
| 221 | 225 | } for ref in self.topic_sequence] |
| 222 | 226 | |
| 223 | 227 | # ------------------------------------------------------------------------ |
| 224 | - def get_topic_progress(self): | |
| 228 | + def get_topic_progress(self) -> float: | |
| 225 | 229 | return self.correct_answers / (1 + self.correct_answers + |
| 226 | 230 | len(self.questions)) |
| 227 | 231 | |
| 228 | 232 | # ------------------------------------------------------------------------ |
| 229 | - def get_topic_level(self, topic): | |
| 233 | + def get_topic_level(self, topic: str) -> float: | |
| 230 | 234 | return self.state[topic]['level'] |
| 231 | 235 | |
| 232 | 236 | # ------------------------------------------------------------------------ | ... | ... |