Commit 92211444cd4eb3f4ac9fa4d943f5b802430684fe

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

minor updates

updates js libs versions
adds new bug reports in BUGS.md
1 1
2 # BUGS 2 # BUGS
3 3
  4 +- ensure pip nao funciona no ubuntu?...
  5 +- acrescentar logger.conf que sirva de base.
  6 +- exception sqlalchemy relacionada com threads.
  7 +- quando se clica no texto de uma opcao, salta para outro lado na pagina.
  8 +- ordenacao das notas em /admin nao é numerica, é ascii...
  9 +- mensagems de erro do assembler aparecem na mesma linha na correcao e nao fazerm rendering do `$t`, ver se servidor faz parse do markdown dessas mensagens.
4 - impedir os eventos copy/paste. alunos usam isso para trazer codigo ja feito nos computadores. Obrigar a fazer reset? fazer um copy automaticamente? 10 - impedir os eventos copy/paste. alunos usam isso para trazer codigo ja feito nos computadores. Obrigar a fazer reset? fazer um copy automaticamente?
5 - a revisao do teste não mostra as imagens. 11 - a revisao do teste não mostra as imagens.
6 - melhorar o botao de autorizar (desliga-se), usar antes um botao? 12 - melhorar o botao de autorizar (desliga-se), usar antes um botao?
demo/questions/questions-tutorial.yaml
@@ -280,7 +280,7 @@ @@ -280,7 +280,7 @@
280 ``` 280 ```
281 281
282 Neste exemplo a expressão regular é `(VERDE|[Vv]erde)`. 282 Neste exemplo a expressão regular é `(VERDE|[Vv]erde)`.
283 - correct: !regex '(VERDE|[Vv]erde)' 283 + correct: '(VERDE|[Vv]erde)'
284 284
285 285
286 # --------------------------------------------------------------------------- 286 # ---------------------------------------------------------------------------
package-lock.json
@@ -3,19 +3,19 @@ @@ -3,19 +3,19 @@
3 "lockfileVersion": 1, 3 "lockfileVersion": 1,
4 "dependencies": { 4 "dependencies": {
5 "@fortawesome/fontawesome-free": { 5 "@fortawesome/fontawesome-free": {
6 - "version": "5.7.1",  
7 - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.7.1.tgz",  
8 - "integrity": "sha512-gukWJ7Mwf0WXQbkcwcm5zi8+H8aT5MMnphf5hpydOw898H1ibgm2cyejHgk6Km/FTvrPp5ppUHLrlFwt0QxsQw==" 6 + "version": "5.8.1",
  7 + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.8.1.tgz",
  8 + "integrity": "sha512-GJtx6e55qLEOy2gPOsok2lohjpdWNGrYGtQx0FFT/++K4SYx+Z8LlPHdQBaFzKEwH5IbBB4fNgb//uyZjgYXoA=="
9 }, 9 },
10 "bootstrap": { 10 "bootstrap": {
11 - "version": "4.3.0",  
12 - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.3.0.tgz",  
13 - "integrity": "sha512-M0vqY0Z6UDweV2nLFl5dXcb+GIo53EBCGMMVxCGH5vJxl/jsr+HkULBMd4kn9rdpdBZwd3BduCgMOYOwJybo4Q==" 11 + "version": "4.3.1",
  12 + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.3.1.tgz",
  13 + "integrity": "sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag=="
14 }, 14 },
15 "codemirror": { 15 "codemirror": {
16 - "version": "5.43.0",  
17 - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.43.0.tgz",  
18 - "integrity": "sha512-mljwQWUaWIf85I7QwTBryF2ASaIvmYAL4s5UCanCJFfKeXOKhrqdHWdHiZWAMNT+hjLTCnVx2S/SYTORIgxsgA==" 16 + "version": "5.45.0",
  17 + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.45.0.tgz",
  18 + "integrity": "sha512-c19j644usCE8gQaXa0jqn2B/HN9MnB2u6qPIrrhrMkB+QAP42y8G4QnTwuwbVSoUS1jEl7JU9HZMGhCDL0nsAw=="
19 }, 19 },
20 "datatables": { 20 "datatables": {
21 "version": "1.10.18", 21 "version": "1.10.18",
@@ -36,9 +36,9 @@ @@ -36,9 +36,9 @@
36 "integrity": "sha512-OzsJNitEHAJB3y4IIlPCAvS0yoXwYjlo2Y4kmm9KQzyIBZt2d8yKRalby3uTRNN4fZQiGL2iMXjpdP1u2Rq2DQ==" 36 "integrity": "sha512-OzsJNitEHAJB3y4IIlPCAvS0yoXwYjlo2Y4kmm9KQzyIBZt2d8yKRalby3uTRNN4fZQiGL2iMXjpdP1u2Rq2DQ=="
37 }, 37 },
38 "popper.js": { 38 "popper.js": {
39 - "version": "1.14.7",  
40 - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.14.7.tgz",  
41 - "integrity": "sha512-4q1hNvoUre/8srWsH7hnoSJ5xVmIL4qgz+s4qf2TnJIMyZFUFMGH+9vE7mXynAlHSZ/NdTmmow86muD0myUkVQ==" 39 + "version": "1.15.0",
  40 + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.15.0.tgz",
  41 + "integrity": "sha512-w010cY1oCUmI+9KwwlWki+r5jxKfTFDVoadl7MSrIujHU5MJ5OR6HTDj6Xo8aoR/QsA56x8jKjA59qGH4ELtrA=="
42 } 42 }
43 } 43 }
44 } 44 }
@@ -2,12 +2,12 @@ @@ -2,12 +2,12 @@
2 "description": "Javascript libraries required to run the server", 2 "description": "Javascript libraries required to run the server",
3 "email": "mjsb@uevora.pt", 3 "email": "mjsb@uevora.pt",
4 "dependencies": { 4 "dependencies": {
5 - "@fortawesome/fontawesome-free": "^5.7.1",  
6 - "bootstrap": "^4.3.0",  
7 - "codemirror": "^5.43.0", 5 + "@fortawesome/fontawesome-free": "^5.8.1",
  6 + "bootstrap": "^4.3.1",
  7 + "codemirror": "^5.45.0",
8 "datatables": "^1.10.18", 8 "datatables": "^1.10.18",
9 "jquery": "^3.3.1", 9 "jquery": "^3.3.1",
10 "mathjax": "^2.7.5", 10 "mathjax": "^2.7.5",
11 - "popper.js": "^1.14.7" 11 + "popper.js": "^1.15.0"
12 } 12 }
13 } 13 }
perguntations/app.py
@@ -54,8 +54,8 @@ class App(object): @@ -54,8 +54,8 @@ class App(object):
54 yield session 54 yield session
55 session.commit() 55 session.commit()
56 except Exception: 56 except Exception:
57 - session.rollback()  
58 logger.error('DB rollback!!!') 57 logger.error('DB rollback!!!')
  58 + session.rollback()
59 finally: 59 finally:
60 session.close() 60 session.close()
61 61
@@ -262,7 +262,11 @@ class App(object): @@ -262,7 +262,11 @@ class App(object):
262 'start_time': self.online.get(uid, {}).get('test', {}) 262 'start_time': self.online.get(uid, {}).get('test', {})
263 .get('start_time', ''), 263 .get('start_time', ''),
264 'password_defined': pw != '', 264 'password_defined': pw != '',
265 - 'grades': self.get_student_grades_from_test(uid, self.testfactory['ref']), 265 + 'grades': self.get_student_grades_from_test(
  266 + uid,
  267 + self.testfactory['ref']
  268 + ),
  269 +
266 # 'focus': self.online.get(uid, {}).get('student', {}).get('focus', True), # FIXME 270 # 'focus': self.online.get(uid, {}).get('student', {}).get('focus', True), # FIXME
267 } for uid, name, pw in self.get_all_students()] 271 } for uid, name, pw in self.get_all_students()]
268 272
perguntations/serve.py
@@ -85,8 +85,6 @@ class BaseHandler(tornado.web.RequestHandler): @@ -85,8 +85,6 @@ class BaseHandler(tornado.web.RequestHandler):
85 # /login 85 # /login
86 # ---------------------------------------------------------------------------- 86 # ----------------------------------------------------------------------------
87 class LoginHandler(BaseHandler): 87 class LoginHandler(BaseHandler):
88 - SUPPORTED_METHODS = ['GET', 'POST']  
89 -  
90 def get(self): 88 def get(self):
91 self.render('login.html', error='') 89 self.render('login.html', error='')
92 90
@@ -132,8 +130,6 @@ class RootHandler(BaseHandler): @@ -132,8 +130,6 @@ class RootHandler(BaseHandler):
132 # Serves files from the /public subdir of the topics. 130 # Serves files from the /public subdir of the topics.
133 # ---------------------------------------------------------------------------- 131 # ----------------------------------------------------------------------------
134 class FileHandler(BaseHandler): 132 class FileHandler(BaseHandler):
135 - SUPPORTED_METHODS = ['GET']  
136 -  
137 @tornado.web.authenticated 133 @tornado.web.authenticated
138 async def get(self): 134 async def get(self):
139 uid = self.current_user 135 uid = self.current_user
@@ -175,8 +171,6 @@ class FileHandler(BaseHandler): @@ -175,8 +171,6 @@ class FileHandler(BaseHandler):
175 # Test shown to students 171 # Test shown to students
176 # ------------------------------------------------------------------------- 172 # -------------------------------------------------------------------------
177 class TestHandler(BaseHandler): 173 class TestHandler(BaseHandler):
178 - SUPPORTED_METHODS = ['GET', 'POST']  
179 -  
180 _templates = { 174 _templates = {
181 'radio': 'question-radio.html', 175 'radio': 'question-radio.html',
182 'checkbox': 'question-checkbox.html', 176 'checkbox': 'question-checkbox.html',
@@ -229,7 +223,9 @@ class TestHandler(BaseHandler): @@ -229,7 +223,9 @@ class TestHandler(BaseHandler):
229 223
230 self.testapp.logout(uid) 224 self.testapp.logout(uid)
231 self.clear_cookie('user') 225 self.clear_cookie('user')
232 - self.render('grade.html', t=t, allgrades=self.testapp.get_student_grades_from_all_tests(uid)) 226 +
  227 + allgrades = self.testapp.get_student_grades_from_all_tests(uid)
  228 + self.render('grade.html', t=t, allgrades=allgrades)
233 229
234 230
235 # ------------------------------------------------------------------------- 231 # -------------------------------------------------------------------------
@@ -382,7 +378,7 @@ def get_logger_config(debug=False): @@ -382,7 +378,7 @@ def get_logger_config(debug=False):
382 'version': 1, 378 'version': 1,
383 'formatters': { 379 'formatters': {
384 'standard': { 380 'standard': {
385 - 'format': '%(asctime)s %(name)-22s %(levelname)-8s %(message)s', 381 + 'format': '%(asctime)s %(levelname)-8s %(message)s',
386 'datefmt': '%H:%M', 382 'datefmt': '%H:%M',
387 }, 383 },
388 }, 384 },
@@ -419,8 +415,7 @@ def main(): @@ -419,8 +415,7 @@ def main():
419 args = parse_cmdline_arguments() 415 args = parse_cmdline_arguments()
420 416
421 # --- Setup logging 417 # --- Setup logging
422 - logger_config = get_logger_config(args.debug)  
423 - logging.config.dictConfig(logger_config) 418 + logging.config.dictConfig(get_logger_config(args.debug))
424 logging.info('====================== Start Logging ======================') 419 logging.info('====================== Start Logging ======================')
425 420
426 # --- start application 421 # --- start application
@@ -430,7 +425,7 @@ def main(): @@ -430,7 +425,7 @@ def main():
430 'allow_all': args.allow_all, 425 'allow_all': args.allow_all,
431 'show_ref': args.show_ref, 426 'show_ref': args.show_ref,
432 'review': args.review, 427 'review': args.review,
433 - } 428 + }
434 429
435 try: 430 try:
436 testapp = App(config) 431 testapp = App(config)
perguntations/templates/login.html
@@ -20,22 +20,22 @@ @@ -20,22 +20,22 @@
20 <!-- =================================================================== --> 20 <!-- =================================================================== -->
21 <body> 21 <body>
22 <div class="container-fluid"> 22 <div class="container-fluid">
23 - <div class="card bg-light border-secondary mb-3"> 23 + <div class="card bg-light border-secondary mt-3">
24 <div class="card-body"> 24 <div class="card-body">
25 <div class="row"> 25 <div class="row">
26 26
27 - <div class="col-sm-4">  
28 - <img src="/static/logo_horizontal_login.png" class="img-responsive" width="60%" alt="Universidade de Évora"> 27 + <div class="col-sm-9">
  28 + <img src="/static/logo_horizontal_login.png" class="img-responsive mb-3" width="50%" alt="Universidade de Évora">
29 </div> 29 </div>
30 30
31 - <div class="col-sm-8"> 31 + <div class="col-sm-3">
32 <h4>Identificação:</h4> 32 <h4>Identificação:</h4>
33 33
34 <form method="post" action="/login" class="form-signin"> 34 <form method="post" action="/login" class="form-signin">
35 {% module xsrf_form_html() %} 35 {% module xsrf_form_html() %}
36 <div class="form-group"> 36 <div class="form-group">
37 - <input type="text" name="uid" class="form-control" placeholder="Número" required autofocus>  
38 - <input type="password" name="pw" class="form-control" placeholder="Password" required> 37 + <input type="text" name="uid" class="form-control mb-3" placeholder="Número" required autofocus>
  38 + <input type="password" name="pw" class="form-control mb-3" placeholder="Password" required>
39 <p> {{ error }} </p> 39 <p> {{ error }} </p>
40 </div> 40 </div>
41 <button class="btn btn-primary" type="submit"> 41 <button class="btn btn-primary" type="submit">