from app.data import data from app.models import Entry, Dataset, Test, User from app.modules import bootstrap, csrf, db, login_manager, mail from app.tools.data import save from app.tools.logs import write from config import Config from flask import flash, Flask, render_template, request from flask.helpers import url_for from flask.json import jsonify from flask_wtf.csrf import CSRFError from sqlalchemy_utils import database_exists, create_database from werkzeug.middleware.proxy_fix import ProxyFix from cryptography.fernet import Fernet from datetime import datetime from os import mkdir, path def create_app(): app = Flask(__name__) app.config.from_object(Config()) app.wsgi_app = ProxyFix(app.wsgi_app, x_proto= 1, x_host= 1) bootstrap.init_app(app) csrf.init_app(app) db.init_app(app) login_manager.init_app(app) mail.init_app(app) login_manager.login_view = 'admin._login' @login_manager.user_loader def _load_user(id): return User.query.filter_by(id=id).first() @app.before_request def _check_cookie_consent(): if request.cookies.get('cookie_consent'): return if any([ request.path.startswith(x) for x in [ '/admin/static/', '/root/', '/quiz/static', '/cookies/' ] ]): return flash(f'Cookie Consent: This web site only stores minimal, functional cookies. It does not store any tracking information. By using this site, you consent to this use of cookies. For more information, see our privacy policy.', 'cookie_alert') @app.errorhandler(404) def _404_handler(error): return render_template('404.html') @app.errorhandler(CSRFError) def _csrf_handler(): return jsonify({'error':'Could not validate a secure connection.'}), 403 @app.context_processor def _now(): return {'now': datetime.now()} from app.admin.views import admin from app.api.views import api from app.quiz.views import quiz from app.views import views app.register_blueprint(admin, url_prefix='/admin') app.register_blueprint(api, url_prefix='/api') app.register_blueprint(views) app.register_blueprint(quiz) if not path.isdir(f'./{data}'): mkdir(f'./{data}') if not path.isdir(f'./{data}/questions'): mkdir(f'./{data}/questions') if not path.isfile(f'./{data}/.gitignore'): with open(f'./{data}/.gitignore', 'a+') as file: file.write(f'*') if not path.isfile(f'./{data}/config.json'): save({}, 'config.json') if not path.isdir(f'./{data}/logs'): mkdir(f'./{data}/logs') if not path.isfile(f'./{data}/logs/users.log'): write('users.log', 'Log file created.') if not path.isfile(f'./{data}/logs/system.log'): write('system.log', 'Log file created.') if not path.isfile(f'./{data}/logs/tests.log'): write('tests.log', 'Log file created.') if not database_exists(Config.SQLALCHEMY_DATABASE_URI): create_database(Config.SQLALCHEMY_DATABASE_URI) write('system.log', 'No database found. Creating a new database.') with app.app_context(): db.create_all() write('system.log', 'Creating database schema.') if not path.isfile(f'./{data}/.encryption.key'): write('system.log', 'No encryption key found. Generating new encryption key.') with open(f'./{data}/.encryption.key', 'wb') as key_file: key = Fernet.generate_key() key_file.write(key) return app app = create_app() if __name__ == '__main__': app.run()