summary history files

web/penny/__init__.py
from flask import Flask, g, redirect, url_for

from flask_login import current_user
from flask_security.core import Security
from flask_security.datastore import SQLAlchemyUserDatastore
from flask_security.decorators import auth_required
from flask_migrate import Migrate
from penny import resources, util
from penny.extensions import user_datastore
from penny.models import db
from penny.common.init_data import import_all_types
from penny.cli.task import task_cli
from penny.cli.seed import seed_cli
from penny.cli.report import report_cli
from penny.cli.txmeta import txmeta_cli
from penny.cli.transaction import transaction_cli
import os
from pathlib import Path
import locale

PENNY_CONF_FILE = Path("/etc/penny/penny.conf.py")

migrate = Migrate()


def create_app(test_config=None):
    app = Flask(__name__)

    if test_config is None:
        if PENNY_CONF_FILE.is_file():
            app.config.from_pyfile(PENNY_CONF_FILE)

        if os.environ.get("CONFIG_FILE"):
            app.config.from_envvar("CONFIG_FILE")
    else:
        app.config.from_mapping(test_config)

    app.cli.add_command(task_cli)
    app.cli.add_command(seed_cli)
    app.cli.add_command(report_cli)
    app.cli.add_command(txmeta_cli)
    app.cli.add_command(transaction_cli)

    db.init_app(app)
    migrate.init_app(app, db)
    security = Security(app, user_datastore)

    if os.environ.get("PENNY_IMPORT_ALL_TYPES"):
        with app.app_context():
            import_all_types()

    @app.before_request
    def load_current_user():
        g.user = current_user

    @app.template_filter("convert_to_float")
    def convert_to_float(cents):
        return util.convert_to_float(cents)

    @app.template_filter("convert_to_float_positive")
    def convert_to_float_positive(cents):
        locale.setlocale(locale.LC_ALL, "en_AU.UTF-8")
        return locale.currency(abs(float(cents / float(100))), grouping=True)

    @app.route("/", methods=["GET"])
    @auth_required()
    def index():
        return redirect(url_for("bankaccounts._bankaccounts"))

    app.register_blueprint(resources.accounts)
    app.register_blueprint(resources.accountmatches)
    app.register_blueprint(resources.bankaccounts)
    app.register_blueprint(resources.data_accounts)
    app.register_blueprint(resources.data_accountmatches)
    app.register_blueprint(resources.data_bankaccounts)
    app.register_blueprint(resources.data_entities)
    app.register_blueprint(resources.data_reports)
    app.register_blueprint(resources.data_tags)
    app.register_blueprint(resources.data_transactions)
    app.register_blueprint(resources.entities)
    app.register_blueprint(resources.reports)
    app.register_blueprint(resources.tags)
    app.register_blueprint(resources.tasks)
    app.register_blueprint(resources.transactions)
    app.register_blueprint(resources.user_login)
    app.register_blueprint(resources.user_logout)

    return app