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 | BUGS: | 1 | BUGS: |
2 | 2 | ||
3 | -- servir ficheiros de public temporariamente | 3 | +- load/save the knowledge state of the student |
4 | - se students.db não existe, rebenta. | 4 | - se students.db não existe, rebenta. |
5 | - database hardcoded in LearnApp. | 5 | - database hardcoded in LearnApp. |
6 | - implementar xsrf. Ver [http://www.tornadoweb.org/en/stable/guide/security.html#cross-site-request-forgery-protection]() | 6 | - implementar xsrf. Ver [http://www.tornadoweb.org/en/stable/guide/security.html#cross-site-request-forgery-protection]() |
@@ -14,6 +14,7 @@ TODO: | @@ -14,6 +14,7 @@ TODO: | ||
14 | 14 | ||
15 | SOLVED: | 15 | SOLVED: |
16 | 16 | ||
17 | +- servir ficheiros de public temporariamente | ||
17 | - path dos generators scripts mal construido | 18 | - path dos generators scripts mal construido |
18 | - questions hardcoded in LearnApp. | 19 | - questions hardcoded in LearnApp. |
19 | - Factory para cada pergunta individual em vez de pool | 20 | - Factory para cada pergunta individual em vez de pool |
app.py
@@ -74,6 +74,12 @@ class LearnApp(object): | @@ -74,6 +74,12 @@ class LearnApp(object): | ||
74 | return self.online[uid].get('name', '') | 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 | # check answer and if correct returns new question, otherise returns None | 83 | # check answer and if correct returns new question, otherise returns None |
78 | def check_answer(self, uid, answer): | 84 | def check_answer(self, uid, answer): |
79 | logger.debug(f'check_answer("{uid}", "{answer}")') | 85 | logger.debug(f'check_answer("{uid}", "{answer}")') |
knowledge.py
@@ -21,7 +21,8 @@ class Knowledge(object): | @@ -21,7 +21,8 @@ class Knowledge(object): | ||
21 | self.state = state # {node: level, node: level, ...} | 21 | self.state = state # {node: level, node: level, ...} |
22 | self.current_question = None | 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 | def get_current_question(self): | 27 | def get_current_question(self): |
27 | return self.current_question | 28 | return self.current_question |
@@ -36,10 +37,10 @@ class Knowledge(object): | @@ -36,10 +37,10 @@ class Knowledge(object): | ||
36 | g = self.depgraph | 37 | g = self.depgraph |
37 | # choose topic, ie, node of the graph | 38 | # choose topic, ie, node of the graph |
38 | # print(g.nodes()) | 39 | # print(g.nodes()) |
39 | - topic = random.choice(g.nodes()) # FIXME | 40 | + self.topic = random.choice(g.nodes()) # FIXME |
40 | # print(topic) | 41 | # print(topic) |
41 | # choose question from that topic | 42 | # choose question from that topic |
42 | - question = random.choice(g.node[topic]['factory']) | 43 | + question = random.choice(g.node[self.topic]['factory']) |
43 | # print(question) | 44 | # print(question) |
44 | 45 | ||
45 | self.current_question = question.generate() | 46 | self.current_question = question.generate() |
serve.py
@@ -34,10 +34,11 @@ from tools import load_yaml, md | @@ -34,10 +34,11 @@ from tools import load_yaml, md | ||
34 | class WebApplication(tornado.web.Application): | 34 | class WebApplication(tornado.web.Application): |
35 | def __init__(self): | 35 | def __init__(self): |
36 | handlers = [ | 36 | handlers = [ |
37 | - (r'/', LearnHandler), | ||
38 | (r'/login', LoginHandler), | 37 | (r'/login', LoginHandler), |
39 | (r'/logout', LogoutHandler), | 38 | (r'/logout', LogoutHandler), |
40 | (r'/question', QuestionHandler), | 39 | (r'/question', QuestionHandler), |
40 | + (r'/', LearnHandler), | ||
41 | + (r'/(.+)', FileHandler), | ||
41 | ] | 42 | ] |
42 | settings = { | 43 | settings = { |
43 | 'template_path': os.path.join(os.path.dirname(__file__), 'templates'), | 44 | 'template_path': os.path.join(os.path.dirname(__file__), 'templates'), |
@@ -112,6 +113,18 @@ class LearnHandler(BaseHandler): | @@ -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 | # respond to AJAX to get a JSON question | 128 | # respond to AJAX to get a JSON question |
116 | class QuestionHandler(BaseHandler): | 129 | class QuestionHandler(BaseHandler): |
117 | templates = { | 130 | templates = { |