Commit be1efae85b214151d0b1d749b17e9d3664ea3047
1 parent
24244d74
Exists in
master
and in
1 other branch
new feature: in the test yaml, choose several questions from a list
instead of just one.
Showing
2 changed files
with
32 additions
and
27 deletions
Show diff stats
perguntations/app.py
| ... | ... | @@ -114,9 +114,11 @@ class App(): |
| 114 | 114 | logger.info('Students not yet allowed to login.') |
| 115 | 115 | |
| 116 | 116 | # pre-generate tests |
| 117 | - logger.info('Generating tests for %d students...', len(self.allowed)) | |
| 118 | - self._pregenerate_tests(len(self.allowed)) | |
| 119 | - logger.info('Tests done.') | |
| 117 | + if self.allowed: | |
| 118 | + logger.info('Generating tests for %d students...', len(self.allowed)) | |
| 119 | + self._pregenerate_tests(len(self.allowed)) | |
| 120 | + else: | |
| 121 | + logger.info('No tests were generated.') | |
| 120 | 122 | |
| 121 | 123 | # ------------------------------------------------------------------------ |
| 122 | 124 | async def login(self, uid, try_pw): |
| ... | ... | @@ -458,7 +460,7 @@ class App(): |
| 458 | 460 | |
| 459 | 461 | enrolled = set(s[0] for s in self._get_all_students()) # in database |
| 460 | 462 | self.allowed.update(allowed_in_file & enrolled) |
| 461 | - logger.info('Allowed %d students provided in %s.', len(self.allowed), | |
| 463 | + logger.info('Allowed %d students provided in "%s"', len(self.allowed), | |
| 462 | 464 | filename) |
| 463 | 465 | |
| 464 | 466 | not_enrolled = allowed_in_file - enrolled | ... | ... |
perguntations/test.py
| ... | ... | @@ -49,7 +49,7 @@ class TestFactory(dict): |
| 49 | 49 | 'autosubmit': False, |
| 50 | 50 | 'debug': False, |
| 51 | 51 | 'show_ref': False, |
| 52 | - # 'allow_students': None, | |
| 52 | + 'allow_students': [], | |
| 53 | 53 | }) |
| 54 | 54 | self.update(conf) |
| 55 | 55 | |
| ... | ... | @@ -123,7 +123,8 @@ class TestFactory(dict): |
| 123 | 123 | if qmissing: |
| 124 | 124 | raise TestFactoryException(f'Could not find questions {qmissing}.') |
| 125 | 125 | |
| 126 | - | |
| 126 | + # if isinstance(allow_students, str): FIXME | |
| 127 | + # try to o | |
| 127 | 128 | |
| 128 | 129 | # ------------------------------------------------------------------------ |
| 129 | 130 | def check_test_ref(self): |
| ... | ... | @@ -237,27 +238,29 @@ class TestFactory(dict): |
| 237 | 238 | nerr = 0 # count errors during questions generation |
| 238 | 239 | |
| 239 | 240 | for qlist in self['questions']: |
| 240 | - # choose one question variant | |
| 241 | - qref = random.choice(qlist['ref']) | |
| 242 | - | |
| 243 | - # generate instance of question | |
| 244 | - try: | |
| 245 | - question = await self.question_factory[qref].gen_async() | |
| 246 | - except QuestionException: | |
| 247 | - logger.error('Can\'t generate question "%s". Skipping.', qref) | |
| 248 | - nerr += 1 | |
| 249 | - continue | |
| 250 | - | |
| 251 | - # some defaults | |
| 252 | - if question['type'] in ('information', 'success', 'warning', | |
| 253 | - 'alert'): | |
| 254 | - question['points'] = qlist.get('points', 0.0) | |
| 255 | - else: | |
| 256 | - question['points'] = qlist.get('points', 1.0) | |
| 257 | - question['number'] = qnum # counter for non informative panels | |
| 258 | - qnum += 1 | |
| 259 | - | |
| 260 | - questions.append(question) | |
| 241 | + # choose list of question variants | |
| 242 | + choose = qlist.get('choose', 1) | |
| 243 | + qrefs = random.sample(qlist['ref'], k=choose) | |
| 244 | + | |
| 245 | + for qref in qrefs: | |
| 246 | + # generate instance of question | |
| 247 | + try: | |
| 248 | + question = await self.question_factory[qref].gen_async() | |
| 249 | + except QuestionException: | |
| 250 | + logger.error('Can\'t generate question "%s". Skipping.', qref) | |
| 251 | + nerr += 1 | |
| 252 | + continue | |
| 253 | + | |
| 254 | + # some defaults | |
| 255 | + if question['type'] in ('information', 'success', 'warning', | |
| 256 | + 'alert'): | |
| 257 | + question['points'] = qlist.get('points', 0.0) | |
| 258 | + else: | |
| 259 | + question['points'] = qlist.get('points', 1.0) | |
| 260 | + question['number'] = qnum # counter for non informative panels | |
| 261 | + qnum += 1 | |
| 262 | + | |
| 263 | + questions.append(question) | |
| 261 | 264 | |
| 262 | 265 | # setup scale |
| 263 | 266 | total_points = sum(q['points'] for q in questions) | ... | ... |