Commit be1efae85b214151d0b1d749b17e9d3664ea3047

Authored by Miguel Barão
1 parent 24244d74
Exists in master and in 1 other branch dev

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)
... ...