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,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 ![planetas](planets.png "Planetas do Sistema Solar") 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 # 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>
@@ -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