Пример #1
0
def answer(question_id):
    """
    Check if the answer to a question is correct
    """

    # make sure question is valid
    answers = loader.psets()['answers']
    if not question_id in answers:
        abort(404)

    # check if answer is correct
    answer = answers[question_id]
    correct = re.match(answer['answer'], request.form['answer']) != None

    # if question is correct and unanswered, user gets points
    count = db.session.query(Answer).filter_by(user_id=g.user.id).filter_by(question=question_id).\
            filter_by(correct=True).count()
    if count == 0 and correct:
        g.user.add_points(answer['points'])

    # log answer (for analytics)
    new_answer = Answer(question_id, g.user.id, request.form['answer'], correct)
    db.session.add(new_answer)
    db.session.commit()

    return util.json_success({
        'correct': correct,
        'points': answer['points'] if correct and count == 0 else 0
    })
Пример #2
0
    def percentage(self):
        """
        Calculate what percentage of the badge has been completed
        """

        # load metadata for badge
        toc = loader.toc()
        psets = loader.psets()
        metadata = loader.badges()[self.id]

        # iterate over each chapter required for the badge
        total = 0
        earned = 0
        for chapter in metadata['chapters']:
            # check which sections in the chapter have been read
            for section in toc[chapter]['sections']:
                if chapter in self.reads and section['id'] in self.reads[chapter]:
                    earned += settings.POINTS['section']
                total += settings.POINTS['section']

            # add on points for pset
            earned += self.points[chapter]
            total += psets['points'][chapter]

        return float(earned) / float(total) * 100
Пример #3
0
    def milestones(self):
        """
        Determine which milestones have been reached
        """

        # load metadata for badge
        toc = loader.toc()
        psets = loader.psets()
        metadata = loader.badges()[self.id]
        milestones = {}

        # iterate over each chapter required for the badge
        for chapter in metadata['chapters']:
            # pset milestone reached if all points have been earned
            milestone = {
                'chapter': True,
                'pset': self.points[chapter] == psets['points'][chapter]
            }

            # chapter milestone not reached if some section has not been read
            for section in toc[chapter]['sections']:
                if not chapter in self.reads or not section['id'] in self.reads[chapter]:
                    milestone['chapter'] = False
                    break

            # save milestone
            milestones[chapter] = milestone

        return milestones
Пример #4
0
def contents():
    """
    View for the book's table of contents
    """

    # get total points for all problem sets
    psets = loader.psets()
    total_points = psets['points']

    # get all sections the user has read
    reads = g.user.get_reads()

    # get the user's points
    points = g.user.get_points()

    toc = loader.toc()
    return render_template('contents.html', toc=toc, reads=reads, points=points, total_points=total_points)
Пример #5
0
def pset(chapter, question=0):
    """
    Display the problem set for a chapter
    """

    # make sure chapter is valid
    questions = loader.psets()['questions']
    if not chapter in questions:
        abort(404)

    # temporary metadata
    toc = loader.toc()
    metadata = toc[chapter]
    title = 'Problem Set ' + str(metadata['sequence'] + 1)

    # remove answers from each question
    pset = questions[chapter]
    for i in pset[:]:
        if 'answer' in i:
            del i['answer']

    return render_template('pset.html', pset=pset, chapter=chapter, metadata=metadata, title=title,
        subtitle=metadata['title'])