wanderhome-quiz/server/app/views.py

66 lines
2.1 KiB
Python

from .models import Entry
from .tools.data import load
from .tools.quiz import compile_results, evaluate_answers, render_questions
from flask import Blueprint, jsonify, request
import numpy
views = Blueprint(
name='views',
import_name=__name__
)
@views.route('/questions/')
def _questions():
return render_questions()
@views.route('/submit/', methods=['POST'])
def _submit():
answers = request.json
scores = evaluate_answers(answers)
results = compile_results(results=scores)
new_entry = Entry(answers=answers, results=results)
new_entry.add()
return jsonify(results)
@views.route('/count/')
def _count():
return jsonify(len(Entry.query.all()))
@views.route('/playbooks/')
def _playbooks():
playbooks = dict.fromkeys(load('playbooks.json'), 0)
for entry in Entry.query.all():
for _playbook in entry.results['playbooks']: playbooks[_playbook] += 1
return playbooks
@views.route('/answers/')
def _answers():
answers = {}
for entry in Entry.query.all():
for index, answer in enumerate(entry.answers):
if index not in answers: answers[index] = { }
if type(answer) is list:
for option in answer:
if option not in answers[index]: answers[index][option] = 0
answers[index][option] += 1
else:
if answer not in answers[index]: answers[index][answer] = 0
answers[index][answer] += 1
return list(answers.values())
@views.route('/scores/')
def _scores():
playbooks = { playbook: list() for playbook in load('playbooks.json') }
for playbook, scores in playbooks.items():
for entry in Entry.query.all():
score = entry.results['all_playbooks'][playbook]
percentage_score = 100 * score/entry.results['max_score']
scores.append(percentage_score)
output = { playbook: dict() for playbook in playbooks }
for playbook, scores in playbooks.items():
output[playbook]['mean'] = numpy.mean(scores)
output[playbook]['median'] = numpy.median(scores)
output[playbook]['standard_deviation'] = numpy.std(scores)
return output