quiz-the-word/QuizTheWord/app.py

130 lines
3.9 KiB
Python

import os
from flask import request, render_template, jsonify, Flask, url_for, redirect, flash
from flask_security import Security, SQLAlchemySessionUserDatastore, login_user, logout_user, current_user
from QuizTheWord import database
from QuizTheWord.admin import admin
# from QuizTheWord import config
app = Flask(__name__)
environment_configuration = os.environ.get('CONFIGURATION_SETUP', "QuizTheWord.config.Development")
with app.app_context():
app.config.from_object(environment_configuration)
user_datastore = SQLAlchemySessionUserDatastore(database.get_session(), database.User, database.Role)
security = Security(app, user_datastore, False)
app.register_blueprint(admin.Admin)
@app.context_processor
def func():
if current_user.is_authenticated:
data = {
"user_authenticated": True,
"has_admin_access": current_user.has_permission("admin_site_access"),
"is_admin": current_user.has_role("admin"),
}
else:
data = {
"user_authenticated": False,
"has_admin_access": False,
"is_admin": False,
}
return data
@app.route("/")
def index():
return multiple_choice_category()
@app.route("/category/hidden_answer")
def hidden_answer_category():
easy = database.get_random_hidden_answer(1)
medium = database.get_random_hidden_answer(2)
hard = database.get_random_hidden_answer(3)
return render_template(
"hidden_answer.html",
title="Hidden Answer",
easy=easy,
medium=medium,
hard=hard,
)
@app.route("/category/multiple_choice")
def multiple_choice_category():
easy = database.get_random_multiple_choice(1)
medium = database.get_random_multiple_choice(2)
hard = database.get_random_multiple_choice(3)
return render_template(
"multiple_choice.html",
title="Multiple Choice",
easy=easy,
medium=medium,
hard=hard,
)
@app.route("/category/multiple_choice/check_answer", methods=["GET"])
def check_answer():
question_id = request.args.get("question_id", type=int)
answer = request.args.get("answer", type=str)
if question_id is not None and answer is not None:
return jsonify(database.check_answer(question_id, answer))
@app.route("/login", methods=["GET", "POST"])
def login():
next_page = request.args.get("next", default=url_for("index"))
if request.method == "POST":
email = request.form.get("email")
password = request.form.get("password")
remember = request.args.get("remember")
user = user_datastore.find_user(email=email)
if user is None or not user.check_password(password):
flash("invalid email or password")
return redirect(url_for("login"))
login_user(user, remember=remember)
return redirect(next_page)
return render_template("login.html", title="login")
@app.route("/register", methods=["GET", "POST"])
def register():
if request.method == "POST":
email = request.form.get("email")
password = request.form.get("password")
user = database.add_user(email, password)
if user is None:
flash("email already in use")
return redirect(url_for("register"))
login_user(user)
return redirect(url_for("index"))
return render_template("register.html")
@app.route("/logout")
def logout():
logout_user()
return redirect(url_for("index"))
@app.errorhandler(404)
def error_404(e):
print(e)
return render_template("error.html", error_msg="The requested page can not be found.", error_code=404), 404
@app.errorhandler(500)
def error_404(e):
print(e)
msg = "There was an error with the server."
if app.config["DEBUG"]:
msg = e
return render_template("error.html", error_msg=msg, error_code=500), 500
if __name__ == "__main__":
with app.app_context():
database.init_db()
app.run()