def quiz(self, quiz_id: int, block: int = None, question: int = None): quiz = model.Quiz.query.get(quiz_id) if quiz is None: return abort(404) fill = model.FilledQuiz.query\ .filter_by(user_id=current_user.id)\ .filter_by(quiz_id=quiz_id).first() if fill is None: fill = model.FilledQuiz( user_id=current_user.id, quiz_id=quiz_id) model.db.session.add(fill) model.db.session.commit() if block is None: block = fill.current_block else: finish = request.args.get('finish', False) block = quiz.blocks.filter_by(order_number=block).first() if finish: fill.finished_blocks.append(block) model.db.session.commit() if block is None: block = quiz.blocks.order_by(model.Block.order_number).first() if block in fill.finished_blocks: answers = fill.answers\ .join(model.Question)\ .filter(model.Question.block_id == block.id)\ .order_by(model.Question.order_number) block_points = model.int_or_float( sum([ans.points for ans in answers]) ) return self.render('answers.html', block=block, answers=answers, block_points=block_points, total=fill.points) question = question or 1 question = block.questions\ .filter_by(order_number = question)\ .first() if question not in fill.available_questions: return abort(403) if block == fill.current_block: form = QuestionForm.from_model(question, fill) return self.render('quiz.html', form=form) else: answer = fill.answers\ .filter(model.Answer.question_id == question.id)\ .first() return self. render('answer.html', answer=answer)