Commit 008f89672e0e3850a825f65eb583bff208f94420

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

- check all questions before aborting.

1 1
2 # BUGS 2 # BUGS
3 3
4 -- abortar depois de testar todas as perguntas, caso haja algum erro.  
5 -- choose: n em perguntas checkbox  
6 - se aluno tem teste activo e é allowed uma segunda vez, deve manter o mesmo teste. adicionar opcao para eliminar um teste em curso. 4 - se aluno tem teste activo e é allowed uma segunda vez, deve manter o mesmo teste. adicionar opcao para eliminar um teste em curso.
7 - melhorar o botao de autorizar (desliga-se), usar antes um botao? 5 - melhorar o botao de autorizar (desliga-se), usar antes um botao?
8 e.g. retornar None quando nao ha alteracoes relativamente à última vez. 6 e.g. retornar None quando nao ha alteracoes relativamente à última vez.
@@ -11,7 +9,6 @@ ou usar push (websockets?) @@ -11,7 +9,6 @@ ou usar push (websockets?)
11 - pymips: nao pode executar syscalls do spim. 9 - pymips: nao pode executar syscalls do spim.
12 - perguntas checkbox [right,wrong] com pelo menos uma opção correcta. 10 - perguntas checkbox [right,wrong] com pelo menos uma opção correcta.
13 - questions.py textarea has a abspath which does not make sense! why is it there? not working for perguntations, but seems to work for aprendizations 11 - questions.py textarea has a abspath which does not make sense! why is it there? not working for perguntations, but seems to work for aprendizations
14 -- initdb está a inicializar com passwords iguais aos numeros. deveria ser vazio para alunos definirem.  
15 - servir imagens das perguntas não funciona. Necessario passar a ref da pergunta no link para poder ajustar o path no FileHandler. Tem o problema do teste em JSON não conter a imagem. 12 - servir imagens das perguntas não funciona. Necessario passar a ref da pergunta no link para poder ajustar o path no FileHandler. Tem o problema do teste em JSON não conter a imagem.
16 - o eventloop está a bloquear. correção do teste é blocking. usar threadpoolexecutor? 13 - o eventloop está a bloquear. correção do teste é blocking. usar threadpoolexecutor?
17 - submissao faz um post ajax. 14 - submissao faz um post ajax.
@@ -22,9 +19,7 @@ ou usar push (websockets?) @@ -22,9 +19,7 @@ ou usar push (websockets?)
22 19
23 - gerar teste qd o prof autoriza. 20 - gerar teste qd o prof autoriza.
24 - enviar resposta de cada pergunta individualmente. 21 - enviar resposta de cada pergunta individualmente.
25 -  
26 - experimentar gerador de svg que inclua no markdown da pergunta e ver se funciona. 22 - experimentar gerador de svg que inclua no markdown da pergunta e ver se funciona.
27 -- imagens jpg/png nas perguntas.  
28 - suportar cotacao to teste diferente de 20 (e.g. para juntar perguntas em papel). opcao "points: 18" que normaliza total para 18 em vez de 20. 23 - suportar cotacao to teste diferente de 20 (e.g. para juntar perguntas em papel). opcao "points: 18" que normaliza total para 18 em vez de 20.
29 - quando ha varias perguntas para escolher, escolher sucessivamente em vez de aleatoriamente. 24 - quando ha varias perguntas para escolher, escolher sucessivamente em vez de aleatoriamente.
30 - como refrescar a tabela de admin sem fazer reload da pagina? 25 - como refrescar a tabela de admin sem fazer reload da pagina?
@@ -33,7 +28,7 @@ ou usar push (websockets?) @@ -33,7 +28,7 @@ ou usar push (websockets?)
33 - test: Cada pergunta respondida é logo submetida. 28 - test: Cada pergunta respondida é logo submetida.
34 - test: calculadora javascript. 29 - test: calculadora javascript.
35 - admin: histograma das notas. 30 - admin: histograma das notas.
36 -- admin: gerar os testes no momento em que são autorizados, e não no login. 31 +- admin: gerar os testes no momento em que são autorizados, e não no login. <- se prof autoriza aluno que já esta a realizar teste pode fazer reset e destruir teste???
37 - admin: mostrar as horas a que o teste terminou para os testes terminados. 32 - admin: mostrar as horas a que o teste terminou para os testes terminados.
38 - admin: histograma das notas. 33 - admin: histograma das notas.
39 - admin: mostrar teste gerado para aluno (tipo review). 34 - admin: mostrar teste gerado para aluno (tipo review).
@@ -51,7 +46,6 @@ ou usar push (websockets?) @@ -51,7 +46,6 @@ ou usar push (websockets?)
51 usar isto para gerar svg que passa a fazer parte do texto da pergunta (markdown suporta tags svg?) 46 usar isto para gerar svg que passa a fazer parte do texto da pergunta (markdown suporta tags svg?)
52 fazer funçao tex() que recebe formula e converte para svg. exemplo: 47 fazer funçao tex() que recebe formula e converte para svg. exemplo:
53 fr'''A formula é {tex("\sqrt{x]}")}''' 48 fr'''A formula é {tex("\sqrt{x]}")}'''
54 -  
55 - Gerar pdf's com todos os testes no final (pdfkit). 49 - Gerar pdf's com todos os testes no final (pdfkit).
56 - manter registo dos unfocus durante o teste e de qual a pergunta visivel nesse momento 50 - manter registo dos unfocus durante o teste e de qual a pergunta visivel nesse momento
57 - permitir varios testes, aluno escolhe qual o teste que quer fazer. 51 - permitir varios testes, aluno escolhe qual o teste que quer fazer.
@@ -68,6 +62,9 @@ ou usar push (websockets?) @@ -68,6 +62,9 @@ ou usar push (websockets?)
68 62
69 # FIXED 63 # FIXED
70 64
  65 +- abortar depois de testar todas as perguntas, caso haja algum erro.
  66 +- imagens jpg/png nas perguntas.
  67 +- initdb está a inicializar com passwords iguais aos numeros. deveria ser vazio para alunos definirem.
71 - upgrade popper e fazer link. 68 - upgrade popper e fazer link.
72 - mover scripts js para head, com defer. ver todos os templates. 69 - mover scripts js para head, com defer. ver todos os templates.
73 - update fontawesome to 5. 70 - update fontawesome to 5.
demo/questions/questions-tutorial.yaml
@@ -59,6 +59,7 @@ @@ -59,6 +59,7 @@
59 O mesmo teste pode ser realizado várias vezes em vários turnos, não é necessário alterar nada. 59 O mesmo teste pode ser realizado várias vezes em vários turnos, não é necessário alterar nada.
60 60
61 61
  62 +# ----------------------------------------------------------------------------
62 - type: information 63 - type: information
63 ref: tut-questions 64 ref: tut-questions
64 title: Especificação das perguntas 65 title: Especificação das perguntas
@@ -138,6 +139,8 @@ @@ -138,6 +139,8 @@
138 correct: [1, 1, 0, 0, 0] 139 correct: [1, 1, 0, 0, 0]
139 choose: 3 140 choose: 3
140 shuffle: True 141 shuffle: True
  142 +
  143 +
141 # ---------------------------------------------------------------------------- 144 # ----------------------------------------------------------------------------
142 - type: checkbox 145 - type: checkbox
143 ref: tut-checkbox 146 ref: tut-checkbox
@@ -185,7 +188,10 @@ @@ -185,7 +188,10 @@
185 - Opção 2 (não) 188 - Opção 2 (não)
186 - Opção 3 (sim) 189 - Opção 3 (sim)
187 correct: [1, -1, -1, 1] 190 correct: [1, -1, -1, 1]
  191 + choose: 3
188 shuffle: True 192 shuffle: True
  193 +
  194 +
189 # ---------------------------------------------------------------------------- 195 # ----------------------------------------------------------------------------
190 - type: text 196 - type: text
191 ref: tut-text 197 ref: tut-text
@@ -204,6 +210,8 @@ @@ -204,6 +210,8 @@
204 210
205 Neste exemplo a resposta correcta é `azul`, `Azul` ou `AZUL`. 211 Neste exemplo a resposta correcta é `azul`, `Azul` ou `AZUL`.
206 correct: ['azul', 'Azul', 'AZUL'] 212 correct: ['azul', 'Azul', 'AZUL']
  213 +
  214 +
207 # --------------------------------------------------------------------------- 215 # ---------------------------------------------------------------------------
208 - type: text-regex 216 - type: text-regex
209 ref: tut-text-regex 217 ref: tut-text-regex
@@ -222,6 +230,8 @@ @@ -222,6 +230,8 @@
222 230
223 Neste exemplo a expressão regular é `(VERDE|[Vv]erde)`. 231 Neste exemplo a expressão regular é `(VERDE|[Vv]erde)`.
224 correct: !regex '(VERDE|[Vv]erde)' 232 correct: !regex '(VERDE|[Vv]erde)'
  233 +
  234 +
225 # --------------------------------------------------------------------------- 235 # ---------------------------------------------------------------------------
226 - type: numeric-interval 236 - type: numeric-interval
227 ref: tut-numeric-interval 237 ref: tut-numeric-interval
@@ -241,6 +251,8 @@ @@ -241,6 +251,8 @@
241 251
242 Neste exemplo o intervalo de respostas correctas é [3.14, 3.15]. 252 Neste exemplo o intervalo de respostas correctas é [3.14, 3.15].
243 correct: [3.14, 3.15] 253 correct: [3.14, 3.15]
  254 +
  255 +
244 # --------------------------------------------------------------------------- 256 # ---------------------------------------------------------------------------
245 - type: textarea 257 - type: textarea
246 ref: tut-textarea 258 ref: tut-textarea
@@ -278,6 +290,7 @@ @@ -278,6 +290,7 @@
278 lines: 3 290 lines: 3
279 timeout: 5 291 timeout: 5
280 292
  293 +
281 # --------------------------------------------------------------------------- 294 # ---------------------------------------------------------------------------
282 - type: information 295 - type: information
283 ref: tut-information 296 ref: tut-information
@@ -307,7 +320,6 @@ @@ -307,7 +320,6 @@
307 $$ 320 $$
308 321
309 322
310 -  
311 # --------------------------------------------------------------------------- 323 # ---------------------------------------------------------------------------
312 - type: success 324 - type: success
313 ref: tut-success 325 ref: tut-success
@@ -375,6 +387,7 @@ @@ -375,6 +387,7 @@
375 387
376 A linha de separação entre o cabeçalho e o corpo da tabela indica o alinhamento da coluna com os sinais de dois-pontos. 388 A linha de separação entre o cabeçalho e o corpo da tabela indica o alinhamento da coluna com os sinais de dois-pontos.
377 389
  390 +
378 # ---------------------------------------------------------------------------- 391 # ----------------------------------------------------------------------------
379 - type: alert 392 - type: alert
380 ref: tut-alert 393 ref: tut-alert
@@ -389,4 +402,5 @@ @@ -389,4 +402,5 @@
389 - Imagens inline: não têm título definido e podem ser incluídas no meio de uma linha de texto usando`![alt text](image.jpg)`. 402 - Imagens inline: não têm título definido e podem ser incluídas no meio de uma linha de texto usando`![alt text](image.jpg)`.
390 - Imagens centradas e com título: `![alt text](image.jpg "Título da imagem")`. O título aprece por baixo da imagem. O título pode ser uma string vazia. 403 - Imagens centradas e com título: `![alt text](image.jpg "Título da imagem")`. O título aprece por baixo da imagem. O título pode ser uma string vazia.
391 404
  405 +
392 # ---------------------------------------------------------------------------- 406 # ----------------------------------------------------------------------------
@@ -42,14 +42,21 @@ class TestFactory(dict): @@ -42,14 +42,21 @@ class TestFactory(dict):
42 self.question_factory.load_files(files=self['files'], questions_dir=self['questions_dir']) 42 self.question_factory.load_files(files=self['files'], questions_dir=self['questions_dir'])
43 43
44 # check if all questions exist ('ref' keys are correct?) 44 # check if all questions exist ('ref' keys are correct?)
  45 + errors_found = False
45 for q in self['questions']: 46 for q in self['questions']:
46 for r in q['ref']: 47 for r in q['ref']:
47 logger.info(f'Checking question "{r}".') 48 logger.info(f'Checking question "{r}".')
48 try: 49 try:
49 self.question_factory.generate(r) 50 self.question_factory.generate(r)
50 - except questions.QuestionFactoryException: 51 + # except questions.QuestionFactoryException:
  52 + # logger.critical(f'Can\'t generate question "{r}".')
  53 + except:
51 logger.critical(f'Can\'t generate question "{r}".') 54 logger.critical(f'Can\'t generate question "{r}".')
52 - raise TestFactoryException() 55 + errors_found = True
  56 +
  57 + if errors_found:
  58 + logger.critical('Errors found while generating questions.')
  59 + raise TestFactoryException()
53 60
54 logger.info(f'Test factory ready for "{self["ref"]}".') 61 logger.info(f'Test factory ready for "{self["ref"]}".')
55 62