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,6 +8,7 @@ | ||
| 8 | 8 | ||
| 9 | # TODO | 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 | - alterar o script json2md.py em conformidade | 12 | - alterar o script json2md.py em conformidade |
| 12 | - Menu para professor com link para /results e /students | 13 | - Menu para professor com link para /results e /students |
| 13 | - implementar singlepage/multipage. Fazer uma class para single page que trate de andar gerir o avanco e correcao das perguntas | 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,21 +102,26 @@ class Root(object): | ||
| 102 | # store results in the database | 102 | # store results in the database |
| 103 | t.update_answers(ans) | 103 | t.update_answers(ans) |
| 104 | t.correct() | 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 | def parse_arguments(): | 127 | def parse_arguments(): |
templates/test.html
| @@ -189,10 +189,28 @@ | @@ -189,10 +189,28 @@ | ||
| 189 | % endif # modal | 189 | % endif # modal |
| 190 | % endif # show_hints | 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 | % if t['show_points']: | 211 | % if t['show_points']: |
| 194 | <p class="text-right"> | 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 | <p> | 214 | <p> |
| 197 | % endif | 215 | % endif |
| 198 | 216 |
test.py
| @@ -23,7 +23,7 @@ def read_configuration(filename): | @@ -23,7 +23,7 @@ def read_configuration(filename): | ||
| 23 | test['title'] = str(test.get('title', '')) | 23 | test['title'] = str(test.get('title', '')) |
| 24 | test['show_hints'] = bool(test.get('show_hints', False)) | 24 | test['show_hints'] = bool(test.get('show_hints', False)) |
| 25 | test['show_points'] = bool(test.get('show_points', False)) | 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 | test['save_answers'] = bool(test.get('save_answers', True)) | 27 | test['save_answers'] = bool(test.get('save_answers', True)) |
| 28 | if test['save_answers']: | 28 | if test['save_answers']: |
| 29 | if 'answers_dir' not in test: | 29 | if 'answers_dir' not in test: |