Commit f6fdbdbd5f3714cdcf00a8f374855e5cabf3a985
1 parent
b724b70f
Exists in
master
and in
1 other branch
- fix some imports
- codemirror converts tabs to 4 spaces. tab indents, shift-tab dedents
Showing
7 changed files
with
177 additions
and
92 deletions
Show diff stats
BUGS.md
1 | 1 | |
2 | 2 | # BUGS |
3 | 3 | |
4 | -- correct devia poder ser corrido mais que uma vez (por exemplo para alterar cotacoes, corrigir perguntas) | |
4 | +- show_points nao esta a funcionar (mostra sempre) | |
5 | +- esta a corrigir código JOBE mesmo que nao tenha respondido??? | |
6 | +- correct devia poder ser corrido mais que uma vez (por exemplo para alterar | |
7 | + cotacoes, corrigir perguntas) | |
5 | 8 | - nao esta a mostrar imagens?? internal server error? |
6 | -- guardar testes em JSON assim que sao atribuidos aos alunos (ou guardados inicialmente com um certo nome, e atribuidos posteriormente ao aluno). | |
7 | -- cookies existe um perguntations_user e um user. De onde vem o user? | |
8 | -- QuestionCode falta reportar nos comments os vários erros que podem ocorrer (timeout, etc) | |
9 | -- algumas vezes a base de dados guarda o mesmo teste em duplicado. ver se dois submits dao origem a duas correcções. | |
10 | -talvez a base de dados devesse ter como chave do teste um id que fosse único desse teste particular (não um auto counter, nem ref do teste) | |
11 | -- em caso de timeout na submissão (e.g. JOBE ou script nao responde) a correcção não termina e o teste não é guardado. | |
9 | +- guardar testes em JSON assim que sao atribuidos aos alunos (ou guardados | |
10 | + inicialmente com um certo nome, e atribuidos posteriormente ao aluno). | |
11 | +- cookies existe um `perguntations_user` e um user. De onde vem o user? | |
12 | +- QuestionCode falta reportar nos comments os vários erros que podem ocorrer | |
13 | + (timeout, etc) | |
14 | +- algumas vezes a base de dados guarda o mesmo teste em duplicado. ver se dois | |
15 | + submits dao origem a duas correcções. talvez a base de dados devesse ter | |
16 | + como chave do teste um id que fosse único desse teste particular (não um auto | |
17 | + counter, nem ref do teste) | |
18 | +- em caso de timeout na submissão (e.g. JOBE ou script nao responde) a | |
19 | + correcção não termina e o teste não é guardado. | |
12 | 20 | - grade gives internal server error?? |
13 | 21 | - reload do teste recomeça a contagem no inicio do tempo. |
14 | -- em admin, quando scale_max não é 20, as cores das barras continuam a reflectir a escala 0,20. a tabela teste na DB não tem a escala desse teste. | |
15 | -- em grade.html as barras estao normalizadas para os limites scale_min e max do teste actual e nao dos testes realizados no passado (tabela test devia guardar a escala). | |
16 | -- codigo `hello world` nao esta a preservar o whitespace. O renderer de markdown gera a tag <code> que não preserva whitespace. Necessario adicionar <pre>. | |
17 | -- mensagems de erro do assembler aparecem na mesma linha na correcao e nao fazerm rendering do `$t`, ver se servidor faz parse do markdown dessas mensagens. | |
22 | +- em admin, quando `scale_max` não é 20, as cores das barras continuam a | |
23 | + reflectir a escala 0,20. a tabela teste na DB não tem a escala desse teste. | |
24 | +- em grade.html as barras estao normalizadas para os limites `scale_min` e max | |
25 | + do teste actual e nao dos testes realizados no passado (tabela test devia | |
26 | + guardar a escala). | |
27 | +- codigo `hello world` nao esta a preservar o whitespace. O renderer de | |
28 | + markdown gera a tag `<code>` que não preserva whitespace. Necessario | |
29 | + adicionar `<pre>.` | |
30 | +- mensagems de erro do assembler aparecem na mesma linha na correcao e nao | |
31 | + fazerm rendering do `$t`, ver se servidor faz parse do markdown dessas | |
32 | + mensagens. | |
18 | 33 | - a revisao do teste não mostra as imagens. |
19 | -- Test.reset_answers() unused. | |
34 | +- `Test.reset_answers()` unused. | |
20 | 35 | - teste nao esta a mostrar imagens de vez em quando.??? |
21 | 36 | - show-ref nao esta a funcionar na correccao (pelo menos) |
22 | 37 | |
23 | 38 | # TODO |
24 | 39 | |
25 | -- JOBE correct async | |
26 | -- esta a corrigir código JOBE mesmo que nao tenha respondido??? | |
40 | +- permitir que textarea nao tenha correct definido, da sempre 0 e é para | |
41 | + corrigir manualmente. | |
42 | +- permitir corrigir mais que uma vez, actualizando a base de dados. | |
43 | +- yaml schemas para validar os ficheiros yaml (ver cerberus e jsonschema) | |
27 | 44 | - permitir remover alunos que estão online para poderem comecar de novo. |
28 | -- guardar nota final grade truncado em zero e sem ser truncado (quando é necessário fazer correcções à mão às perguntas, é necessário o valor não truncado) | |
29 | -- stress tests. use https://locust.io | |
45 | +- guardar nota final grade truncado em zero e sem ser truncado (quando é | |
46 | + necessário fazer correcções à mão às perguntas, é necessário o valor não | |
47 | + truncado) | |
48 | +- stress tests. use [locust](https://locust.io) | |
30 | 49 | - wait for admin to start test. (students can be allowed earlier) |
31 | -- impedir os eventos copy/paste. alunos usam isso para trazer codigo ja feito nos computadores. Obrigar a fazer reset? fazer um copy automaticamente? | |
32 | -- na pagina admin, mostrar com cor vermelha as horas de entrada dos alunos que ja tenham excedido o tempo | |
33 | -- retornar None quando nao ha alteracoes relativamente à última vez. | |
34 | -ou usar push (websockets?) | |
35 | -- mudar ref do test para test_id (ref já é usado nas perguntas) | |
50 | +- impedir os eventos copy/paste. alunos usam isso para trazer codigo ja feito | |
51 | + nos computadores. Obrigar a fazer reset? fazer um copy automaticamente? | |
52 | +- na pagina admin, mostrar com cor vermelha as horas de entrada dos alunos que | |
53 | + ja tenham excedido o tempo | |
54 | +- retornar None quando nao ha alteracoes relativamente à última vez. ou usar | |
55 | + push (websockets?) | |
56 | +- mudar ref do test para `test_id` (ref já é usado nas perguntas) | |
36 | 57 | - servidor ntpd no x220 para configurar a data/hora dos portateis dell |
37 | -- sala de espera: autorização dada, mas teste não disponível até que seja dada ordem para começar. | |
38 | -- alunos com necessidades especiais nao podem ter autosubmit. ter um autosubmit_exceptions: ['123', '456'] | |
58 | +- sala de espera: autorização dada, mas teste não disponível até que seja dada | |
59 | + ordem para começar. | |
60 | +- alunos com necessidades especiais nao podem ter autosubmit. ter um | |
61 | + `autosubmit_exceptions`: ['123', '456'] | |
39 | 62 | - submissao fazer um post ajax? |
40 | 63 | - adicionar opcao para eliminar um teste em curso. |
41 | 64 | - enviar resposta de cada pergunta individualmente. |
42 | -- experimentar gerador de svg que inclua no markdown da pergunta e ver se funciona. | |
43 | -- quando ha varias perguntas para escolher, escolher sucessivamente em vez de aleatoriamente. | |
65 | +- experimentar gerador de svg que inclua no markdown da pergunta e ver se | |
66 | + funciona. | |
67 | +- quando ha varias perguntas para escolher, escolher sucessivamente em vez de | |
68 | + aleatoriamente. | |
44 | 69 | - como refrescar a tabela de admin sem fazer reload da pagina? |
45 | -- botao "testar resposta" que valida codigo relativamente a syntax, mas nao classifica. perguntas devem ter opcao validate: script.py. Aluno pressiona botao e codigo é enviado para servidor para validação, feedback é mostrado na pagina de teste. | |
46 | -- test: botao submeter valida se esta online com um post willing_to_submit, se estiver online, mostra mensagem de confirmacao, caso contrario avisa que nao esta online. | |
70 | +- botao "testar resposta" que valida codigo relativamente a syntax, mas nao | |
71 | + classifica. perguntas devem ter opcao validate: script.py. Aluno pressiona | |
72 | + botao e codigo é enviado para servidor para validação, feedback é mostrado na | |
73 | + pagina de teste. | |
74 | +- test: botao submeter valida se esta online com um post `willing_to_submit`, | |
75 | + se estiver online, mostra mensagem de confirmacao, caso contrario avisa que | |
76 | + nao esta online. | |
47 | 77 | - test: Cada pergunta respondida é logo submetida. |
48 | 78 | - test: calculadora javascript. |
49 | 79 | - admin: histograma das notas. |
50 | 80 | - admin: mostrar as horas a que o teste terminou para os testes terminados. |
51 | 81 | - admin: histograma das notas. |
52 | 82 | - admin: mostrar teste gerado para aluno (tipo review). |
53 | -- fazer renderer para formulas com mathjax serverside (mathjax-node) ou usar katex. | |
83 | +- fazer renderer para formulas com mathjax serverside (mathjax-node) ou usar | |
84 | + katex. | |
54 | 85 | - fazer renderer para imagens, com links /file?ref=xpto;name=zzz.jpg |
55 | 86 | - fazer renderer para linguagem assembly mips? |
56 | -- cancelar teste no menu admin. Dado o numero de aluno remove teste e faz logout do aluno. | |
57 | -- mathjax-node: | |
58 | - sudo pkg install node npm | |
59 | - npm install mathjax-node mathjax-node-cli # pacotes em ~/node_modules | |
60 | - node_modules/mathjax-node-cli/bin/tex2svg '\sqrt{x}' | |
61 | - usar isto para gerar svg que passa a fazer parte do texto da pergunta (markdown suporta tags svg?) | |
62 | - fazer funçao tex() que recebe formula e converte para svg. exemplo: | |
63 | - fr'''A formula é {tex("\sqrt{x]}")}''' | |
87 | +- cancelar teste no menu admin. Dado o numero de aluno remove teste e faz | |
88 | + logout do aluno. | |
64 | 89 | - Gerar pdf's com todos os testes no final (pdfkit). |
65 | -- manter registo dos unfocus durante o teste e de qual a pergunta visivel nesse momento | |
90 | +- manter registo dos unfocus durante o teste e de qual a pergunta visivel nesse | |
91 | + momento | |
66 | 92 | - permitir varios testes, aluno escolhe qual o teste que quer fazer. |
67 | 93 | - se ocorrer um erro na correcçao avisar aluno para contactar o professor. |
68 | -- abrir o teste numa janela maximizada e que nao permite que o aluno a redimensione/mova? | |
69 | -- detectar scroll e enviar posição para servidor (analise de scroll para detectar copianço? ou simplesmente para analisar como os alunos percorrem o teste) | |
70 | -- aviso na pagina principal para quem usa browser incompativel ou settings esquisitos... Apos login pode ser enviado e submetido um exemplo de teste para verificar se browser consegue submeter? ha alunos com javascript bloqueado? | |
94 | +- abrir o teste numa janela maximizada e que nao permite que o aluno a | |
95 | + redimensione/mova? | |
96 | +- detectar scroll e enviar posição para servidor (analise de scroll para | |
97 | + detectar copianço? ou simplesmente para analisar como os alunos percorrem o | |
98 | + teste) | |
99 | +- aviso na pagina principal para quem usa browser incompativel ou settings | |
100 | + esquisitos... Apos login pode ser enviado e submetido um exemplo de teste | |
101 | + para verificar se browser consegue submeter? ha alunos com javascript | |
102 | + bloqueado? | |
71 | 103 | - criar perguntas de outros tipos, e.g. associação, ordenação, varios textinput |
72 | -- perguntas para professor corrigir mais tarde. permitir que review possa alterar as notas | |
104 | +- perguntas para professor corrigir mais tarde. permitir que review possa | |
105 | + alterar as notas | |
73 | 106 | - fazer uma calculadora javascript e por no menu. surge como modal |
74 | 107 | |
75 | 108 | # FIXED |
76 | 109 | |
110 | +- JOBE correct async | |
77 | 111 | - testar as perguntas todas no início do teste como o aprendizations. |
78 | -- adicionar identificacao do aluno no jumbotron inicial do teste, para que ao imprimir para pdf a identificacao do aluno venha escrita no documento. | |
112 | +- adicionar identificacao do aluno no jumbotron inicial do teste, para que ao | |
113 | + imprimir para pdf a identificacao do aluno venha escrita no documento. | |
79 | 114 | - internal server error quando em --review, download csv detalhado. |
80 | -- perguntas repetidas (mesma ref) dao asneira, porque a referencia é usada como chave em varios sitios e as chaves nao podem ser dupplicadas. | |
81 | - da asneira pelo menos na funcao get_questions_csv. na base de dados tem de estar registado tb o numero da pergunta, caso contrario é impossível saber a qual corresponde. | |
115 | +- perguntas repetidas (mesma ref) dao asneira, porque a referencia é usada como | |
116 | + chave em varios sitios e as chaves nao podem ser dupplicadas. da asneira | |
117 | + pelo menos na funcao `get_questions_csv`. na base de dados tem de estar | |
118 | + registado tb o numero da pergunta, caso contrario é impossível saber a qual | |
119 | + corresponde. | |
82 | 120 | - mostrar unfocus e window area em /admin |
83 | -- CRITICAL se answer for `i<n` a revisão de provas mostra apenas i (interpreta `<` como tag?) | |
121 | +- CRITICAL se answer for `i<n` a revisão de provas mostra apenas i (interpreta | |
122 | + `<` como tag?) | |
84 | 123 | - botao de autorizar desliga-se, fazer debounce. |
85 | 124 | - link na pagina com a nota para voltar ao principio. |
86 | 125 | - default logger config mostrar horas com segundos |
... | ... | @@ -89,33 +128,45 @@ ou usar push (websockets?) |
89 | 128 | - servidor nao esta a lidar com eventos resize. |
90 | 129 | - sock.bind(sockaddr) OSError: [Errno 48] Address already in use |
91 | 130 | - dizer quanto desconta em cada pergunta de escolha multipla |
92 | -- se houver erros a abrir ficheiros .yaml de perguntas, depois dos testes diz "No errors found". | |
93 | -- se faltarem files na especificação do teste, o check não detecta e factory não gera para essas perguntas. | |
131 | +- se houver erros a abrir ficheiros .yaml de perguntas, depois dos testes diz | |
132 | + "No errors found". | |
133 | +- se faltarem files na especificação do teste, o check não detecta e factory | |
134 | + não gera para essas perguntas. | |
94 | 135 | - nao esta a usar points das perguntas |
95 | 136 | - quando se clica no texto de uma opcao, salta para outro lado na pagina. |
96 | -- suportar cotacao to teste diferente de 20 (e.g. para juntar perguntas em papel). opcao "points: 18" que normaliza total para 18 em vez de 20. | |
137 | +- suportar cotacao to teste diferente de 20 (e.g. para juntar perguntas em | |
138 | + papel). opcao "points: 18" que normaliza total para 18 em vez de 20. | |
97 | 139 | - fazer package para instalar perguntations com pip. |
98 | 140 | - pymips: nao pode executar syscalls do spim. |
99 | 141 | - exception sqlalchemy relacionada com threads. |
100 | 142 | - acrescentar logger.conf que sirva de base. |
101 | -- questions.py textarea has a abspath which does not make sense! why is it there? not working for perguntations, but seems to work for aprendizations | |
102 | -- textarea foi modificado em aprendizations para receber cmd line args. corrigir aqui tb. | |
143 | +- questions.py textarea has a abspath which does not make sense! why is it | |
144 | + there? not working for perguntations, but seems to work for aprendizations | |
145 | +- textarea foi modificado em aprendizations para receber cmd line args. | |
146 | + corrigir aqui tb. | |
103 | 147 | - usar npm para instalar javascript |
104 | 148 | - se aluno entrar com l12345 rebenta. numa funcao get_... ver imagem no ipad |
105 | -- no test3 está contar 1.0 valores numa pergunta do tipo info? acontece para type: info, e não para type: information | |
106 | -- default correct in checkbox must be 1.0, so that the pairs (right,wrong) still work with `correct` left undefined. | |
149 | +- no test3 está contar 1.0 valores numa pergunta do tipo info? acontece para | |
150 | + type: info, e não para type: information | |
151 | +- default correct in checkbox must be 1.0, so that the pairs (right,wrong) | |
152 | + still work with `correct` left undefined. | |
107 | 153 | - textarea com codemirror |
108 | 154 | - decorador para user 0, evita o "if uid==0" em muitas funcoes. |
109 | -- numeric interval deve converter respostas que usam virgulas para pontos decimais | |
110 | -- self.testapp.get_json_filename_of_test(test_id) retorna None quando test_id nao existe. | |
111 | -- o eventloop está a bloquear. correção do teste é blocking. usar threadpoolexecutor? | |
112 | -- substituir get_event_loop por get_runnint_loop (ver https://docs.python.org/3/library/asyncio-eventloop.html) | |
155 | +- numeric interval deve converter respostas que usam virgulas para pontos | |
156 | + decimais | |
157 | +- `self.testapp.get_json_filename_of_test(test_id)` retorna None quando test_id | |
158 | + nao existe. | |
159 | +- o eventloop está a bloquear. correção do teste é blocking. usar | |
160 | + threadpoolexecutor? | |
161 | +- substituir get_event_loop por get_runnint_loop | |
113 | 162 | - review nao esta a funcionar |
114 | -- servir imagens das perguntas não funciona. Necessario passar a ref da pergunta no link para poder ajustar o path no FileHandler. | |
163 | +- servir imagens das perguntas não funciona. Necessario passar a ref da | |
164 | + pergunta no link para poder ajustar o path no FileHandler. | |
115 | 165 | - a primeira coluna da tabela admin deveria estar sempre ordenada. |
116 | 166 | - abortar depois de testar todas as perguntas, caso haja algum erro. |
117 | 167 | - imagens jpg/png nas perguntas. |
118 | -- initdb está a inicializar com passwords iguais aos numeros. deveria ser vazio para alunos definirem. | |
168 | +- initdb está a inicializar com passwords iguais aos numeros. deveria ser vazio | |
169 | + para alunos definirem. | |
119 | 170 | - upgrade popper e fazer link. |
120 | 171 | - mover scripts js para head, com defer. ver todos os templates. |
121 | 172 | - update fontawesome to 5. |
... | ... | @@ -125,7 +176,8 @@ ou usar push (websockets?) |
125 | 176 | - md_to_html() nao usa o segundo argumento q. pode retirar-se dos templates? |
126 | 177 | - config/logger.yaml ainda é do cherrypy... |
127 | 178 | - uniformizar question.py com a de aprendizations... |
128 | -- qual a diferenca entre md_to_html e md_to_html_review, parece desnecessario haver dois. | |
179 | +- qual a diferenca entre md_to_html e md_to_html_review, parece desnecessario | |
180 | + haver dois. | |
129 | 181 | - converter markdown para mistune. |
130 | 182 | - como alterar configuracao para mostrar logs de debug? |
131 | 183 | - espaco no final das tabelas. |
... | ... | @@ -141,31 +193,43 @@ ou usar push (websockets?) |
141 | 193 | - text-numeric não está a gerar a pergunta. faltam templates? |
142 | 194 | - testar perguntas warning/warn |
143 | 195 | - qd user 0 faz logout rebenta. |
144 | -- Quando grava JSON do teste deve usar 'path' tal como definido na configuração e não expandido. Isto porque em OSX /home é /Users e quando se muda de um sistema para outro não encontra os testes. Assim, usando ~ na configuração deveria funcionar sempre. | |
145 | -- configuração do teste não joga bem com o do aprendizations. Em particular os scripts não ficam com o mesmo path!!! | |
196 | +- Quando grava JSON do teste deve usar 'path' tal como definido na configuração | |
197 | + e não expandido. Isto porque em OSX /home é /Users e quando se muda de um | |
198 | + sistema para outro não encontra os testes. Assim, usando ~ na configuração | |
199 | + deveria funcionar sempre. | |
200 | +- configuração do teste não joga bem com o do aprendizations. Em particular os | |
201 | + scripts não ficam com o mesmo path!!! | |
146 | 202 | - configurar pf em freebsd, port forward 80 -> 8080. documentacao |
147 | 203 | - barras com notas em grade estão desalinhadas. |
148 | 204 | - erros nos generators devem ser ERROR e não WARNING. |
149 | -- se directorio "logs" não existir no directorio actual aborta com mensagem de erro. | |
150 | -- se um teste tiver a mesma pergunta repetida (ref igual), rebenta na correcçao. As respostas são agregadas numa lista para cada ref. Ex: {'ref1': 'resposta1', 'ref2': ['resposta2a', 'resposta2b']} | |
151 | -- usar http://fontawesome.io/examples/ em vez dos do bootstrap3 | |
205 | +- se directorio "logs" não existir no directorio actual aborta com mensagem de | |
206 | + erro. | |
207 | +- se um teste tiver a mesma pergunta repetida (ref igual), rebenta na | |
208 | + correcçao. As respostas são agregadas numa lista para cada ref. Ex: {'ref1': | |
209 | + 'resposta1', 'ref2': ['resposta2a', 'resposta2b']} | |
210 | +- usar [](http://fontawesome.io/examples/) em vez dos do bootstrap3 | |
152 | 211 | - se pergunta tiver 'type:' errado, rebenta. |
153 | 212 | - se submeter um teste so com information, da divisao por zero. |
154 | -- se save_answers nao existir, da warning que nao serao gravados, mas sao sempre gravados! pagina de administracao diz --not being saved-- | |
213 | +- se save_answers nao existir, da warning que nao serao gravados, mas sao | |
214 | + sempre gravados! pagina de administracao diz --not being saved-- | |
155 | 215 | - first login é INFO e não WARNING |
156 | 216 | - /review não mostra imagens porque precisa que teste esteja a decorrer... |
157 | 217 | - visualizar um teste ja realizado na página de administração |
158 | -- Depois da correcção, mostra testes realizados que não foram realizados pelo próprio | |
159 | -- detectar se janela perde focus e alertar o prof (http://stackoverflow.com/questions/1060008/is-there-a-way-to-detect-if-a-browser-window-is-not-currently-active) | |
160 | -- server nao esta a receber eventos focus/blur dos utilizadores diferentes de '0', estranho... | |
218 | +- Depois da correcção, mostra testes realizados que não foram realizados pelo | |
219 | + próprio | |
220 | +- detectar se janela perde focus e alertar o prof | |
221 | +- server nao esta a receber eventos focus/blur dos utilizadores diferentes de | |
222 | + '0', estranho... | |
161 | 223 | - permitir adicionar imagens nas perguntas. |
162 | 224 | - detect_unfocus.js so funciona se estiver inline no html. porquê??? |
163 | 225 | - inserir novo aluno /admin não fecha. |
164 | 226 | - se aluno desistir, ainda fica marcado como online |
165 | 227 | - give dá None em vez de 0.0 |
166 | 228 | - debug mode: log levels not working |
167 | -- Se aluno fizer logout, o teste não é gravado e ficamos sem registo do teste que o aluno viu. | |
168 | -- criar sqlalchemy sessions dentro de app de modo a estarem associadas a requests. ver se é facil usar with db:(...) para criar e fechar sessão. | |
229 | +- Se aluno fizer logout, o teste não é gravado e ficamos sem registo do teste | |
230 | + que o aluno viu. | |
231 | +- criar sqlalchemy sessions dentro de app de modo a estarem associadas a | |
232 | + requests. ver se é facil usar with db:(...) para criar e fechar sessão. | |
169 | 233 | - sqlalchemy queixa-se de threads. |
170 | 234 | - SQLAlchemy em vez da classe database. |
171 | 235 | - replace sys.exit calls |
... | ... | @@ -174,20 +238,21 @@ ou usar push (websockets?) |
174 | 238 | - configuracao dos logs cherrypy para se darem bem com os outros |
175 | 239 | - browser e ip usados gravado no test. |
176 | 240 | - botões allow all/deny all. |
177 | -- mostrar botão de reset apenas no final da pagina, com edit para escrever o número. | |
178 | -- aluno faz login, mas fecha browser, ficando no estado (online,deny). Ao tentar login com outro browser está deny e o prof não consegue pô-lo em allow pois já não está na lista. => solucao é manter todos os alunos numa tabela. | |
179 | -- pagina de login nao esta a apresentar bem. parece que precisa de autorizacao para aceder a /static... | |
241 | +- mostrar botão de reset apenas no final da pagina, com edit para escrever o | |
242 | + número. | |
243 | +- aluno faz login, mas fecha browser, ficando no estado (online,deny). Ao | |
244 | + tentar login com outro browser está deny e o prof não consegue pô-lo em allow | |
245 | + pois já não está na lista. => solucao é manter todos os alunos numa tabela. | |
246 | +- pagina de login nao esta a apresentar bem. parece que precisa de autorizacao | |
247 | + para aceder a /static... | |
180 | 248 | - Não mostrar Professor nos activos em /admin |
181 | 249 | - /admin mostrar actualizações automaticamente? |
182 | 250 | - se no teste uma das "ref" nao existir nos ficheiros de perguntas, rebenta. |
183 | -- alunos podem estar online, mas browser perder sessao => nao conseguem mais entrar porque a App pensa que estão online. Permitir login e dar o mesmo teste. | |
184 | -- pagina de management dos alunos. | |
185 | - mostrar online ordenados por hora de login, offline por número. | |
186 | - permitir reset da pw e allow/disallow | |
251 | +- alunos podem estar online, mas browser perder sessao => nao conseguem mais | |
252 | + entrar porque a App pensa que estão online. Permitir login e dar o mesmo | |
253 | + teste. | |
254 | +- pagina de management dos alunos. mostrar online ordenados por hora de login, | |
255 | + offline por número. permitir reset da pw e allow/disallow | |
187 | 256 | - script de correcção pode enviar dicionario yaml com grade e comentarios. ex: |
188 | - grade: 0.5 | |
189 | - comments: Falhou na função xpto. | |
190 | - os comentários são guardados no teste (ficheiro) ou enviados para o browser no modo practice. | |
191 | -- testar regex na definicao das perguntas. como se faz rawstring em yaml? | |
192 | - singlequote? problemas de backslash??? sim... necessário fazer \\ em varios casos, mas não é claro! e.g. \n é convertido em espaço mas \w é convertido em \\ e w. Solução (http://stackoverflow.com/questions/10771163/python-interpreting-a-regex-from-a-yaml-config-file) é fazer | |
193 | - correct: !regex '^(yes|no)' | |
257 | + grade: 0.5 comments: Falhou na função xpto. os comentários são guardados no | |
258 | + teste (ficheiro) ou enviados para o browser no modo practice. | ... | ... |
perguntations/__init__.py
perguntations/app.py
... | ... | @@ -86,7 +86,7 @@ class App(): |
86 | 86 | session.close() |
87 | 87 | |
88 | 88 | # ------------------------------------------------------------------------ |
89 | - def __init__(self, conf): | |
89 | + def __init__(self, conf) -> None: | |
90 | 90 | self.online = dict() # {uid: {'student':{...}, 'test': {...}}, ...} |
91 | 91 | self.allowed = set() # '0' is hardcoded to allowed elsewhere |
92 | 92 | self.unfocus = set() # set of students that have no browser focus |
... | ... | @@ -127,9 +127,10 @@ class App(): |
127 | 127 | self._correct_tests() |
128 | 128 | |
129 | 129 | # ------------------------------------------------------------------------ |
130 | - def _correct_tests(self): | |
130 | + def _correct_tests(self) -> None: | |
131 | 131 | with self._db_session() as sess: |
132 | - # Find which tests have to be corrected | |
132 | + # Find which tests have to be corrected. | |
133 | + # already corrected tests are not included. | |
133 | 134 | dbtests = sess.query(Test)\ |
134 | 135 | .filter(Test.ref == self.testfactory['ref'])\ |
135 | 136 | .filter(Test.state == "SUBMITTED")\ | ... | ... |
perguntations/initdb.py
... | ... | @@ -14,6 +14,8 @@ from concurrent.futures import ThreadPoolExecutor |
14 | 14 | # installed packages |
15 | 15 | import bcrypt |
16 | 16 | import sqlalchemy as sa |
17 | +import sqlalchemy.orm | |
18 | +from sqlalchemy.exc import IntegrityError | |
17 | 19 | |
18 | 20 | # this project |
19 | 21 | from perguntations.models import Base, Student |
... | ... | @@ -119,8 +121,7 @@ def insert_students_into_db(session, students): |
119 | 121 | session.add_all([Student(id=s['uid'], name=s['name'], password=s['pw']) |
120 | 122 | for s in students]) |
121 | 123 | session.commit() |
122 | - | |
123 | - except sa.exc.IntegrityError: | |
124 | + except IntegrityError: | |
124 | 125 | print('!!! Integrity error. Users already in database. Aborted !!!\n') |
125 | 126 | session.rollback() |
126 | 127 | |
... | ... | @@ -160,7 +161,7 @@ def main(): |
160 | 161 | print(f'Using database: {args.db}') |
161 | 162 | engine = sa.create_engine(f'sqlite:///{args.db}', echo=False) |
162 | 163 | Base.metadata.create_all(engine) # Criates schema if needed |
163 | - SessionMaker = sa.orm.sessionmaker(bind=engine) | |
164 | + SessionMaker = sqlalchemy.orm.sessionmaker(bind=engine) | |
164 | 165 | session = SessionMaker() |
165 | 166 | |
166 | 167 | # --- make list of students to insert | ... | ... |
perguntations/main.py
... | ... | @@ -8,6 +8,7 @@ Main file that starts the application and the web server |
8 | 8 | # python standard library |
9 | 9 | import argparse |
10 | 10 | import logging |
11 | +import logging.config | |
11 | 12 | import os |
12 | 13 | from os import environ, path |
13 | 14 | import ssl |
... | ... | @@ -64,7 +65,7 @@ def parse_cmdline_arguments(): |
64 | 65 | |
65 | 66 | |
66 | 67 | # ---------------------------------------------------------------------------- |
67 | -def get_logger_config(debug=False): | |
68 | +def get_logger_config(debug=False) -> dict: | |
68 | 69 | ''' |
69 | 70 | Load logger configuration from ~/.config directory if exists, |
70 | 71 | otherwise set default paramenters. |
... | ... | @@ -113,7 +114,7 @@ def get_logger_config(debug=False): |
113 | 114 | |
114 | 115 | |
115 | 116 | # ---------------------------------------------------------------------------- |
116 | -def main(): | |
117 | +def main() -> None: | |
117 | 118 | ''' |
118 | 119 | Tornado web server |
119 | 120 | ''' | ... | ... |
perguntations/templates/test.html
... | ... | @@ -156,6 +156,13 @@ |
156 | 156 | viewportMargin: Infinity, |
157 | 157 | matchBrackets: true, |
158 | 158 | styleActiveLine: true, |
159 | + indentUnit: 4, | |
160 | + indentWithTabs: false, | |
161 | + smartIndent: true, | |
162 | + extraKeys: { | |
163 | + "Tab": (cm) => cm.execCommand("indentMore"), | |
164 | + "Shift-Tab": (cm) => cm.execCommand("indentLess"), | |
165 | + }, | |
159 | 166 | }); |
160 | 167 | }); |
161 | 168 | </script> | ... | ... |
perguntations/test.py
... | ... | @@ -17,6 +17,16 @@ logger = logging.getLogger(__name__) |
17 | 17 | class Test(dict): |
18 | 18 | ''' |
19 | 19 | Each instance Test() is a concrete test of a single student. |
20 | + A test can be in one of the states: ACTIVE, SUBMITTED, CORRECTED, QUIT | |
21 | + Methods: | |
22 | + t.start(student) - marks start of test (register time and state) | |
23 | + t.reset_answers() - remove all answers from the test | |
24 | + t.update_answer(ref, ans) - update answer of a given question | |
25 | + t.submit(answers_dict) - update answers, register time and state | |
26 | + t.correct_async() | |
27 | + t.correct() - corrects questions and compute grade, register state | |
28 | + t.giveup() - register the test as given up, answers are not corrected | |
29 | + t.save_json(filename) - save the current test to file in JSON format | |
20 | 30 | ''' |
21 | 31 | |
22 | 32 | # ------------------------------------------------------------------------ | ... | ... |