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 |