Commit 623ce1101b09268cee36d39375307b22798192a8
1 parent
23013d8c
Exists in
master
and in
1 other branch
- added a 'train_mode'. The submission will correct and show the test with the results obtained.
Showing
4 changed files
with
41 additions
and
17 deletions
Show diff stats
BUGS.md
| ... | ... | @@ -8,6 +8,7 @@ |
| 8 | 8 | |
| 9 | 9 | # TODO |
| 10 | 10 | |
| 11 | +- implementar train_mode:False em que a submissão do teste só faz a correcção e mantem-se na mesma página para o aluno corrigir as respostas. | |
| 11 | 12 | - alterar o script json2md.py em conformidade |
| 12 | 13 | - Menu para professor com link para /results e /students |
| 13 | 14 | - implementar singlepage/multipage. Fazer uma class para single page que trate de andar gerir o avanco e correcao das perguntas | ... | ... |
serve.py
| ... | ... | @@ -102,21 +102,26 @@ class Root(object): |
| 102 | 102 | # store results in the database |
| 103 | 103 | t.update_answers(ans) |
| 104 | 104 | t.correct() |
| 105 | - if t['save_answers']: | |
| 106 | - t.save_json(self.testconf['answers_dir']) | |
| 107 | - self.database.save_test(t) | |
| 108 | - | |
| 109 | - # ---- Expire session ---- | |
| 110 | - self.loggedin.discard(t['number']) | |
| 111 | - cherrypy.lib.sessions.expire() # session coockie expires client side | |
| 112 | - cherrypy.session['userid'] = cherrypy.request.login = None | |
| 113 | - cherrypy.log.error('Student %s terminated with grade = %.2f points.' % | |
| 114 | - (t['number'], t['grade']), 'APPLICATION') | |
| 115 | - | |
| 116 | - # ---- Show result to student ---- | |
| 117 | - grades = self.database.student_grades(t['number']) | |
| 118 | - template = self.templates.get_template('grade.html') | |
| 119 | - return template.render(t=t, allgrades=grades) | |
| 105 | + | |
| 106 | + if t['train_mode']: | |
| 107 | + raise cherrypy.HTTPRedirect('/test') | |
| 108 | + | |
| 109 | + else: | |
| 110 | + if t['save_answers']: | |
| 111 | + t.save_json(self.testconf['answers_dir']) | |
| 112 | + self.database.save_test(t) | |
| 113 | + | |
| 114 | + # ---- Expire session ---- | |
| 115 | + self.loggedin.discard(t['number']) | |
| 116 | + cherrypy.lib.sessions.expire() # session coockie expires client side | |
| 117 | + cherrypy.session['userid'] = cherrypy.request.login = None | |
| 118 | + cherrypy.log.error('Student %s terminated with grade = %.2f points.' % | |
| 119 | + (t['number'], t['grade']), 'APPLICATION') | |
| 120 | + | |
| 121 | + # ---- Show result to student ---- | |
| 122 | + grades = self.database.student_grades(t['number']) | |
| 123 | + template = self.templates.get_template('grade.html') | |
| 124 | + return template.render(t=t, allgrades=grades) | |
| 120 | 125 | |
| 121 | 126 | # ============================================================================ |
| 122 | 127 | def parse_arguments(): | ... | ... |
templates/test.html
| ... | ... | @@ -189,10 +189,28 @@ |
| 189 | 189 | % endif # modal |
| 190 | 190 | % endif # show_hints |
| 191 | 191 | |
| 192 | + % if t['train_mode'] and 'grade' in q: | |
| 193 | + % if q['grade'] > 0.9: | |
| 194 | + <div class="alert alert-success" role="alert"> | |
| 195 | + <span class="glyphicon glyphicon-ok" aria-hidden="true"></span> | |
| 196 | + ${round(q['grade'] * q['points'] / total_points * 20.0, 1)} valores | |
| 197 | + </div> | |
| 198 | + % elif q['grade'] > 0.5: | |
| 199 | + <div class="alert alert-warning" role="alert"> | |
| 200 | + <span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span> | |
| 201 | + ${round(q['grade'] * q['points'] / total_points * 20.0, 1)} valores | |
| 202 | + </div> | |
| 203 | + % else: | |
| 204 | + <div class="alert alert-danger" role="alert"> | |
| 205 | + <span class="glyphicon glyphicon-remove" aria-hidden="true"></span> | |
| 206 | + ${round(q['grade'] * q['points'] / total_points * 20.0, 1)} valores | |
| 207 | + </div> | |
| 208 | + % endif | |
| 209 | + % endif | |
| 192 | 210 | |
| 193 | 211 | % if t['show_points']: |
| 194 | 212 | <p class="text-right"> |
| 195 | - <small>(${q['points'] / total_points * 20.0} pontos)</small> | |
| 213 | + <small>(${round(q['points'] / total_points * 20.0, 1)} pontos)</small> | |
| 196 | 214 | <p> |
| 197 | 215 | % endif |
| 198 | 216 | ... | ... |
test.py
| ... | ... | @@ -23,7 +23,7 @@ def read_configuration(filename): |
| 23 | 23 | test['title'] = str(test.get('title', '')) |
| 24 | 24 | test['show_hints'] = bool(test.get('show_hints', False)) |
| 25 | 25 | test['show_points'] = bool(test.get('show_points', False)) |
| 26 | - test['singlepage'] = bool(test.get('singlepage', True)) | |
| 26 | + test['train_mode'] = bool(test.get('train_mode', False)) | |
| 27 | 27 | test['save_answers'] = bool(test.get('save_answers', True)) |
| 28 | 28 | if test['save_answers']: |
| 29 | 29 | if 'answers_dir' not in test: | ... | ... |