"""The Quality-Control Web Application entry point""" import os import logging from pathlib import Path from flask import Flask, request from flask_session import Session from uploader.oauth2.client import authserver_authorise_uri 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 "UPLOADER_CONF" in os.environ: app.config.from_envvar("UPLOADER_CONF") # Override defaults with instance path override_settings_with_envvars(app, ignore=tuple()) secretsfile = app.config.get("UPLOADER_SECRETS", "").strip() if bool(secretsfile): secretsfile = Path(secretsfile).absolute() app.config["UPLOADER_SECRETS"] = secretsfile if secretsfile.exists(): # Silently ignore secrets if the file does not exist. app.config.from_pyfile(secretsfile) # setup jinja2 symbols app.add_template_global(lambda : request.url, name="request_url") app.add_template_global(authserver_authorise_uri) app.add_template_global(lambda: app.config["GN2_SERVER_URL"], name="gn2server_uri") Session(app) # 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