Commit 9dd4da6c191f68231957ad3b994296b900b43e8f
1 parent
e62cb00e
Exists in
master
and in
1 other branch
- fix yaml in demo files
- fix show test duration
Showing
5 changed files
with
193 additions
and
131 deletions
Show diff stats
demo/questions/questions-tutorial.yaml
| @@ -5,67 +5,77 @@ | @@ -5,67 +5,77 @@ | ||
| 5 | title: Configuração do teste | 5 | title: Configuração do teste |
| 6 | text: | | 6 | text: | |
| 7 | O teste é configurado num ficheiro `yaml` (ver especificação [aqui](https://yaml.org)). | 7 | O teste é configurado num ficheiro `yaml` (ver especificação [aqui](https://yaml.org)). |
| 8 | - Esta configuração indica a identificação do teste, base de dados dos alunos, ficheiros de perguntas a importar e uma selecção de perguntas e respectivas cotações. | 8 | + A configuração contém a identificação do teste, base de dados dos alunos, |
| 9 | + ficheiros de perguntas a importar e uma selecção de perguntas e respectivas | ||
| 10 | + cotações. | ||
| 9 | 11 | ||
| 10 | Exemplo: | 12 | Exemplo: |
| 11 | 13 | ||
| 12 | ```yaml | 14 | ```yaml |
| 13 | - #----------------------------------------------------------------------------- | ||
| 14 | - # ref: Referência atribuida a um teste. A mesma referência pode ser usada em vários turnos | ||
| 15 | - # title: Título do teste, por exemplo "Unidade Curricular - Exame de recurso" | ||
| 16 | - # database: Base de dados previamente inicializada com os alunos inscritos usando o comando initdb.py | ||
| 17 | - # answers: Directório onde vão ficar guardados os testes dos alunos com as respostas e respectivas correcções. | ||
| 18 | - ref: tutorial | ||
| 19 | - title: Teste de Avaliação | ||
| 20 | - database: demo/students.db | ||
| 21 | - answers_dir: demo/ans | ||
| 22 | - | ||
| 23 | - # Duração do teste, apenas informativo para o aluno | ||
| 24 | - # (opcional, default: infinito) minutos | ||
| 25 | - duration: 60 | ||
| 26 | - | ||
| 27 | - # (opcional, default: False) mostra cotação das perguntas aos alunos, escala 0-20. | ||
| 28 | - show_points: True | ||
| 29 | - | ||
| 30 | - # untested. Points are scaled so that total of exam is given by scale_max | ||
| 31 | - scale_points: True | ||
| 32 | - scale_max: 20 | ||
| 33 | - | ||
| 34 | - # (opcional, default: False) | ||
| 35 | - debug: False | ||
| 36 | - | ||
| 37 | - #----------------------------------------------------------------------------- | ||
| 38 | - # Directório base onde estão as perguntas | ||
| 39 | - questions_dir: ~/topics/P1 | ||
| 40 | - | ||
| 41 | - # Ficheiros de perguntas a importar (relativamente a ~/topics/P1) | ||
| 42 | - files: | ||
| 43 | - - topico_A/parte_1/questions.yaml | ||
| 44 | - - topico_A/parte_2/questions.yaml | ||
| 45 | - - topico_B/parte_3/questions.yaml | ||
| 46 | - | ||
| 47 | - #----------------------------------------------------------------------------- | ||
| 48 | - # Perguntas do teste e respectivas cotações | ||
| 49 | - questions: | ||
| 50 | - - ref: pergunta1 | ||
| 51 | - points: 3.5 | ||
| 52 | - | ||
| 53 | - - ref: pergunta2 | ||
| 54 | - points: 2 | ||
| 55 | - | ||
| 56 | - - ref: tabela-auxiliar | ||
| 57 | - | ||
| 58 | - # escolhe uma das seguintes aleatoriamente | ||
| 59 | - - ref: [ pergunta3a, pergunta3b ] | ||
| 60 | - points: 0.5 | ||
| 61 | - | ||
| 62 | - # a cotação é 1.0 por defeito, caso não esteja definida | ||
| 63 | - - ref: pergunta4 | ||
| 64 | - - pergunta5 | ||
| 65 | - #----------------------------------------------------------------------------- | 15 | + --- |
| 16 | + # ---------------------------------------------------------------------------- | ||
| 17 | + # ref: Referência do teste. Pode ser reusada em vários turnos | ||
| 18 | + # title: Título do teste | ||
| 19 | + # database: Base de dados previamente inicializada com os alunos (usando initdb.py) | ||
| 20 | + # answers_dir: Directório onde vão ficar guardados os testes dos alunos | ||
| 21 | + ref: tutorial | ||
| 22 | + title: Teste de Avaliação | ||
| 23 | + database: demo/students.db | ||
| 24 | + answers_dir: demo/ans | ||
| 25 | + | ||
| 26 | + # Duração do teste em minutos, apenas informativo. (default: infinito) | ||
| 27 | + duration: 60 | ||
| 28 | + | ||
| 29 | + # Mostrar cotação das perguntas. (default: false) | ||
| 30 | + show_points: true | ||
| 31 | + | ||
| 32 | + # Pontos das perguntas são automaticamente convertidos para a escala dada | ||
| 33 | + # (defaults: true, 20) | ||
| 34 | + scale_points: true | ||
| 35 | + scale_max: 20 | ||
| 36 | + | ||
| 37 | + # (opcional, default: false) | ||
| 38 | + debug: false | ||
| 39 | + | ||
| 40 | + # ---------------------------------------------------------------------------- | ||
| 41 | + # Directório base onde estão as perguntas | ||
| 42 | + questions_dir: ~/topics/P1 | ||
| 43 | + | ||
| 44 | + # Ficheiros de perguntas a importar (relativamente a ~/topics/P1) | ||
| 45 | + files: | ||
| 46 | + - topico_A/parte_1/questions.yaml | ||
| 47 | + - topico_A/parte_2/questions.yaml | ||
| 48 | + - topico_B/questions.yaml | ||
| 49 | + | ||
| 50 | + # ---------------------------------------------------------------------------- | ||
| 51 | + # Especificação das perguntas do teste e cotações. | ||
| 52 | + # O teste é uma lista de perguntas | ||
| 53 | + # Cada pergunta é um dicionário com ref da pergunta e cotação. | ||
| 54 | + questions: | ||
| 55 | + - ref: pergunta1 | ||
| 56 | + points: 3.5 | ||
| 57 | + | ||
| 58 | + - ref: pergunta2 | ||
| 59 | + points: 2 | ||
| 60 | + | ||
| 61 | + - ref: tabela-auxiliar | ||
| 62 | + | ||
| 63 | + # escolhe uma das seguintes aleatoriamente | ||
| 64 | + - ref: [ pergunta3a, pergunta3b ] | ||
| 65 | + points: 0.5 | ||
| 66 | + | ||
| 67 | + # a cotação é 1.0 por defeito, caso não esteja definida | ||
| 68 | + - ref: pergunta4 | ||
| 69 | + | ||
| 70 | + # ou ainda mais simples | ||
| 71 | + - pergunta5 | ||
| 72 | + # ---------------------------------------------------------------------------- | ||
| 66 | ``` | 73 | ``` |
| 67 | 74 | ||
| 68 | - O mesmo teste pode ser realizado várias vezes em vários turnos, não é necessário alterar nada. | 75 | + A ordem das perguntas é mantida. |
| 76 | + | ||
| 77 | + O mesmo teste pode ser realizado várias vezes em vários turnos, não é | ||
| 78 | + necessário alterar nada. | ||
| 69 | 79 | ||
| 70 | 80 | ||
| 71 | # ---------------------------------------------------------------------------- | 81 | # ---------------------------------------------------------------------------- |
| @@ -73,32 +83,38 @@ | @@ -73,32 +83,38 @@ | ||
| 73 | ref: tut-questions | 83 | ref: tut-questions |
| 74 | title: Especificação das perguntas | 84 | title: Especificação das perguntas |
| 75 | text: | | 85 | text: | |
| 76 | - As perguntas estão definidas num ou mais ficheiros `yaml` como uma lista de dicionários, onde cada pergunta é um dicionário. | 86 | + As perguntas estão definidas num ou mais ficheiros `yaml` como uma lista de |
| 87 | + dicionários, onde cada pergunta é um dicionário. | ||
| 77 | 88 | ||
| 78 | - Por exemplo, um ficheiro com o conteúdo abaixo contém duas perguntas, uma de escolha múltipla e outra apenas informativa: | 89 | + Por exemplo, um ficheiro com o conteúdo abaixo contém duas perguntas, uma |
| 90 | + de escolha múltipla e outra apenas informativa: | ||
| 79 | 91 | ||
| 80 | ```yaml | 92 | ```yaml |
| 81 | - #----------------------------------------------------------------------------- | ||
| 82 | - - type: radio | ||
| 83 | - ref: chave-unica-1 | ||
| 84 | - text: Quanto é $1+1$? | ||
| 85 | - options: | ||
| 86 | - - 1 | ||
| 87 | - - 2 | ||
| 88 | - - 3 | ||
| 89 | - | ||
| 90 | - #----------------------------------------------------------------------------- | ||
| 91 | - - type: info | ||
| 92 | - ref: chave-unica-2 | ||
| 93 | - text: | | ||
| 94 | - Quando o texto da pergunta tem várias linhas, dá jeito usar o símbolo pipe, para indicar que tudo o que estiver indentado relativamente à linha `text: |` faz parte do corpo do texto. | 93 | + --- |
| 94 | + #----------------------------------------------------------------------------- | ||
| 95 | + - type: radio | ||
| 96 | + ref: chave-unica-1 | ||
| 97 | + text: Quanto é $1+1$? | ||
| 98 | + options: | ||
| 99 | + - 1 | ||
| 100 | + - 2 | ||
| 101 | + - 3 | ||
| 102 | + | ||
| 103 | + #----------------------------------------------------------------------------- | ||
| 104 | + - type: info | ||
| 105 | + ref: chave-unica-2 | ||
| 106 | + text: | | ||
| 107 | + Quando o texto da pergunta tem várias linhas, dá jeito usar o símbolo | ||
| 108 | + pipe, para indicar que tudo o que estiver indentado relativamente à | ||
| 109 | + linha `text: |` faz parte do corpo do texto. | ||
| 95 | 110 | ||
| 96 | - É o caso desta pergunta. | 111 | + É o caso desta pergunta. |
| 97 | 112 | ||
| 98 | - #----------------------------------------------------------------------------- | 113 | + #----------------------------------------------------------------------------- |
| 99 | ``` | 114 | ``` |
| 100 | 115 | ||
| 101 | - As chaves são usadas para construir o teste e não se podem repetir em ficheiros diferentes. A seguir vamos ver exemplos de cada tipo de pergunta. | 116 | + As chaves são usadas para construir o teste e não se podem repetir em |
| 117 | + ficheiros diferentes. A seguir vamos ver exemplos de cada tipo de pergunta. | ||
| 102 | 118 | ||
| 103 | 119 | ||
| 104 | # ---------------------------------------------------------------------------- | 120 | # ---------------------------------------------------------------------------- |
| @@ -106,7 +122,8 @@ | @@ -106,7 +122,8 @@ | ||
| 106 | ref: tut-radio | 122 | ref: tut-radio |
| 107 | title: Escolha simples, uma opção correcta. | 123 | title: Escolha simples, uma opção correcta. |
| 108 | text: | | 124 | text: | |
| 109 | - As perguntas de escolha simples, permitem fazer uma pergunta e apresentar várias opções de resposta em que apenas uma delas está certa. | 125 | + As perguntas de escolha simples, permitem fazer uma pergunta e apresentar |
| 126 | + várias opções de resposta em que apenas uma delas está certa. | ||
| 110 | A utilização mais simples é a seguinte: | 127 | A utilização mais simples é a seguinte: |
| 111 | 128 | ||
| 112 | ```yaml | 129 | ```yaml |
| @@ -123,10 +140,16 @@ | @@ -123,10 +140,16 @@ | ||
| 123 | - Opção 4 | 140 | - Opção 4 |
| 124 | ``` | 141 | ``` |
| 125 | 142 | ||
| 126 | - Sem outras configurações, assume-se que a primeira opção ("Opção 0" neste caso) é a resposta correcta, e todas as 5 opções são apresentadas por ordem aleatória. | 143 | + Sem outras configurações, assume-se que a primeira opção ("Opção 0" neste |
| 144 | + caso) é a resposta correcta, e todas as 5 opções são apresentadas por ordem | ||
| 145 | + aleatória. | ||
| 127 | 146 | ||
| 128 | - Para evitar que os alunos memorizem os textos das opções, podem definir-se várias opções correctas com escrita ligeiramente diferente, sendo apresentada apenas uma delas. | ||
| 129 | - Por exemplo, se as 2 primeiras opções estiverem correctas e as restantes erradas, e quisermos apresentar 3 opções no total com uma delas correcta adiciona-se: | 147 | + Para evitar que os alunos memorizem os textos das opções, podem definir-se |
| 148 | + várias opções correctas com escrita ligeiramente diferente, sendo | ||
| 149 | + apresentada apenas uma delas. | ||
| 150 | + Por exemplo, se as 2 primeiras opções estiverem correctas e as restantes | ||
| 151 | + erradas, e quisermos apresentar 3 opções no total com uma delas correcta | ||
| 152 | + adiciona-se: | ||
| 130 | 153 | ||
| 131 | ```yaml | 154 | ```yaml |
| 132 | correct: [1, 1, 0, 0, 0] | 155 | correct: [1, 1, 0, 0, 0] |
| @@ -135,9 +158,12 @@ | @@ -135,9 +158,12 @@ | ||
| 135 | 158 | ||
| 136 | Assim será escolhida uma opção certa e mais 2 opções erradas. | 159 | Assim será escolhida uma opção certa e mais 2 opções erradas. |
| 137 | 160 | ||
| 138 | - Por defeito, as opções são sempre baralhadas. Adicionando `shuffle: False` evita que o sejam. | 161 | + Por defeito, as opções são sempre baralhadas. Adicionando `shuffle: False` |
| 162 | + evita que o sejam. | ||
| 139 | 163 | ||
| 140 | - Por defeito, as respostas erradas descontam 1/(n-1) do valor da pergunta, onde n é o número de opções apresentadas. Para não descontar usa-se `discount: False`. | 164 | + Por defeito, as respostas erradas descontam 1/(n-1) do valor da pergunta, |
| 165 | + onde n é o número de opções apresentadas. Para não descontar usa-se | ||
| 166 | + `discount: False`. | ||
| 141 | 167 | ||
| 142 | options: | 168 | options: |
| 143 | - Opção 0 | 169 | - Opção 0 |
| @@ -147,7 +173,7 @@ | @@ -147,7 +173,7 @@ | ||
| 147 | - Opção 4 | 173 | - Opção 4 |
| 148 | correct: [1, 1, 0, 0, 0] | 174 | correct: [1, 1, 0, 0, 0] |
| 149 | choose: 3 | 175 | choose: 3 |
| 150 | - shuffle: True | 176 | + shuffle: true |
| 151 | solution: | | 177 | solution: | |
| 152 | A solução correcta é a **opção 0**. | 178 | A solução correcta é a **opção 0**. |
| 153 | 179 | ||
| @@ -156,9 +182,13 @@ | @@ -156,9 +182,13 @@ | ||
| 156 | ref: tut-checkbox | 182 | ref: tut-checkbox |
| 157 | title: Escolha múltipla, várias opções correctas | 183 | title: Escolha múltipla, várias opções correctas |
| 158 | text: | | 184 | text: | |
| 159 | - As perguntas de escolha múltipla permitem apresentar um conjunto de opções podendo ser seleccionadas várias em simultaneo. | ||
| 160 | - Funcionam como múltiplas perguntas independentes com a cotação indicada em `correct`. As opções não seleccionadas têm a cotação simétrica à indicada. | ||
| 161 | - Deste modo, um aluno só deve responder se tiver confiança em pelo menos metade das respostas, caso contrário arrisca-se a ter cotação negativa na pergunta. | 185 | + As perguntas de escolha múltipla permitem apresentar um conjunto de opções |
| 186 | + podendo ser seleccionadas várias em simultaneo. | ||
| 187 | + Funcionam como múltiplas perguntas independentes com a cotação indicada em | ||
| 188 | + `correct`. As opções não seleccionadas têm a cotação simétrica à indicada. | ||
| 189 | + Deste modo, um aluno só deve responder se tiver confiança em pelo menos | ||
| 190 | + metade das respostas, caso contrário arrisca-se a ter cotação negativa na | ||
| 191 | + pergunta. | ||
| 162 | 192 | ||
| 163 | ```yaml | 193 | ```yaml |
| 164 | - type: checkbox | 194 | - type: checkbox |
| @@ -175,10 +205,15 @@ | @@ -175,10 +205,15 @@ | ||
| 175 | correct: [1, -1, -1, 1, -1] | 205 | correct: [1, -1, -1, 1, -1] |
| 176 | ``` | 206 | ``` |
| 177 | 207 | ||
| 178 | - Neste exemplo, seleccionando as opções 0 e 3 obtém-se cotação +1 em cada uma, enquanto que seleccionando as opções 1, 2 e 4 obtém-se cotação -1. | ||
| 179 | - As opções não seleccionadas pelo aluno dão a cotação simétrica à indicada. Por exemplo se não seleccionar a opção 0, tem cotação -1, e não seleccionando a opção 1 obtém-se +1. | 208 | + Neste exemplo, seleccionando as opções 0 e 3 obtém-se cotação +1 em cada |
| 209 | + uma, enquanto que seleccionando as opções 1, 2 e 4 obtém-se cotação -1. | ||
| 210 | + As opções não seleccionadas pelo aluno dão a cotação simétrica à indicada. | ||
| 211 | + Por exemplo se não seleccionar a opção 0, tem cotação -1, e não | ||
| 212 | + seleccionando a opção 1 obtém-se +1. | ||
| 180 | 213 | ||
| 181 | - Cada opção pode opcionalmente ser escrita como uma afirmação e o seu contrário, de maneira a dar mais aleatoriedade à apresentação deste tipo de perguntas. Por exemplo: | 214 | + Cada opção pode opcionalmente ser escrita como uma afirmação e o seu |
| 215 | + contrário, de maneira a dar mais aleatoriedade à apresentação deste tipo de | ||
| 216 | + perguntas. Por exemplo: | ||
| 182 | 217 | ||
| 183 | ```yaml | 218 | ```yaml |
| 184 | options: | 219 | options: |
| @@ -188,9 +223,13 @@ | @@ -188,9 +223,13 @@ | ||
| 188 | correct: [1, 1, 1] | 223 | correct: [1, 1, 1] |
| 189 | ``` | 224 | ``` |
| 190 | 225 | ||
| 191 | - Assume-se que a primeira alternativa de cada opção tem a cotação +1, enquanto a segunda alternativa tem a cotação simétrica -1 (desconta se for seleccionada). | 226 | + Assume-se que a primeira alternativa de cada opção tem a cotação +1, |
| 227 | + enquanto a segunda alternativa tem a cotação simétrica -1 (desconta se for | ||
| 228 | + seleccionada). | ||
| 192 | 229 | ||
| 193 | - Estão disponíveis as configurações `shuffle` e `discount`. Se `discount: False` então as respostas erradas têm cotação 0 em vez do simétrico. | 230 | + Estão disponíveis as configurações `shuffle` e `discount`. |
| 231 | + Se `discount: False` então as respostas erradas têm cotação 0 em vez do | ||
| 232 | + simétrico. | ||
| 194 | 233 | ||
| 195 | options: | 234 | options: |
| 196 | - Opção 0 (sim) | 235 | - Opção 0 (sim) |
| @@ -199,7 +238,7 @@ | @@ -199,7 +238,7 @@ | ||
| 199 | - Opção 3 (sim) | 238 | - Opção 3 (sim) |
| 200 | correct: [1, -1, -1, 1] | 239 | correct: [1, -1, -1, 1] |
| 201 | choose: 3 | 240 | choose: 3 |
| 202 | - shuffle: True | 241 | + shuffle: true |
| 203 | 242 | ||
| 204 | 243 | ||
| 205 | # ---------------------------------------------------------------------------- | 244 | # ---------------------------------------------------------------------------- |
| @@ -207,7 +246,8 @@ | @@ -207,7 +246,8 @@ | ||
| 207 | ref: tut-text | 246 | ref: tut-text |
| 208 | title: Resposta de texto em linha | 247 | title: Resposta de texto em linha |
| 209 | text: | | 248 | text: | |
| 210 | - Este tipo de perguntas permite uma resposta numa linha de texto. A resposta está correcta se coincidir com alguma das respostas admissíveis. | 249 | + Este tipo de perguntas permite uma resposta numa linha de texto. A resposta |
| 250 | + está correcta se coincidir com alguma das respostas admissíveis. | ||
| 211 | 251 | ||
| 212 | ```yaml | 252 | ```yaml |
| 213 | - type: text | 253 | - type: text |
| @@ -227,7 +267,8 @@ | @@ -227,7 +267,8 @@ | ||
| 227 | ref: tut-text-regex | 267 | ref: tut-text-regex |
| 228 | title: Resposta de texto em linha | 268 | title: Resposta de texto em linha |
| 229 | text: | | 269 | text: | |
| 230 | - Este tipo de pergunta é semelhante à linha de texto da pergunta anterior. A única diferença é que esta é validada por uma expressão regular. | 270 | + Este tipo de pergunta é semelhante à linha de texto da pergunta anterior. A |
| 271 | + única diferença é que esta é validada por uma expressão regular. | ||
| 231 | 272 | ||
| 232 | ```yaml | 273 | ```yaml |
| 233 | - type: text-regex | 274 | - type: text-regex |
| @@ -248,7 +289,8 @@ | @@ -248,7 +289,8 @@ | ||
| 248 | title: Resposta numérica em linha de texto | 289 | title: Resposta numérica em linha de texto |
| 249 | text: | | 290 | text: | |
| 250 | Este tipo de perguntas esperam uma resposta numérica (vírgula flutuante). | 291 | Este tipo de perguntas esperam uma resposta numérica (vírgula flutuante). |
| 251 | - O resultado é considerado correcto se estiver dentro do intervalo (fechado) indicado. | 292 | + O resultado é considerado correcto se estiver dentro do intervalo (fechado) |
| 293 | + indicado. | ||
| 252 | 294 | ||
| 253 | ```yaml | 295 | ```yaml |
| 254 | - type: numeric-interval | 296 | - type: numeric-interval |
| @@ -270,9 +312,12 @@ | @@ -270,9 +312,12 @@ | ||
| 270 | ref: tut-textarea | 312 | ref: tut-textarea |
| 271 | title: Resposta em múltiplas linhas de texto | 313 | title: Resposta em múltiplas linhas de texto |
| 272 | text: | | 314 | text: | |
| 273 | - Este tipo de perguntas permitem respostas em múltiplas linhas de texto, que podem ser úteis por exemplo para validar código. | ||
| 274 | - A resposta é enviada para ser avaliada por um programa externo (programa executável). | ||
| 275 | - O programa externo, recebe a resposta via stdin e devolve a classificação via stdout. Exemplo: | 315 | + Este tipo de perguntas permitem respostas em múltiplas linhas de texto, que |
| 316 | + podem ser úteis por exemplo para validar código. | ||
| 317 | + A resposta é enviada para ser avaliada por um programa externo (programa | ||
| 318 | + executável). | ||
| 319 | + O programa externo, recebe a resposta via stdin e devolve a classificação | ||
| 320 | + via stdout. Exemplo: | ||
| 276 | 321 | ||
| 277 | ```yaml | 322 | ```yaml |
| 278 | - type: textarea | 323 | - type: textarea |
| @@ -285,12 +330,18 @@ | @@ -285,12 +330,18 @@ | ||
| 285 | timeout: 5 | 330 | timeout: 5 |
| 286 | ``` | 331 | ``` |
| 287 | 332 | ||
| 288 | - Neste exemplo, o programa de avaliação é um script python que verifica se a resposta contém as três palavras red, green e blue, e calcula uma nota de 0.0 a 1.0. | ||
| 289 | - O programa externo pode ser escrito em qualquer linguagem e a interacção com o servidor faz-se via stdin/stdout. | ||
| 290 | - Se o programa externo demorar mais do que o `timout` indicado, é automaticamente cancelado e é atribuída a classificação de 0.0 valores. | ||
| 291 | - `lines: 3` é a dimensão inicial da caixa de texto (pode depois ser redimensionada pelo aluno). | 333 | + Neste exemplo, o programa de avaliação é um script python que verifica se a |
| 334 | + resposta contém as três palavras red, green e blue, e calcula uma nota de | ||
| 335 | + 0.0 a 1.0. | ||
| 336 | + O programa externo pode ser escrito em qualquer linguagem e a interacção | ||
| 337 | + com o servidor faz-se via stdin/stdout. | ||
| 338 | + Se o programa externo demorar mais do que o `timout` indicado, é | ||
| 339 | + automaticamente cancelado e é atribuída a classificação de 0.0 valores. | ||
| 340 | + `lines: 3` é a dimensão inicial da caixa de texto (pode depois ser | ||
| 341 | + redimensionada pelo aluno). | ||
| 292 | 342 | ||
| 293 | - O programa externo deve atribuir uma classificação entre 0.0 e 1.0. Pode simplesmente fazer print da classificação como um número, ou opcionalmente escrever em formato yaml eventualmente com um comentário. Exemplo: | 343 | + O programa externo deve atribuir uma classificação entre 0.0 e 1.0. Pode |
| 344 | + simplesmente fazer print da classificação como um número, ou opcionalmente escrever em formato yaml eventualmente com um comentário. Exemplo: | ||
| 294 | 345 | ||
| 295 | ```yaml | 346 | ```yaml |
| 296 | grade: 0.5 | 347 | grade: 0.5 |
| @@ -308,15 +359,18 @@ | @@ -308,15 +359,18 @@ | ||
| 308 | ref: tut-information | 359 | ref: tut-information |
| 309 | title: Texto informativo | 360 | title: Texto informativo |
| 310 | text: | | 361 | text: | |
| 311 | - As perguntas deste tipo não contam para avaliação. O objectivo é fornecer instruções para os alunos, por exemplo tabelas para consulta, fórmulas, etc. | ||
| 312 | - Nesta como em todos os tipos de perguntas pode escrever-se fórmulas em LaTeX. Exemplo: | 362 | + As perguntas deste tipo não contam para avaliação. O objectivo é fornecer |
| 363 | + instruções para os alunos, por exemplo tabelas para consulta, fórmulas, etc. | ||
| 364 | + Nesta como em todos os tipos de perguntas pode escrever-se fórmulas em | ||
| 365 | + LaTeX. Exemplo: | ||
| 313 | 366 | ||
| 314 | ```yaml | 367 | ```yaml |
| 315 | - type: information | 368 | - type: information |
| 316 | ref: tut-information | 369 | ref: tut-information |
| 317 | title: Texto informativo | 370 | title: Texto informativo |
| 318 | text: | | 371 | text: | |
| 319 | - A distribuição gaussiana $\mathcal{N}(x\mid\mu,\sigma^2)$ é definida por | 372 | + A distribuição gaussiana $\mathcal{N}(x\mid\mu,\sigma^2)$ é |
| 373 | + definida por | ||
| 320 | 374 | ||
| 321 | $$ | 375 | $$ |
| 322 | p(x) = \frac{1}{\sqrt{2\pi\sigma^2}}e^{-\tfrac{1}{2}\tfrac{(x-\mu)^2}{\sigma^2}}. | 376 | p(x) = \frac{1}{\sqrt{2\pi\sigma^2}}e^{-\tfrac{1}{2}\tfrac{(x-\mu)^2}{\sigma^2}}. |
| @@ -356,7 +410,8 @@ | @@ -356,7 +410,8 @@ | ||
| 356 | text: | | 410 | text: | |
| 357 | Também não conta para avaliação. | 411 | Também não conta para avaliação. |
| 358 | 412 | ||
| 359 | - Já vimos como se introduzem fórmulas LaTeX, também se pode escrever troços de código: | 413 | + Já vimos como se introduzem fórmulas LaTeX, também se pode escrever |
| 414 | + troços de código: | ||
| 360 | 415 | ||
| 361 | ```C | 416 | ```C |
| 362 | int main() { | 417 | int main() { |
| @@ -397,7 +452,8 @@ | @@ -397,7 +452,8 @@ | ||
| 397 | $\sqrt{\pi}$ | `code` | $1.99 | 452 | $\sqrt{\pi}$ | `code` | $1.99 |
| 398 | ``` | 453 | ``` |
| 399 | 454 | ||
| 400 | - 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. | 455 | + A linha de separação entre o cabeçalho e o corpo da tabela indica o |
| 456 | + alinhamento da coluna com os sinais de dois-pontos. | ||
| 401 | 457 | ||
| 402 | 458 | ||
| 403 | # ---------------------------------------------------------------------------- | 459 | # ---------------------------------------------------------------------------- |
| @@ -409,10 +465,13 @@ | @@ -409,10 +465,13 @@ | ||
| 409 | 465 | ||
| 410 |  | 466 |  |
| 411 | 467 | ||
| 412 | - As imagens podem ser adicionadas usando a notação standard em markdown. Há duas possibilidads: | 468 | + As imagens podem ser adicionadas usando a notação standard em markdown. Há |
| 469 | + duas possibilidads: | ||
| 413 | 470 | ||
| 414 | - - Imagens inline: não têm título definido e podem ser incluídas no meio de uma linha de texto usando``. | ||
| 415 | - - Imagens centradas e com título: ``. O título aprece por baixo da imagem. O título pode ser uma string vazia. | 471 | + - Imagens inline: não têm título definido e podem ser incluídas no meio de |
| 472 | + uma linha de texto usando``. | ||
| 473 | + - Imagens centradas com título: ``. | ||
| 474 | + O título aprece por baixo da imagem. O título pode ser uma string vazia. | ||
| 416 | 475 | ||
| 417 | 476 | ||
| 418 | # ---------------------------------------------------------------------------- | 477 | # ---------------------------------------------------------------------------- |
demo/test-tutorial.yaml
| 1 | -#============================================================================= | 1 | +--- |
| 2 | +# ============================================================================ | ||
| 2 | # The test reference should be a unique identifier. It is saved in the database | 3 | # The test reference should be a unique identifier. It is saved in the database |
| 3 | # so that queries for the results can be done in the terminal with | 4 | # so that queries for the results can be done in the terminal with |
| 4 | # $ sqlite3 students.db "select * from tests where ref='demo'" | 5 | # $ sqlite3 students.db "select * from tests where ref='demo'" |
| @@ -7,8 +8,8 @@ ref: tutorial | @@ -7,8 +8,8 @@ ref: tutorial | ||
| 7 | # (optional, default: '') You may wish to refer the course, year or kind of test | 8 | # (optional, default: '') You may wish to refer the course, year or kind of test |
| 8 | title: Teste tutorial | 9 | title: Teste tutorial |
| 9 | 10 | ||
| 10 | -# (optional) duration in minutes FIXME | ||
| 11 | -duration: 90 | 11 | +# (optional) duration in minutes, 0 or undefined is infinite |
| 12 | +duration: 120 | ||
| 12 | 13 | ||
| 13 | # Database with student credentials and grades of all questions and tests done | 14 | # Database with student credentials and grades of all questions and tests done |
| 14 | # The database is an sqlite3 file generate with the script initdb.py | 15 | # The database is an sqlite3 file generate with the script initdb.py |
| @@ -19,18 +20,18 @@ database: demo/students.db | @@ -19,18 +20,18 @@ database: demo/students.db | ||
| 19 | answers_dir: demo/ans | 20 | answers_dir: demo/ans |
| 20 | 21 | ||
| 21 | # (optional, default: False) Show points for each question, scale 0-20. | 22 | # (optional, default: False) Show points for each question, scale 0-20. |
| 22 | -show_points: True | 23 | +show_points: true |
| 23 | # scale_points: True | 24 | # scale_points: True |
| 24 | # scale_max: 20 | 25 | # scale_max: 20 |
| 25 | 26 | ||
| 26 | # (optional, default: False) Show hints if available | 27 | # (optional, default: False) Show hints if available |
| 27 | -show_hints: True | 28 | +show_hints: true |
| 28 | 29 | ||
| 29 | # (optional, default: False) Show lots of information for debugging | 30 | # (optional, default: False) Show lots of information for debugging |
| 30 | # debug: True | 31 | # debug: True |
| 31 | 32 | ||
| 32 | 33 | ||
| 33 | -#----------------------------------------------------------------------------- | 34 | +# ---------------------------------------------------------------------------- |
| 34 | # Base path applied to the questions files and all the scripts | 35 | # Base path applied to the questions files and all the scripts |
| 35 | # including question generators and correctors. | 36 | # including question generators and correctors. |
| 36 | # Either absolute path or relative to current directory can be used. | 37 | # Either absolute path or relative to current directory can be used. |
| @@ -61,4 +62,3 @@ questions: | @@ -61,4 +62,3 @@ questions: | ||
| 61 | - tut-success | 62 | - tut-success |
| 62 | - tut-warning | 63 | - tut-warning |
| 63 | - tut-alert | 64 | - tut-alert |
| 64 | - |
static/js/clock.js
| 1 | $(document).ready(function() { | 1 | $(document).ready(function() { |
| 2 | - var clock = $("#clock"); | ||
| 3 | function time() { | 2 | function time() { |
| 4 | var d = new Date(); | 3 | var d = new Date(); |
| 5 | var m = d.getMinutes(); | 4 | var m = d.getMinutes(); |
| 6 | var h = d.getHours(); | 5 | var h = d.getHours(); |
| 7 | - clock.html( h + ":" + (m >= 10 ? m : "0"+m)); | 6 | + $("#clock").html( h + ":" + (m >= 10 ? m : "0"+m)); |
| 8 | } | 7 | } |
| 8 | + | ||
| 9 | time(); | 9 | time(); |
| 10 | setInterval(time, 60000); | 10 | setInterval(time, 60000); |
| 11 | }); | 11 | }); |
| 12 | \ No newline at end of file | 12 | \ No newline at end of file |
templates/test.html
| @@ -89,7 +89,7 @@ | @@ -89,7 +89,7 @@ | ||
| 89 | </div> | 89 | </div> |
| 90 | <div class="row"> | 90 | <div class="row"> |
| 91 | <label for="duracao" class="col-sm-3">Duração:</label> | 91 | <label for="duracao" class="col-sm-3">Duração:</label> |
| 92 | - <div class="col-sm-9" id="duracao">{{ t.get('duration', chr(8734)) }}</div> | 92 | + <div class="col-sm-9" id="duracao">{{ str(t['duration'])+' min.' if t['duration'] > 0 else chr(8734) }}</div> |
| 93 | </div> | 93 | </div> |
| 94 | </h5> | 94 | </h5> |
| 95 | </div> | 95 | </div> |
test.py
| @@ -24,6 +24,18 @@ class TestFactoryException(Exception): | @@ -24,6 +24,18 @@ class TestFactoryException(Exception): | ||
| 24 | # instances of TestFactory(), one for each test. | 24 | # instances of TestFactory(), one for each test. |
| 25 | # =========================================================================== | 25 | # =========================================================================== |
| 26 | class TestFactory(dict): | 26 | class TestFactory(dict): |
| 27 | + _defaults = { | ||
| 28 | + 'title': '', | ||
| 29 | + 'show_points': False, | ||
| 30 | + 'scale_points': True, | ||
| 31 | + 'scale_max': 20.0, | ||
| 32 | + 'duration': 0, | ||
| 33 | + # debug options: | ||
| 34 | + 'debug': False, | ||
| 35 | + 'show_ref': False | ||
| 36 | + } | ||
| 37 | + | ||
| 38 | + | ||
| 27 | # ----------------------------------------------------------------------- | 39 | # ----------------------------------------------------------------------- |
| 28 | # loads configuration from yaml file, then updates (overriding) | 40 | # loads configuration from yaml file, then updates (overriding) |
| 29 | # some configurations using the conf argument. | 41 | # some configurations using the conf argument. |
| @@ -132,17 +144,9 @@ class TestFactory(dict): | @@ -132,17 +144,9 @@ class TestFactory(dict): | ||
| 132 | 144 | ||
| 133 | self['questions'][i] = q | 145 | self['questions'][i] = q |
| 134 | 146 | ||
| 135 | - | ||
| 136 | # --- defaults for optional keys | 147 | # --- defaults for optional keys |
| 137 | - self.setdefault('title', '') | ||
| 138 | - # self.setdefault('show_hints', False) # FIXME not implemented yet | ||
| 139 | - self.setdefault('show_points', False) | ||
| 140 | - self.setdefault('scale_points', True) | ||
| 141 | - self.setdefault('scale_max', 20.0) | ||
| 142 | - self.setdefault('duration', 0) # FIXME unused | ||
| 143 | - | ||
| 144 | - self.setdefault('debug', False) | ||
| 145 | - self.setdefault('show_ref', False) | 148 | + for k,v in self._defaults.items(): |
| 149 | + self.setdefault(k, v) | ||
| 146 | 150 | ||
| 147 | 151 | ||
| 148 | # ----------------------------------------------------------------------- | 152 | # ----------------------------------------------------------------------- |
| @@ -189,8 +193,7 @@ class TestFactory(dict): | @@ -189,8 +193,7 @@ class TestFactory(dict): | ||
| 189 | 'questions': test, # list of questions | 193 | 'questions': test, # list of questions |
| 190 | 'answers_dir': self['answers_dir'], | 194 | 'answers_dir': self['answers_dir'], |
| 191 | 195 | ||
| 192 | - # FIXME which ones are required? | ||
| 193 | - # 'show_hints': self['show_hints'], | 196 | + 'duration': self['duration'], |
| 194 | 'show_points': self['show_points'], | 197 | 'show_points': self['show_points'], |
| 195 | 'show_ref': self['show_ref'], | 198 | 'show_ref': self['show_ref'], |
| 196 | 'debug': self['debug'], # required by template test.html | 199 | 'debug': self['debug'], # required by template test.html |