Commit 3d24dd0fb7fc8416ff0a151889991c16819112a1
1 parent
73e9fbcb
Exists in
master
and in
1 other branch
- configuration of logger system to support --debug
Showing
3 changed files
with
20 additions
and
51 deletions
Show diff stats
BUGS.md
| 1 | 1 | ||
| 2 | # BUGS | 2 | # BUGS |
| 3 | 3 | ||
| 4 | -- total do teste aparece negativo. | ||
| 5 | -- espaco no final das tabelas. | ||
| 6 | - qual a diferenca entre md_to_html e md_to_html_review, parece desnecessario haver dois. | 4 | - qual a diferenca entre md_to_html e md_to_html_review, parece desnecessario haver dois. |
| 7 | - servir imagens das perguntas | 5 | - servir imagens das perguntas |
| 8 | -- como alterar configuracao para mostrar logs de debug? | ||
| 9 | - hints nao funciona | 6 | - hints nao funciona |
| 10 | - uniformizar question.py com a de aprendizations... | 7 | - uniformizar question.py com a de aprendizations... |
| 11 | -- permitir eliminar teste a decorrer de modo a que o aluno possa recomeçar (e.g. noutro browser) | 8 | +- permitir eliminar teste a decorrer |
| 12 | - servidor nao esta a lidar com eventos scroll/resize. ignorar? | 9 | - servidor nao esta a lidar com eventos scroll/resize. ignorar? |
| 13 | 10 | ||
| 14 | # TODO | 11 | # TODO |
| @@ -20,6 +17,8 @@ | @@ -20,6 +17,8 @@ | ||
| 20 | npm install mathjax-node mathjax-node-cli # pacotes em ~/node_modules | 17 | npm install mathjax-node mathjax-node-cli # pacotes em ~/node_modules |
| 21 | node_modules/mathjax-node-cli/bin/tex2svg '\sqrt{x}' | 18 | node_modules/mathjax-node-cli/bin/tex2svg '\sqrt{x}' |
| 22 | usar isto para gerar svg que passa a fazer parte do texto da pergunta (markdown suporta tags svg?) | 19 | usar isto para gerar svg que passa a fazer parte do texto da pergunta (markdown suporta tags svg?) |
| 20 | + fazer funçao tex() que recebe formula e converte para svg. exemplo: | ||
| 21 | + fr'''A formula é {tex(\sqrt{x]})}''' | ||
| 23 | 22 | ||
| 24 | - Gerar pdf's com todos os testes no final (pdfkit). | 23 | - Gerar pdf's com todos os testes no final (pdfkit). |
| 25 | - manter registo dos unfocus durante o teste e de qual a pergunta visivel nesse momento | 24 | - manter registo dos unfocus durante o teste e de qual a pergunta visivel nesse momento |
| @@ -37,6 +36,9 @@ | @@ -37,6 +36,9 @@ | ||
| 37 | 36 | ||
| 38 | # FIXED | 37 | # FIXED |
| 39 | 38 | ||
| 39 | +- como alterar configuracao para mostrar logs de debug? | ||
| 40 | +- espaco no final das tabelas. | ||
| 41 | +- total do teste aparece negativo. | ||
| 40 | - reset password nao funciona no admin | 42 | - reset password nao funciona no admin |
| 41 | - reload a intervalos não funciona. | 43 | - reload a intervalos não funciona. |
| 42 | - allow/deny nao funciona no /admin. | 44 | - allow/deny nao funciona no /admin. |
config/server.conf
| @@ -1,21 +0,0 @@ | @@ -1,21 +0,0 @@ | ||
| 1 | -# -*- coding: utf-8 -*- | ||
| 2 | - | ||
| 3 | -[global] | ||
| 4 | -environment= 'production' | ||
| 5 | - | ||
| 6 | -; number of threads running | ||
| 7 | -server.thread_pool= 10 | ||
| 8 | - | ||
| 9 | -; Host address and port | ||
| 10 | -; set socket_port = 443 if SSL is enabled below, 8080 otherwise | ||
| 11 | -; if port is 443 then the server should be run as root. SSL also works on 8080. | ||
| 12 | -server.socket_host = '0.0.0.0' | ||
| 13 | -server.socket_port = 8080 | ||
| 14 | - | ||
| 15 | -; Uncomment to enable SSL (ssl_module = 'builtin' or 'pyopenssl') | ||
| 16 | -; server.ssl_module = 'builtin' | ||
| 17 | -; server.ssl_certificate = 'certs/webserver.crt' | ||
| 18 | -; server.ssl_private_key = 'certs/webserver.key' | ||
| 19 | - | ||
| 20 | -; not required for snakeoil: | ||
| 21 | -; server.ssl_certificate_chain = 'ca_certs.crt' |
serve.py
| @@ -59,6 +59,7 @@ class BaseHandler(tornado.web.RequestHandler): | @@ -59,6 +59,7 @@ class BaseHandler(tornado.web.RequestHandler): | ||
| 59 | if cookie: | 59 | if cookie: |
| 60 | return cookie.decode('utf-8') | 60 | return cookie.decode('utf-8') |
| 61 | 61 | ||
| 62 | + | ||
| 62 | # ------------------------------------------------------------------------- | 63 | # ------------------------------------------------------------------------- |
| 63 | # /login and /logout | 64 | # /login and /logout |
| 64 | # ------------------------------------------------------------------------- | 65 | # ------------------------------------------------------------------------- |
| @@ -75,7 +76,9 @@ class LoginHandler(BaseHandler): | @@ -75,7 +76,9 @@ class LoginHandler(BaseHandler): | ||
| 75 | self.set_secure_cookie("user", str(uid), expires_days=30) | 76 | self.set_secure_cookie("user", str(uid), expires_days=30) |
| 76 | self.redirect(self.get_argument("next", "/")) | 77 | self.redirect(self.get_argument("next", "/")) |
| 77 | else: | 78 | else: |
| 78 | - self.render("login.html", error='Não autorizado ou número/senha inválido') | 79 | + self.render("login.html", |
| 80 | + error='Não autorizado ou número/senha inválido') | ||
| 81 | + | ||
| 79 | 82 | ||
| 80 | # ------------------------------------------------------------------------- | 83 | # ------------------------------------------------------------------------- |
| 81 | class LogoutHandler(BaseHandler): | 84 | class LogoutHandler(BaseHandler): |
| @@ -85,6 +88,7 @@ class LogoutHandler(BaseHandler): | @@ -85,6 +88,7 @@ class LogoutHandler(BaseHandler): | ||
| 85 | self.clear_cookie('user') | 88 | self.clear_cookie('user') |
| 86 | self.redirect('/') | 89 | self.redirect('/') |
| 87 | 90 | ||
| 91 | + | ||
| 88 | # ------------------------------------------------------------------------- | 92 | # ------------------------------------------------------------------------- |
| 89 | # FIXME checkit | 93 | # FIXME checkit |
| 90 | class FileHandler(BaseHandler): | 94 | class FileHandler(BaseHandler): |
| @@ -101,6 +105,7 @@ class FileHandler(BaseHandler): | @@ -101,6 +105,7 @@ class FileHandler(BaseHandler): | ||
| 101 | self.write(f.read()) | 105 | self.write(f.read()) |
| 102 | f.close() | 106 | f.close() |
| 103 | 107 | ||
| 108 | + | ||
| 104 | # ------------------------------------------------------------------------- | 109 | # ------------------------------------------------------------------------- |
| 105 | # FIXME images missing, needs testing | 110 | # FIXME images missing, needs testing |
| 106 | # ------------------------------------------------------------------------- | 111 | # ------------------------------------------------------------------------- |
| @@ -128,7 +133,6 @@ class TestHandler(BaseHandler): | @@ -128,7 +133,6 @@ class TestHandler(BaseHandler): | ||
| 128 | t = self.testapp.get_test(uid) or self.testapp.generate_test(uid) | 133 | t = self.testapp.get_test(uid) or self.testapp.generate_test(uid) |
| 129 | self.render('test.html', t=t, md=md_to_html, templ=self.templates) | 134 | self.render('test.html', t=t, md=md_to_html, templ=self.templates) |
| 130 | 135 | ||
| 131 | - | ||
| 132 | # POST | 136 | # POST |
| 133 | @tornado.web.authenticated | 137 | @tornado.web.authenticated |
| 134 | def post(self): | 138 | def post(self): |
| @@ -150,7 +154,8 @@ class TestHandler(BaseHandler): | @@ -150,7 +154,8 @@ class TestHandler(BaseHandler): | ||
| 150 | ans[i] = None | 154 | ans[i] = None |
| 151 | else: | 155 | else: |
| 152 | ans[i] = ans[i][0] | 156 | ans[i] = ans[i][0] |
| 153 | - elif q['type'] in ('text', 'text-regex', 'textarea', 'numeric-interval'): | 157 | + elif q['type'] in ('text', 'text-regex', 'textarea', |
| 158 | + 'numeric-interval'): | ||
| 154 | ans[i] = ans[i][0] | 159 | ans[i] = ans[i][0] |
| 155 | 160 | ||
| 156 | self.testapp.correct_test(uid, ans) | 161 | self.testapp.correct_test(uid, ans) |
| @@ -235,9 +240,8 @@ class RootHandler(BaseHandler): | @@ -235,9 +240,8 @@ class RootHandler(BaseHandler): | ||
| 235 | self.redirect('/test') | 240 | self.redirect('/test') |
| 236 | 241 | ||
| 237 | 242 | ||
| 238 | -# ---------------------------------------------------------------------------- | 243 | +# ------------------------------------------------------------------------- |
| 239 | class AdminHandler(BaseHandler): | 244 | class AdminHandler(BaseHandler): |
| 240 | - | ||
| 241 | @tornado.web.authenticated | 245 | @tornado.web.authenticated |
| 242 | def get(self): | 246 | def get(self): |
| 243 | if self.current_user != '0': | 247 | if self.current_user != '0': |
| @@ -264,7 +268,6 @@ class AdminHandler(BaseHandler): | @@ -264,7 +268,6 @@ class AdminHandler(BaseHandler): | ||
| 264 | else: | 268 | else: |
| 265 | self.render('admin.html') | 269 | self.render('admin.html') |
| 266 | 270 | ||
| 267 | - | ||
| 268 | @tornado.web.authenticated | 271 | @tornado.web.authenticated |
| 269 | def post(self): | 272 | def post(self): |
| 270 | if self.current_user != '0': | 273 | if self.current_user != '0': |
| @@ -290,28 +293,10 @@ class AdminHandler(BaseHandler): | @@ -290,28 +293,10 @@ class AdminHandler(BaseHandler): | ||
| 290 | logging.error(f'Unknown command in post: "{cmd}"') | 293 | logging.error(f'Unknown command in post: "{cmd}"') |
| 291 | 294 | ||
| 292 | 295 | ||
| 293 | - | ||
| 294 | -# # ============================================================================ | ||
| 295 | -# # Student webservice | ||
| 296 | -# # ============================================================================ | ||
| 297 | -# class StudentWebService(object): | ||
| 298 | - | ||
| 299 | -# @cherrypy.tools.accept(media='application/json') # FIXME | ||
| 300 | -# def POST(self, **args): | ||
| 301 | -# # uid = cherrypy.session.get(SESSION_KEY) | ||
| 302 | -# if args['cmd'] == 'focus': | ||
| 303 | -# v = json.loads(args['value']) | ||
| 304 | -# self.app.set_student_focus(uid=args['number'], value=v) | ||
| 305 | - | ||
| 306 | - | ||
| 307 | - | ||
| 308 | # ------------------------------------------------------------------------- | 296 | # ------------------------------------------------------------------------- |
| 309 | # Tornado web server | 297 | # Tornado web server |
| 310 | # ------------------------------------------------------------------------- | 298 | # ------------------------------------------------------------------------- |
| 311 | def main(): | 299 | def main(): |
| 312 | - SERVER_PATH = path.dirname(path.realpath(__file__)) | ||
| 313 | - LOGGER_CONF = path.join(SERVER_PATH, 'config/logger.yaml') | ||
| 314 | - | ||
| 315 | # --- Commandline argument parsing | 300 | # --- Commandline argument parsing |
| 316 | argparser = argparse.ArgumentParser(description='Server for online tests. Enrolled students and tests have to be previously configured. Please read the documentation included with this software before running the server.') | 301 | argparser = argparse.ArgumentParser(description='Server for online tests. Enrolled students and tests have to be previously configured. Please read the documentation included with this software before running the server.') |
| 317 | argparser.add_argument('--debug', action='store_true', | 302 | argparser.add_argument('--debug', action='store_true', |
| @@ -321,6 +306,10 @@ def main(): | @@ -321,6 +306,10 @@ def main(): | ||
| 321 | arg = argparser.parse_args() | 306 | arg = argparser.parse_args() |
| 322 | 307 | ||
| 323 | # --- Setup logging | 308 | # --- Setup logging |
| 309 | + logger_file = 'logger-debug.yaml' if arg.debug else 'logger.yaml' | ||
| 310 | + SERVER_PATH = path.dirname(path.realpath(__file__)) | ||
| 311 | + LOGGER_CONF = path.join(SERVER_PATH, f'config/{logger_file}') | ||
| 312 | + | ||
| 324 | try: | 313 | try: |
| 325 | logging.config.dictConfig(load_yaml(LOGGER_CONF)) | 314 | logging.config.dictConfig(load_yaml(LOGGER_CONF)) |
| 326 | except: | 315 | except: |
| @@ -349,7 +338,7 @@ def main(): | @@ -349,7 +338,7 @@ def main(): | ||
| 349 | ssl_options={ | 338 | ssl_options={ |
| 350 | "certfile": "certs/cert.crt", | 339 | "certfile": "certs/cert.crt", |
| 351 | "keyfile": "certs/cert.key" | 340 | "keyfile": "certs/cert.key" |
| 352 | - }) | 341 | + }) |
| 353 | http_server.listen(8443) | 342 | http_server.listen(8443) |
| 354 | 343 | ||
| 355 | # --- run webserver | 344 | # --- run webserver |
| @@ -365,4 +354,3 @@ def main(): | @@ -365,4 +354,3 @@ def main(): | ||
| 365 | # ------------------------------------------------------------------------- | 354 | # ------------------------------------------------------------------------- |
| 366 | if __name__ == "__main__": | 355 | if __name__ == "__main__": |
| 367 | main() | 356 | main() |
| 368 | - |