59 lines
1.7 KiB
Python
59 lines
1.7 KiB
Python
from flask_bootstrap import Bootstrap5
|
|
from flask import Flask, render_template, request
|
|
import utils
|
|
import random
|
|
import os
|
|
|
|
app = Flask(__name__)
|
|
bootstrap = Bootstrap5(app)
|
|
|
|
def get_questions(categories, num):
|
|
question_pool = []
|
|
weights = []
|
|
for c in categories:
|
|
for q in utils.get_questions_by_category(c):
|
|
weight = utils.get_question_weights(c, q)
|
|
question_pool.append((c, q))
|
|
weights.append(weight)
|
|
|
|
|
|
if num > len(question_pool):
|
|
num = len(question_pool)
|
|
if num == 0:
|
|
return {}
|
|
selected_question_tuples = []
|
|
while len(selected_question_tuples) < num:
|
|
selected = random.choices(question_pool, weights)[0]
|
|
if selected not in selected_question_tuples:
|
|
selected_question_tuples.append(selected)
|
|
|
|
questions = {}
|
|
for category, question in selected_question_tuples:
|
|
utils.set_question_selected(category, question)
|
|
if category not in questions:
|
|
questions[category] = []
|
|
questions[category].append(question)
|
|
utils.save_weights()
|
|
return questions
|
|
|
|
def get_num():
|
|
default_num = 5
|
|
return int(os.getenv("NUM_QUESTIONS", default_num))
|
|
|
|
@app.route("/", methods=["POST", "GET"])
|
|
def index():
|
|
categories = utils.get_categories()
|
|
selected = categories
|
|
n = get_num()
|
|
questions = {}
|
|
if request.method == "POST":
|
|
selected = request.form.getlist("categories[]")
|
|
n = int(request.form.get("num"))
|
|
questions = get_questions(selected, n)
|
|
|
|
return render_template("index.html", categories=categories, selected=selected, n=n, questions=questions)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
app.run()
|