Commit 62e18fdcd3a42c90c072168794f3c3970abf570b

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

- fixed password change notification

BUGS.md
1 1  
2 2 # BUGS
3 3  
  4 +- generators e correct scripts que durem muito tempo podem bloquear o loop do tornado?
4 5 - detect questions in questions.yaml without ref -> error ou generate default.
5 6 - topicos virtuais nao deveriam aparecer. na construção da árvore os sucessores seriam ligados directamente aos predecessores.
6 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,7 +12,6 @@
11 12  
12 13 # TODO
13 14  
14   -- update de fontawesome para versão 5.
15 15 - reportar comentarios após submeter.
16 16 - each topic only loads a sample of K questions (max) in random order.
17 17 - servir imagens/ficheiros.
... ... @@ -31,6 +31,7 @@
31 31  
32 32 # FIXED
33 33  
  34 +- update de fontawesome para versão 5.0.6.
34 35 - remover learn.css uma vez que nao é usado em lado nenhum?
35 36 - check if user already logged in
36 37 - mover javascript para ficheiros externos e carregar com script defer src
... ...
learnapp.py
... ... @@ -267,9 +267,11 @@ class LearnApp(object):
267 267 # g.node['my/topic']['name'] name of the topic
268 268 # g.node['my/topic']['questions'] list of question refs defined in YAML
269 269 # g.node['my/topic']['factory'] dict with question factories
  270 +#
  271 +# Edges are obtained from the deps defined in the YAML file for each topic.
270 272 # ----------------------------------------------------------------------------
271 273 def build_dependency_graph(config={}):
272   - logger.info('Building topic dependency graph.')
  274 + logger.info('Building graph and loading questions:')
273 275  
274 276 # create graph
275 277 prefix = config.get('path', '.')
... ... @@ -281,18 +283,15 @@ def build_dependency_graph(config={}):
281 283 topics = config.get('topics', {})
282 284 for ref,attr in topics.items():
283 285 g.add_node(ref)
  286 + tnode = g.node[ref] # current node (topic)
  287 +
284 288 if isinstance(attr, dict):
285   - g.node[ref]['name'] = attr.get('name', ref)
286   - g.node[ref]['questions'] = attr.get('questions', [])
  289 + tnode['name'] = attr.get('name', ref)
  290 + tnode['questions'] = attr.get('questions', [])
287 291 g.add_edges_from((d,ref) for d in attr.get('deps', []))
288 292  
289   - # iterate over topics and create question factories
290   - logger.info('Loading:')
291   - for tref in g.nodes():
292   - tnode = g.node[tref] # current node (topic)
293   - fullpath = path.expanduser(path.join(prefix, tref))
  293 + fullpath = path.expanduser(path.join(prefix, ref))
294 294 filename = path.join(fullpath, 'questions.yaml')
295   -
296 295 loaded_questions = load_yaml(filename, default=[]) # list
297 296  
298 297 # if questions not in configuration then load all, preserving order
... ... @@ -303,9 +302,9 @@ def build_dependency_graph(config={}):
303 302 tnode['factory'] = {}
304 303 for q in loaded_questions:
305 304 if q['ref'] in tnode['questions']:
306   - q['path'] = fullpath
  305 + q['path'] = fullpath # fullpath added to each question
307 306 tnode['factory'][q['ref']] = QFactory(q)
308 307  
309   - logger.info(f'{len(tnode["questions"]):6} from {tref}')
  308 + logger.info(f'{len(tnode["questions"]):6} from {ref}')
310 309  
311 310 return g
... ...
static/js/maintopics.js
1 1 function notify(msg) {
2 2 $("#notifications").html(msg);
3   - $("#notifications").fadeIn(250).delay(5000).fadeOut(500);
  3 + $("#notifications").fadeIn(250).delay(3000).fadeOut(500);
4 4 }
5 5  
6 6 function getCookie(name) {
... ... @@ -9,6 +9,8 @@ function getCookie(name) {
9 9 }
10 10  
11 11 function change_password() {
  12 + // alert('hello');
  13 + // notify('hello!');
12 14 var token = getCookie('_xsrf');
13 15 $.ajax({
14 16 type: "POST",
... ...
templates/notification.html
1   -
2   -<div class="alert alert-{{ type }} alert-dismissible" role="alert" id="notification" style="position:absolute;
3   - top: 0px; right: 1em;">
4   - <!-- <i class="fa fa-check" aria-hidden="true"></i> -->
5   - <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
  1 +<div class="alert alert-{{ type }} alert-dismissible" role="alert" id="notification">
  2 + <i class="fas fa-key" aria-hidden="true"></i>
6 3 {{ msg }}
7 4 </div>
... ...