Commit 008f89672e0e3850a825f65eb583bff208f94420
1 parent
a08905e3
Exists in
master
and in
1 other branch
- check all questions before aborting.
Showing
3 changed files
with
28 additions
and
10 deletions
Show diff stats
BUGS.md
| 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``. | 402 | - Imagens inline: não têm título definido e podem ser incluídas no meio de uma linha de texto usando``. |
| 390 | - Imagens centradas e com título: ``. O título aprece por baixo da imagem. O título pode ser uma string vazia. | 403 | - Imagens centradas e com título: ``. O título aprece por baixo da imagem. O título pode ser uma string vazia. |
| 391 | 404 | ||
| 405 | + | ||
| 392 | # ---------------------------------------------------------------------------- | 406 | # ---------------------------------------------------------------------------- |
test.py
| @@ -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 |