Commit b9094cfbafeb440b500ce176ee003fed1b2186d6
1 parent
51a1382e
Exists in
master
and in
1 other branch
- fixed direct link to topic locked
Showing
4 changed files
with
31 additions
and
15 deletions
Show diff stats
BUGS.md
| ... | ... | @@ -2,13 +2,10 @@ |
| 2 | 2 | BUGS: |
| 3 | 3 | |
| 4 | 4 | - se refs de um topic estao invalidos, nao carrega esse topico. devia haver um error nos logs a indicar qual o ref invalido. |
| 5 | -- templates not working: quesntion-information, question-warning (remove all informative panels??) | |
| 6 | -- link directo para topico nao valida se topico esta unlocked. | |
| 7 | -- reportar comentarios após submeter. | |
| 8 | 5 | - forçar reload das perguntas sem ter de deitar abaixo o servidor. |
| 9 | 6 | - topicos virtuais nao deveriam aparecer. na construção da árvore os sucessores seriam ligados directamente aos predecessores. |
| 10 | 7 | - Criar outra estrutura organizada em capítulos (conjuntos de tópicos). Permitir capítulos de capítulos, etc. talvez usar grafos de grafos... |
| 11 | -- pertuntas tipo tristate: (sim, não, não sei) | |
| 8 | +- pertuntas tipo tristate: (sim, não, não sei | |
| 12 | 9 | - detect questions in questions.yaml without ref -> error ou generate default. |
| 13 | 10 | - error if demo.yaml has no topics |
| 14 | 11 | - session management. close after inactive time. |
| ... | ... | @@ -19,6 +16,8 @@ BUGS: |
| 19 | 16 | |
| 20 | 17 | TODO: |
| 21 | 18 | |
| 19 | +- reportar comentarios após submeter. | |
| 20 | +- each topic only loads a sample of K questions (max) in random order. | |
| 22 | 21 | - servir imagens/ficheiros. |
| 23 | 22 | - update de fontawesome para versão 5. |
| 24 | 23 | - reload das perguntas enquanto online. |
| ... | ... | @@ -35,6 +34,8 @@ TODO: |
| 35 | 34 | |
| 36 | 35 | FIXED: |
| 37 | 36 | |
| 37 | +- link directo para topico nao valida se topico esta unlocked. | |
| 38 | +- templates not working: quesntion-information, question-warning (remove all informative panels??) | |
| 38 | 39 | - enderecos errados dao internal error. |
| 39 | 40 | - barra de progresso nao está visível. |
| 40 | 41 | - tabs em textarea nao funcionam correctamente (insere 1 espaco em vez de 4) | ... | ... |
knowledge.py
| ... | ... | @@ -70,6 +70,10 @@ class StudentKnowledge(object): |
| 70 | 70 | if not topic: |
| 71 | 71 | topic = self.get_recommended_topic() |
| 72 | 72 | |
| 73 | + # check if it's unlocked | |
| 74 | + if self.is_locked(topic): | |
| 75 | + return False | |
| 76 | + | |
| 73 | 77 | self.current_topic = topic |
| 74 | 78 | # logger.info(f'Topic set to "{topic}"') |
| 75 | 79 | |
| ... | ... | @@ -82,6 +86,7 @@ class StudentKnowledge(object): |
| 82 | 86 | |
| 83 | 87 | self.current_question = self.questions.pop(0) # FIXME crash if empty |
| 84 | 88 | self.current_question['start_time'] = datetime.now() |
| 89 | + return True | |
| 85 | 90 | |
| 86 | 91 | # ------------------------------------------------------------------------ |
| 87 | 92 | # The topic has finished and there are no more questions. |
| ... | ... | @@ -148,6 +153,10 @@ class StudentKnowledge(object): |
| 148 | 153 | return self.current_topic |
| 149 | 154 | |
| 150 | 155 | # ------------------------------------------------------------------------ |
| 156 | + def is_locked(self, topic): | |
| 157 | + return topic not in self.state | |
| 158 | + | |
| 159 | + # ------------------------------------------------------------------------ | |
| 151 | 160 | # Return list of {ref: 'xpto', name: 'long name', leve: 0.5} |
| 152 | 161 | # Levels are in the interval [0, 1] if unlocked or None if locked. |
| 153 | 162 | # Topics unlocked but not yet done have level 0.0. |
| ... | ... | @@ -176,3 +185,4 @@ class StudentKnowledge(object): |
| 176 | 185 | # ------------------------------------------------------------------------ |
| 177 | 186 | def get_recommended_topic(self): # FIXME untested |
| 178 | 187 | return min(self.state.items(), key=lambda x: x[1]['level'])[0] |
| 188 | + | ... | ... |
learnapp.py
| ... | ... | @@ -147,12 +147,16 @@ class LearnApp(object): |
| 147 | 147 | # ------------------------------------------------------------------------ |
| 148 | 148 | def start_topic(self, uid, topic): |
| 149 | 149 | try: |
| 150 | - self.online[uid]['state'].init_topic(topic) | |
| 150 | + ok = self.online[uid]['state'].init_topic(topic) | |
| 151 | 151 | except KeyError as e: |
| 152 | - logger.warning(f'User "{uid}" trying to start nonexistent "{topic}"') | |
| 152 | + logger.warning(f'User "{uid}" denied nonexistent "{topic}"') | |
| 153 | 153 | raise e |
| 154 | 154 | else: |
| 155 | - logger.info(f'User "{uid}" started "{topic}"') | |
| 155 | + if ok: | |
| 156 | + logger.info(f'User "{uid}" started "{topic}"') | |
| 157 | + else: | |
| 158 | + logger.warning(f'User "{uid}" denied locked "{topic}"') | |
| 159 | + return ok | |
| 156 | 160 | |
| 157 | 161 | # ------------------------------------------------------------------------ |
| 158 | 162 | # Fill db table 'Topic' with topics from the graph if not already there. | ... | ... |
serve.py
| ... | ... | @@ -129,16 +129,17 @@ class TopicHandler(BaseHandler): |
| 129 | 129 | uid = self.current_user |
| 130 | 130 | |
| 131 | 131 | try: |
| 132 | - self.learn.start_topic(uid, topic) | |
| 132 | + ok = self.learn.start_topic(uid, topic) | |
| 133 | 133 | except KeyError: |
| 134 | - self.redirect('/') | |
| 135 | - # raise tornado.web.HTTPError(404) | |
| 134 | + self.redirect('/') | |
| 136 | 135 | else: |
| 137 | - self.render('topic.html', | |
| 138 | - uid=uid, | |
| 139 | - name=self.learn.get_student_name(uid), | |
| 140 | - ) | |
| 141 | - | |
| 136 | + if ok: | |
| 137 | + self.render('topic.html', | |
| 138 | + uid=uid, | |
| 139 | + name=self.learn.get_student_name(uid), | |
| 140 | + ) | |
| 141 | + else: | |
| 142 | + self.redirect('/') | |
| 142 | 143 | |
| 143 | 144 | # ---------------------------------------------------------------------------- |
| 144 | 145 | class FileHandler(BaseHandler): | ... | ... |