Commit b9094cfbafeb440b500ce176ee003fed1b2186d6

Authored by Miguel Barão
1 parent 51a1382e
Exists in master and in 1 other branch dev

- 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):
... ...