Commit 94b0dd76345d616bd319a464778ad836923185ec
1 parent
f23c0e87
Exists in
master
and in
1 other branch
fixes error in checkbox questions when shuffle=false.
Showing
3 changed files
with
20 additions
and
15 deletions
Show diff stats
aprendizations/learnapp.py
aprendizations/questions.py
| ... | ... | @@ -50,8 +50,6 @@ class Question(dict): |
| 50 | 50 | |
| 51 | 51 | async def correct_async(self) -> None: |
| 52 | 52 | self.correct() |
| 53 | - # loop = asyncio.get_running_loop() | |
| 54 | - # await loop.run_in_executor(None, self.correct) | |
| 55 | 53 | |
| 56 | 54 | def set_defaults(self, d: QDict) -> None: |
| 57 | 55 | 'Add k:v pairs from default dict d for nonexistent keys' |
| ... | ... | @@ -94,7 +92,9 @@ class QuestionRadio(Question): |
| 94 | 92 | for x in range(n)] |
| 95 | 93 | |
| 96 | 94 | if len(self['correct']) != n: |
| 97 | - msg = f'Options and correct mismatch in "{self["ref"]}"' | |
| 95 | + msg = (f'Options and correct mismatch in ' | |
| 96 | + f'"{self["ref"]}", file "{self["filename"]}".') | |
| 97 | + logger.error(msg) | |
| 98 | 98 | raise QuestionException(msg) |
| 99 | 99 | |
| 100 | 100 | if self['shuffle']: |
| ... | ... | @@ -168,18 +168,20 @@ class QuestionCheckbox(Question): |
| 168 | 168 | })) |
| 169 | 169 | |
| 170 | 170 | if len(self['correct']) != n: |
| 171 | - msg = f'Options and correct mismatch in "{self["ref"]}"' | |
| 171 | + msg = (f'Options and correct size mismatch in ' | |
| 172 | + f'"{self["ref"]}", file "{self["filename"]}".') | |
| 173 | + logger.error(msg) | |
| 172 | 174 | raise QuestionException(msg) |
| 173 | 175 | |
| 174 | 176 | # if an option is a list of (right, wrong), pick one |
| 175 | - # FIXME it's possible that all options are chosen wrong | |
| 176 | 177 | options = [] |
| 177 | 178 | correct = [] |
| 178 | 179 | for o, c in zip(self['options'], self['correct']): |
| 179 | 180 | if isinstance(o, list): |
| 180 | 181 | r = random.randint(0, 1) |
| 181 | 182 | o = o[r] |
| 182 | - c = c if r == 0 else -c | |
| 183 | + if r == 1: | |
| 184 | + c = -c | |
| 183 | 185 | options.append(str(o)) |
| 184 | 186 | correct.append(float(c)) |
| 185 | 187 | |
| ... | ... | @@ -187,8 +189,11 @@ class QuestionCheckbox(Question): |
| 187 | 189 | # and apply to `options` and `correct` |
| 188 | 190 | if self['shuffle']: |
| 189 | 191 | perm = random.sample(range(n), k=self['choose']) |
| 190 | - self['options'] = [str(options[i]) for i in perm] | |
| 191 | - self['correct'] = [float(correct[i]) for i in perm] | |
| 192 | + self['options'] = [options[i] for i in perm] | |
| 193 | + self['correct'] = [correct[i] for i in perm] | |
| 194 | + else: | |
| 195 | + self['options'] = options[:self['choose']] | |
| 196 | + self['correct'] = correct[:self['choose']] | |
| 192 | 197 | |
| 193 | 198 | # ------------------------------------------------------------------------ |
| 194 | 199 | # can return negative values for wrong answers |
| ... | ... | @@ -443,20 +448,20 @@ class QFactory(object): |
| 443 | 448 | 'textarea': QuestionTextArea, |
| 444 | 449 | # -- informative panels -- |
| 445 | 450 | 'information': QuestionInformation, |
| 451 | + 'success': QuestionInformation, | |
| 446 | 452 | 'warning': QuestionInformation, |
| 447 | 453 | 'alert': QuestionInformation, |
| 448 | - 'success': QuestionInformation, | |
| 449 | 454 | } |
| 450 | 455 | |
| 451 | - def __init__(self, question_dict: QDict = QDict({})) -> None: | |
| 452 | - self.question = question_dict | |
| 456 | + def __init__(self, qdict: QDict = QDict({})) -> None: | |
| 457 | + self.question = qdict | |
| 453 | 458 | |
| 454 | 459 | # ----------------------------------------------------------------------- |
| 455 | 460 | # Given a ref returns an instance of a descendent of Question(), |
| 456 | 461 | # i.e. a question object (radio, checkbox, ...). |
| 457 | 462 | # ----------------------------------------------------------------------- |
| 458 | 463 | def generate(self) -> Question: |
| 459 | - logger.debug(f'[generate] "{self.question["ref"]}"...') | |
| 464 | + logger.debug(f'[QFactory.generate] "{self.question["ref"]}"...') | |
| 460 | 465 | # Shallow copy so that script generated questions will not replace |
| 461 | 466 | # the original generators |
| 462 | 467 | q = self.question.copy() |
| ... | ... | @@ -487,7 +492,7 @@ class QFactory(object): |
| 487 | 492 | |
| 488 | 493 | # ----------------------------------------------------------------------- |
| 489 | 494 | async def generate_async(self) -> Question: |
| 490 | - logger.debug(f'[generate_async] "{self.question["ref"]}"...') | |
| 495 | + logger.debug(f'[QFactory.generate_async] "{self.question["ref"]}"...') | |
| 491 | 496 | # Shallow copy so that script generated questions will not replace |
| 492 | 497 | # the original generators |
| 493 | 498 | q = self.question.copy() | ... | ... |
aprendizations/tools.py
| ... | ... | @@ -145,7 +145,7 @@ def load_yaml(filename: str, default: Any = None) -> Any: |
| 145 | 145 | logger.error(f'Cannot open "{filename}": not found') |
| 146 | 146 | except PermissionError: |
| 147 | 147 | logger.error(f'Cannot open "{filename}": no permission') |
| 148 | - except IOError: | |
| 148 | + except OSError: | |
| 149 | 149 | logger.error(f'Cannot open file "{filename}"') |
| 150 | 150 | else: |
| 151 | 151 | with f: | ... | ... |