Commit 29c8b4cb9768214b7f0bb03a19bb72b9dc100bab

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

- fixed FileHandler

- fixed enter-submit issue
1 1
2 BUGS: 2 BUGS:
3 3
4 -- enter faz GET /question, que responde com json no ecran 4 +- aumentar espaço a seguir às tabelas no texto
  5 +- guardar state cada vez que topico termina
5 - tabs em textarea nao funcionam correctamente (insere 1 espaco em vez de 4) 6 - tabs em textarea nao funcionam correctamente (insere 1 espaco em vez de 4)
6 - reportar comentarios após submeter. 7 - reportar comentarios após submeter.
7 -- os topicos locked devem estar inactivos no sidebar.  
8 - textarea deve mostrar no html os valores iniciais de ans, se existir 8 - textarea deve mostrar no html os valores iniciais de ans, se existir
9 - detect questions in questions.yaml without ref -> error ou generate default. 9 - detect questions in questions.yaml without ref -> error ou generate default.
10 - error if demo.yaml has no topics 10 - error if demo.yaml has no topics
11 -- guardar state cada vez que topico termina  
12 - session management. close after inactive time. 11 - session management. close after inactive time.
13 - implementar xsrf. Ver [http://www.tornadoweb.org/en/stable/guide/security.html#cross-site-request-forgery-protection]() 12 - implementar xsrf. Ver [http://www.tornadoweb.org/en/stable/guide/security.html#cross-site-request-forgery-protection]()
14 - titulos das perguntas não suportam markdown 13 - titulos das perguntas não suportam markdown
  14 +- generators not working: bcrypt (ver blog)
15 15
16 TODO: 16 TODO:
17 17
18 - pymips: activar/desactivar instruções 18 - pymips: activar/desactivar instruções
19 - implementar servidor http com redirect para https. 19 - implementar servidor http com redirect para https.
20 - usar codemirror no textarea 20 - usar codemirror no textarea
21 -- generators not working: bcrypt (ver blog)  
22 21
23 FIXED: 22 FIXED:
24 23
  24 +- os topicos locked devem estar inactivos no sidebar.
  25 +- enter faz GET /question, que responde com json no ecran. (solution: disabled enter)
25 - topicos no sidebar devem ser links para iniciar um topico acessivel. 26 - topicos no sidebar devem ser links para iniciar um topico acessivel.
26 - logs inicio de topico 27 - logs inicio de topico
27 - indicar o topico actual no sidebar 28 - indicar o topico actual no sidebar
@@ -88,12 +88,9 @@ class Knowledge(object): @@ -88,12 +88,9 @@ class Knowledge(object):
88 # new question if answer is correct 88 # new question if answer is correct
89 if grade > 0.999: 89 if grade > 0.999:
90 self.finished_questions.append(q) 90 self.finished_questions.append(q)
91 - print('questions: ', self.questions)  
92 - print('finished: ', self.finished_questions)  
93 try: 91 try:
94 self.current_question = self.questions.pop(0) # FIXME empty? 92 self.current_question = self.questions.pop(0) # FIXME empty?
95 except IndexError: 93 except IndexError:
96 - print('no more questions!')  
97 self.current_question = None 94 self.current_question = None
98 self.state[self.current_topic] = { 95 self.state[self.current_topic] = {
99 'level': 1.0, 96 'level': 1.0,
@@ -103,10 +100,8 @@ class Knowledge(object): @@ -103,10 +100,8 @@ class Knowledge(object):
103 else: 100 else:
104 self.current_question['start_time'] = datetime.now() 101 self.current_question['start_time'] = datetime.now()
105 else: 102 else:
106 - # FIXME debug this  
107 factory = self.depgraph.node[self.current_topic]['factory'] 103 factory = self.depgraph.node[self.current_topic]['factory']
108 self.questions.append(factory[q['ref']].generate()) 104 self.questions.append(factory[q['ref']].generate())
109 - print([q['ref'] for q in self.questions])  
110 105
111 return q 106 return q
112 107
@@ -135,11 +130,6 @@ class Knowledge(object): @@ -135,11 +130,6 @@ class Knowledge(object):
135 if t in self.state: 130 if t in self.state:
136 ts.append((t, self.state[t]['level'])) # already done 131 ts.append((t, self.state[t]['level'])) # already done
137 else: 132 else:
138 - # deps = self.depgraph.predecessors(t)  
139 - # # print(t, deps)  
140 - # if all(d in self.state for d in deps):  
141 - # ts.append((t, 0.0)) # unlocked not yet done  
142 - # else:  
143 ts.append((t, None)) # locked 133 ts.append((t, None)) # locked
144 return ts 134 return ts
145 135
@@ -134,11 +134,14 @@ class FileHandler(BaseHandler): @@ -134,11 +134,14 @@ class FileHandler(BaseHandler):
134 def get(self, filename): 134 def get(self, filename):
135 uid = self.current_user 135 uid = self.current_user
136 public_dir = self.learn.get_current_public_dir(uid) 136 public_dir = self.learn.get_current_public_dir(uid)
  137 + filepath = os.path.expanduser(os.path.join(public_dir, filename))
137 try: 138 try:
138 - with open(os.path.join(public_dir, filename), 'rb') as f:  
139 - self.write(f.read()) 139 + f = open(filepath, 'rb')
140 except FileNotFoundError: 140 except FileNotFoundError:
141 raise tornado.web.HTTPError(404) 141 raise tornado.web.HTTPError(404)
  142 + else:
  143 + self.write(f.read())
  144 + f.close()
142 145
143 # ---------------------------------------------------------------------------- 146 # ----------------------------------------------------------------------------
144 # respond to AJAX to get a JSON question 147 # respond to AJAX to get a JSON question
templates/learn.html
@@ -165,9 +165,9 @@ function updateQuestion(response){ @@ -165,9 +165,9 @@ function updateQuestion(response){
165 165
166 // enable shift+enter to submit and tab to spaces conversion 166 // enable shift+enter to submit and tab to spaces conversion
167 $("input:text, input:radio, input:checkbox").keydown(function (e) { 167 $("input:text, input:radio, input:checkbox").keydown(function (e) {
168 - if (e.keyCode == 13 && e.shiftKey) { 168 + if (e.keyCode == 13) {
169 e.preventDefault(); 169 e.preventDefault();
170 - postQuestion(); 170 + if (e.shiftKey) postQuestion();
171 return false; 171 return false;
172 } 172 }
173 }); 173 });