Commit df6c6afa866d530a287c8de750dc1c6042ff17c6
1 parent
fcdedf5a
Exists in
master
and in
1 other branch
- serves files in /public
Showing
5 changed files
with
34 additions
and
7 deletions
Show diff stats
BUGS.md
1 | 1 | BUGS: |
2 | 2 | |
3 | -- servir ficheiros de public temporariamente | |
3 | +- load/save the knowledge state of the student | |
4 | 4 | - se students.db não existe, rebenta. |
5 | 5 | - database hardcoded in LearnApp. |
6 | 6 | - implementar xsrf. Ver [http://www.tornadoweb.org/en/stable/guide/security.html#cross-site-request-forgery-protection]() |
... | ... | @@ -14,6 +14,7 @@ TODO: |
14 | 14 | |
15 | 15 | SOLVED: |
16 | 16 | |
17 | +- servir ficheiros de public temporariamente | |
17 | 18 | - path dos generators scripts mal construido |
18 | 19 | - questions hardcoded in LearnApp. |
19 | 20 | - Factory para cada pergunta individual em vez de pool | ... | ... |
app.py
... | ... | @@ -74,6 +74,12 @@ class LearnApp(object): |
74 | 74 | return self.online[uid].get('name', '') |
75 | 75 | |
76 | 76 | # ------------------------------------------------------------------------ |
77 | + def get_current_public_dir(self, uid): | |
78 | + topic = self.online[uid]['state'].topic | |
79 | + p = self.depgraph.graph['path'] | |
80 | + return path.join(p, topic, 'public') | |
81 | + | |
82 | + # ------------------------------------------------------------------------ | |
77 | 83 | # check answer and if correct returns new question, otherise returns None |
78 | 84 | def check_answer(self, uid, answer): |
79 | 85 | logger.debug(f'check_answer("{uid}", "{answer}")') | ... | ... |
knowledge.py
... | ... | @@ -21,7 +21,8 @@ class Knowledge(object): |
21 | 21 | self.state = state # {node: level, node: level, ...} |
22 | 22 | self.current_question = None |
23 | 23 | |
24 | - # self.seq = nx.topological_sort(self.depgraph) | |
24 | + self.seq = nx.topological_sort(self.depgraph) | |
25 | + self.topic = None | |
25 | 26 | |
26 | 27 | def get_current_question(self): |
27 | 28 | return self.current_question |
... | ... | @@ -36,10 +37,10 @@ class Knowledge(object): |
36 | 37 | g = self.depgraph |
37 | 38 | # choose topic, ie, node of the graph |
38 | 39 | # print(g.nodes()) |
39 | - topic = random.choice(g.nodes()) # FIXME | |
40 | + self.topic = random.choice(g.nodes()) # FIXME | |
40 | 41 | # print(topic) |
41 | 42 | # choose question from that topic |
42 | - question = random.choice(g.node[topic]['factory']) | |
43 | + question = random.choice(g.node[self.topic]['factory']) | |
43 | 44 | # print(question) |
44 | 45 | |
45 | 46 | self.current_question = question.generate() | ... | ... |
serve.py
... | ... | @@ -34,10 +34,11 @@ from tools import load_yaml, md |
34 | 34 | class WebApplication(tornado.web.Application): |
35 | 35 | def __init__(self): |
36 | 36 | handlers = [ |
37 | - (r'/', LearnHandler), | |
38 | 37 | (r'/login', LoginHandler), |
39 | 38 | (r'/logout', LogoutHandler), |
40 | 39 | (r'/question', QuestionHandler), |
40 | + (r'/', LearnHandler), | |
41 | + (r'/(.+)', FileHandler), | |
41 | 42 | ] |
42 | 43 | settings = { |
43 | 44 | 'template_path': os.path.join(os.path.dirname(__file__), 'templates'), |
... | ... | @@ -112,6 +113,18 @@ class LearnHandler(BaseHandler): |
112 | 113 | ) |
113 | 114 | |
114 | 115 | # ---------------------------------------------------------------------------- |
116 | +class FileHandler(BaseHandler): | |
117 | + @tornado.web.authenticated | |
118 | + def get(self, filename): | |
119 | + uid = self.current_user | |
120 | + public_dir = self.learn.get_current_public_dir(uid) | |
121 | + try: | |
122 | + with open(os.path.join(public_dir, filename), 'rb') as f: | |
123 | + self.write(f.read()) | |
124 | + except FileNotFoundError: | |
125 | + raise tornado.web.HTTPError(404) | |
126 | + | |
127 | +# ---------------------------------------------------------------------------- | |
115 | 128 | # respond to AJAX to get a JSON question |
116 | 129 | class QuestionHandler(BaseHandler): |
117 | 130 | templates = { | ... | ... |