from os import environ, makedirs from flask import Flask from flask_admin import Admin from flask_security import Security, SQLAlchemyUserDatastore from flask_security.models import fsqla_v2 as fsqla from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate from dotenv import load_dotenv from .advlabdb_independent_funs import parse_bool def set_from_env(app, var): app.config[var] = environ[var] load_dotenv(".env") app = Flask(__name__) set_from_env(app, "SERVER_NAME") set_from_env(app, "SECRET_KEY") # Setup Flask-SQLAlchemy app.config["SQLALCHEMY_DATABASE_URI"] = f"sqlite:///../{environ['RELATIVE_DB_DIR']}/advlab.db" makedirs(environ["RELATIVE_DB_DIR"], exist_ok=True) app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False db = SQLAlchemy(app) fsqla.FsModels.set_db_info(db) # Setup Flask-Migrate migrate = Migrate(app, db) from . import customClasses # Setup Flask-Admin app.config["FLASK_ADMIN_FLUID_LAYOUT"] = True adminSpace = Admin( app, name="Admin@AdvLabDB", url="/admin", endpoint="adminSpace", template_mode="bootstrap3", index_view=customClasses.SecureAdminIndexView(name="Home", url="/admin", endpoint="adminSpace"), ) assistantSpace = Admin( app, name="Assistant@AdvLabDB", url="/assistant", endpoint="assistantSpace", template_mode="bootstrap3", index_view=customClasses.SecureAssistantIndexView(name="Home", url="/assistant", endpoint="assistantSpace"), ) from . import models # Setup Flask-Security # Enable features app.config["SECURITY_TRACKABLE"] = True # Explicitly disable features app.config["SECURITY_CONFIRMABLE"] = False app.config["SECURITY_REGISTERABLE"] = False app.config["SECURITY_RECOVERABLE"] = False app.config["SECURITY_PASSWORDLESS"] = False app.config["SECURITY_CHANGEABLE"] = False app.config["SECURITY_TWO_FACTOR"] = False app.config["SECURITY_UNIFIED_SIGNIN"] = False app.config["SECURITY_EMAIL_VALIDATOR_ARGS"] = { "check_deliverability": parse_bool(environ["CHECK_EMAIL_DELIVERABILITY"]) } set_from_env(app, "SECURITY_PASSWORD_SALT") app.config["SECURITY_PASSWORD_LENGTH_MIN"] = 15 # TODO: app.config["SECURITY_LOGIN_USER_TEMPLATE"] = user_datastore = SQLAlchemyUserDatastore(db, models.User, models.Role) Security(app, user_datastore) try: from . import routes, adminModelViews, assistantModelViews except Exception as ex: print( "\nYou are probably initializing the database with a script. If not, then you have to worry about not being able to import in __init__.py!\n" ) print(str(ex))