import os from flask import request, render_template, jsonify, Flask, url_for, redirect, flash, session 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("/category/hidden_answer/next_question") def next_hidden_answer(): if "hidden_answer_ids" not in session: session["hidden_answer_ids"] = [] difficulty = request.args.get("difficulty", 1) next_question = database.next_hidden_answer(session["hidden_answer_ids"], difficulty) if next_question: session["hidden_answer_ids"].append(next_question.question_id) session.modified = True return jsonify(next_question.get_dict()) else: session.pop("hidden_answer_ids", None) return jsonify(None), 204 @app.route("/category/multiple_choice/next_question") def next_multiple_choice(): if "multiple_choice_ids" not in session: session["multiple_choice_ids"] = [] difficulty = request.args.get("difficulty", 1) next_question = database.next_multiple_choice(session["multiple_choice_ids"], difficulty) if next_question: session["multiple_choice_ids"].append(next_question.question_id) session.modified = True return jsonify(next_question.get_dict_shuffled_choices()) else: session.pop("multiple_choice_ids", None) return jsonify(None), 204 @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()