Commit 9dd4da6c191f68231957ad3b994296b900b43e8f

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

- fix yaml in demo files

- fix show test duration
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 ![planetas](planets.png "Planetas do Sistema Solar")
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`![alt text](image.jpg)`.
415   - - Imagens centradas e com título: `![alt text](image.jpg "Título da imagem")`. O título aprece por baixo da imagem. O título pode ser uma string vazia.
  471 + - Imagens inline: não têm título definido e podem ser incluídas no meio de
  472 + uma linha de texto usando`![alt text](image.jpg)`.
  473 + - Imagens centradas com título: `![alt text](image.jpg "Título da imagem")`.
  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
... ...