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,9 +114,11 @@ class App():
114 logger.info('Students not yet allowed to login.') 114 logger.info('Students not yet allowed to login.')
115 115
116 # pre-generate tests 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 async def login(self, uid, try_pw): 124 async def login(self, uid, try_pw):
@@ -458,7 +460,7 @@ class App(): @@ -458,7 +460,7 @@ class App():
458 460
459 enrolled = set(s[0] for s in self._get_all_students()) # in database 461 enrolled = set(s[0] for s in self._get_all_students()) # in database
460 self.allowed.update(allowed_in_file & enrolled) 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 filename) 464 filename)
463 465
464 not_enrolled = allowed_in_file - enrolled 466 not_enrolled = allowed_in_file - enrolled
perguntations/test.py
@@ -49,7 +49,7 @@ class TestFactory(dict): @@ -49,7 +49,7 @@ class TestFactory(dict):
49 'autosubmit': False, 49 'autosubmit': False,
50 'debug': False, 50 'debug': False,
51 'show_ref': False, 51 'show_ref': False,
52 - # 'allow_students': None, 52 + 'allow_students': [],
53 }) 53 })
54 self.update(conf) 54 self.update(conf)
55 55
@@ -123,7 +123,8 @@ class TestFactory(dict): @@ -123,7 +123,8 @@ class TestFactory(dict):
123 if qmissing: 123 if qmissing:
124 raise TestFactoryException(f'Could not find questions {qmissing}.') 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 def check_test_ref(self): 130 def check_test_ref(self):
@@ -237,27 +238,29 @@ class TestFactory(dict): @@ -237,27 +238,29 @@ class TestFactory(dict):
237 nerr = 0 # count errors during questions generation 238 nerr = 0 # count errors during questions generation
238 239
239 for qlist in self['questions']: 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 # setup scale 265 # setup scale
263 total_points = sum(q['points'] for q in questions) 266 total_points = sum(q['points'] for q in questions)