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 | 5 | title: Configuração do teste |
6 | 6 | text: | |
7 | 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 | 12 | Exemplo: |
11 | 13 | |
12 | 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 | 83 | ref: tut-questions |
74 | 84 | title: Especificação das perguntas |
75 | 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 | 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 | 122 | ref: tut-radio |
107 | 123 | title: Escolha simples, uma opção correcta. |
108 | 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 | 127 | A utilização mais simples é a seguinte: |
111 | 128 | |
112 | 129 | ```yaml |
... | ... | @@ -123,10 +140,16 @@ |
123 | 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 | 154 | ```yaml |
132 | 155 | correct: [1, 1, 0, 0, 0] |
... | ... | @@ -135,9 +158,12 @@ |
135 | 158 | |
136 | 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 | 168 | options: |
143 | 169 | - Opção 0 |
... | ... | @@ -147,7 +173,7 @@ |
147 | 173 | - Opção 4 |
148 | 174 | correct: [1, 1, 0, 0, 0] |
149 | 175 | choose: 3 |
150 | - shuffle: True | |
176 | + shuffle: true | |
151 | 177 | solution: | |
152 | 178 | A solução correcta é a **opção 0**. |
153 | 179 | |
... | ... | @@ -156,9 +182,13 @@ |
156 | 182 | ref: tut-checkbox |
157 | 183 | title: Escolha múltipla, várias opções correctas |
158 | 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 | 193 | ```yaml |
164 | 194 | - type: checkbox |
... | ... | @@ -175,10 +205,15 @@ |
175 | 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 | 218 | ```yaml |
184 | 219 | options: |
... | ... | @@ -188,9 +223,13 @@ |
188 | 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 | 234 | options: |
196 | 235 | - Opção 0 (sim) |
... | ... | @@ -199,7 +238,7 @@ |
199 | 238 | - Opção 3 (sim) |
200 | 239 | correct: [1, -1, -1, 1] |
201 | 240 | choose: 3 |
202 | - shuffle: True | |
241 | + shuffle: true | |
203 | 242 | |
204 | 243 | |
205 | 244 | # ---------------------------------------------------------------------------- |
... | ... | @@ -207,7 +246,8 @@ |
207 | 246 | ref: tut-text |
208 | 247 | title: Resposta de texto em linha |
209 | 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 | 252 | ```yaml |
213 | 253 | - type: text |
... | ... | @@ -227,7 +267,8 @@ |
227 | 267 | ref: tut-text-regex |
228 | 268 | title: Resposta de texto em linha |
229 | 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 | 273 | ```yaml |
233 | 274 | - type: text-regex |
... | ... | @@ -248,7 +289,8 @@ |
248 | 289 | title: Resposta numérica em linha de texto |
249 | 290 | text: | |
250 | 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 | 295 | ```yaml |
254 | 296 | - type: numeric-interval |
... | ... | @@ -270,9 +312,12 @@ |
270 | 312 | ref: tut-textarea |
271 | 313 | title: Resposta em múltiplas linhas de texto |
272 | 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 | 322 | ```yaml |
278 | 323 | - type: textarea |
... | ... | @@ -285,12 +330,18 @@ |
285 | 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 | 346 | ```yaml |
296 | 347 | grade: 0.5 |
... | ... | @@ -308,15 +359,18 @@ |
308 | 359 | ref: tut-information |
309 | 360 | title: Texto informativo |
310 | 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 | 367 | ```yaml |
315 | 368 | - type: information |
316 | 369 | ref: tut-information |
317 | 370 | title: Texto informativo |
318 | 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 | 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 | 410 | text: | |
357 | 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 | 416 | ```C |
362 | 417 | int main() { |
... | ... | @@ -397,7 +452,8 @@ |
397 | 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 | 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 | 3 | # The test reference should be a unique identifier. It is saved in the database |
3 | 4 | # so that queries for the results can be done in the terminal with |
4 | 5 | # $ sqlite3 students.db "select * from tests where ref='demo'" |
... | ... | @@ -7,8 +8,8 @@ ref: tutorial |
7 | 8 | # (optional, default: '') You may wish to refer the course, year or kind of test |
8 | 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 | 14 | # Database with student credentials and grades of all questions and tests done |
14 | 15 | # The database is an sqlite3 file generate with the script initdb.py |
... | ... | @@ -19,18 +20,18 @@ database: demo/students.db |
19 | 20 | answers_dir: demo/ans |
20 | 21 | |
21 | 22 | # (optional, default: False) Show points for each question, scale 0-20. |
22 | -show_points: True | |
23 | +show_points: true | |
23 | 24 | # scale_points: True |
24 | 25 | # scale_max: 20 |
25 | 26 | |
26 | 27 | # (optional, default: False) Show hints if available |
27 | -show_hints: True | |
28 | +show_hints: true | |
28 | 29 | |
29 | 30 | # (optional, default: False) Show lots of information for debugging |
30 | 31 | # debug: True |
31 | 32 | |
32 | 33 | |
33 | -#----------------------------------------------------------------------------- | |
34 | +# ---------------------------------------------------------------------------- | |
34 | 35 | # Base path applied to the questions files and all the scripts |
35 | 36 | # including question generators and correctors. |
36 | 37 | # Either absolute path or relative to current directory can be used. |
... | ... | @@ -61,4 +62,3 @@ questions: |
61 | 62 | - tut-success |
62 | 63 | - tut-warning |
63 | 64 | - tut-alert |
64 | - | ... | ... |
static/js/clock.js
1 | 1 | $(document).ready(function() { |
2 | - var clock = $("#clock"); | |
3 | 2 | function time() { |
4 | 3 | var d = new Date(); |
5 | 4 | var m = d.getMinutes(); |
6 | 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 | 9 | time(); |
10 | 10 | setInterval(time, 60000); |
11 | 11 | }); |
12 | 12 | \ No newline at end of file | ... | ... |
templates/test.html
... | ... | @@ -89,7 +89,7 @@ |
89 | 89 | </div> |
90 | 90 | <div class="row"> |
91 | 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 | 93 | </div> |
94 | 94 | </h5> |
95 | 95 | </div> | ... | ... |
test.py
... | ... | @@ -24,6 +24,18 @@ class TestFactoryException(Exception): |
24 | 24 | # instances of TestFactory(), one for each test. |
25 | 25 | # =========================================================================== |
26 | 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 | 40 | # loads configuration from yaml file, then updates (overriding) |
29 | 41 | # some configurations using the conf argument. |
... | ... | @@ -132,17 +144,9 @@ class TestFactory(dict): |
132 | 144 | |
133 | 145 | self['questions'][i] = q |
134 | 146 | |
135 | - | |
136 | 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 | 193 | 'questions': test, # list of questions |
190 | 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 | 197 | 'show_points': self['show_points'], |
195 | 198 | 'show_ref': self['show_ref'], |
196 | 199 | 'debug': self['debug'], # required by template test.html | ... | ... |