def do_examination(examination_id=0): examination = Examination.query.get_or_404(examination_id) result = g.user.results.filter_by(examination_id=examination.id).first() uid = 'u-%d-e-%d' % (g.user.id, examination.id) if result and result.is_finished(): session.pop(uid, None) return redirect(url_for('result.show', result_id=result.id)) start_time = None if uid in session: start_time = session[uid] if datetime.datetime.now() > session[uid] + datetime.timedelta(minutes=examination.limited_time, seconds=30): session.pop(uid, None) result = g.user.results.filter_by(examination_id=examination.id).first() if result: if result.is_doing(): result.status = RESULT.STATUS_FINISHED db.session.add(result) db.session.commit() return redirect(url_for('result.show', result_id=result.id)) else: flash('Error !', category='danger') return redirect(url_for('index')) else: result = Result(g.user, examination, 0) db.session.add(result) db.session.commit() session[uid] = datetime.datetime.now() form = DoExaminationForm(obj=examination) counter = 0 for sub_form in form.questions: sub_form.answers.choices = [(str(answer.id), answer.content) for answer in examination.questions[counter].answers] sub_form.question_id.data = examination.questions[counter].id sub_form.answers.label.text = examination.questions[counter].content counter += 1 correct = 0 if form.validate_on_submit(): for entry in form.questions.data: if examination.questions.filter_by(id=int(entry['question_id'])).first().correct_id == int(entry['answers']): correct += 1 else: for entry in form.questions.data: if entry['answers'].isdigit() and examination.questions.filter_by(id=int(entry['question_id'])).first().correct_id == int(entry['answers']): correct += 1 result = Result.query.filter_by(user_id=g.user.id, examination_id=examination.id).first() if result and request.method == 'POST': result.score = correct result.status = RESULT.STATUS_FINISHED db.session.add(result) db.session.commit() return redirect(url_for('result.show', result_id=result.id)) remain = examination.limited_time * 60 if start_time: remain = examination.limited_time - (datetime.datetime.now() - start_time).seconds return render_template('examination/do_examination.html', form=form, examination=examination, remain=remain)