From 7f38a110684591236eb205c0678d8e6b0abfae05 Mon Sep 17 00:00:00 2001 From: Miguel Barao Date: Tue, 20 Nov 2018 16:06:00 +0000 Subject: [PATCH] merged questions.py from perguntations --- BUGS.md | 4 +++- questions.py | 26 +++++++++++++------------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/BUGS.md b/BUGS.md index ee94d55..fe45c8d 100644 --- a/BUGS.md +++ b/BUGS.md @@ -1,7 +1,8 @@ # BUGS -- max tries não avança para seguinte ao fim das tentativas. +- quando a pergunta devolve comments, este é apresentado, mas fica persistente nas tentativas seguintes. devia ser limpo apos a segunda submissao. +- a opcao max_tries na especificacao das perguntas é cumbersome... usar antes tries? - tabelas nas perguntas radio/checkbox não ocupam todo o espaço como em question. - nas perguntas de código, quando erra nao se devia acrescentar mesma pergunta no fim. @@ -28,6 +29,7 @@ # FIXED +- max tries não avança para seguinte ao fim das tentativas. - ver se ref guardada na BD é só a da pergunta ou inclui o path. -> so ref - nao esta a guardar as respostas erradas. - reload do topic não gera novas perguntas (alunos abusavam do reload) diff --git a/questions.py b/questions.py index 4f17fa1..038a8ff 100644 --- a/questions.py +++ b/questions.py @@ -1,11 +1,12 @@ -# base +# python standard library import random import re from os import path import logging +import asyncio -# packages +# user installed libraries import yaml # this project @@ -41,7 +42,7 @@ class Question(dict): 'files': {}, }) - # FIXME unused. does childs need do override this? + # FIXME unused. do childs need do override this? # def updateAnswer(answer=None): # self['answer'] = answer @@ -49,6 +50,11 @@ class Question(dict): self['grade'] = 0.0 return 0.0 + async def correct_async(self): + loop = asyncio.get_running_loop() + grade = await loop.run_in_executor(None, self.correct) + return grade + def set_defaults(self, d): 'Add k:v pairs from default dict d for nonexistent keys' for k,v in d.items(): @@ -148,7 +154,7 @@ class QuestionCheckbox(Question): # set defaults if missing self.set_defaults({ 'text': '', - 'correct': [1.0] * n, # useful for questionaries + 'correct': [0.0] * n, # useful for questionaries 'shuffle': True, 'discount': True, 'choose': n, # number of options @@ -184,7 +190,7 @@ class QuestionCheckbox(Question): if self['answer'] is not None: sum_abs = sum(abs(p) for p in self['correct']) if sum_abs < 1e-6: # case correct [0,...,0] avoid div-by-zero - self['grade'] = 0.0 + self['grade'] = 1.0 else: x = 0.0 @@ -293,15 +299,9 @@ class QuestionNumericInterval(Question): super().correct() if self['answer'] is not None: lower, upper = self['correct'] - try: - answer = float(self['answer']) - - # TODO: - # alternative using locale (1.2 vs 1,2) - # import locale - # locale.setlocale(locale.LC_ALL, 'pt_PT') - # answer = locale.atof(self['answer']) + try: # replace , by . and convert to float + answer = float(self['answer'].replace(',', '.', 1)) except ValueError: self['comments'] = 'A resposta não é numérica.' self['grade'] = 0.0 -- libgit2 0.21.2