aboutsummaryrefslogtreecommitdiff
"""The Quality-Control Web Application entry point"""
import os
import logging
from pathlib import Path

from flask import Flask

from .entry import entrybp
from .upload import upload
from .parse import parsebp
from .samples import samples
from .base_routes import base
from .dbinsert import dbinsertbp
from .errors import register_error_handlers

def override_settings_with_envvars(
        app: Flask, ignore: tuple[str, ...]=tuple()) -> None:
    """Override settings in `app` with those in ENVVARS"""
    for setting in (key for key in app.config if key not in ignore):
        app.config[setting] = os.environ.get(setting) or app.config[setting]


def create_app():
    """The application factory"""
    app = Flask(__name__)
    app.config.from_pyfile(
        Path(__file__).parent.joinpath("default_settings.py"))
    if "QCAPP_CONF" in os.environ:
        app.config.from_envvar("QCAPP_CONF") # Override defaults with instance path

    override_settings_with_envvars(app, ignore=tuple())

    if "QCAPP_SECRETS" in os.environ:
        app.config.from_envvar("QCAPP_SECRETS")

    # setup blueprints
    app.register_blueprint(base, url_prefix="/")
    app.register_blueprint(entrybp, url_prefix="/")
    app.register_blueprint(parsebp, url_prefix="/parse")
    app.register_blueprint(upload, url_prefix="/upload")
    app.register_blueprint(dbinsertbp, url_prefix="/dbinsert")
    app.register_blueprint(samples, url_prefix="/samples")

    register_error_handlers(app)
    return app