aboutsummaryrefslogtreecommitdiff
path: root/budget/run.py
blob: 8f29f35e34f98b6cee1192b392dda0128b804403 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import os
import warnings

from flask import Flask, g, request, session
from flask.ext.babel import Babel
from flask.ext.migrate import Migrate, upgrade, stamp
from raven.contrib.flask import Sentry

from web import main, db, mail
from api import api
from utils import PrefixedWSGI
from utils import minimal_round


app = Flask(__name__)


def pre_alembic_db():
    """ Checks if we are migrating from a pre-alembic ihatemoney
    """
    con = db.engine.connect()
    tables_exist = db.engine.dialect.has_table(con, 'project')
    alembic_setup = db.engine.dialect.has_table(con, 'alembic_version')
    return tables_exist and not alembic_setup


def configure():
    """ A way to (re)configure the app, specially reset the settings
    """
    config_obj = os.environ.get('FLASK_SETTINGS_MODULE', 'merged_settings')
    app.config.from_object(config_obj)
    app.wsgi_app = PrefixedWSGI(app)

    # Deprecations
    if 'DEFAULT_MAIL_SENDER' in app.config:
        # Since flask-mail  0.8
        warnings.warn(
            "DEFAULT_MAIL_SENDER is deprecated in favor of MAIL_DEFAULT_SENDER"
            +" and will be removed in further version",
            UserWarning
        )
        if not 'MAIL_DEFAULT_SENDER' in app.config:
            app.config['MAIL_DEFAULT_SENDER'] = DEFAULT_MAIL_SENDER

configure()


app.register_blueprint(main)
app.register_blueprint(api)

# custom jinja2 filters
app.jinja_env.filters['minimal_round'] = minimal_round

# db
db.init_app(app)
db.app = app

# db migrations
migrate = Migrate(app, db)

if pre_alembic_db():
    with app.app_context():
        # fake the first migration
        stamp(revision='b9a10d5d63ce')

# auto-execute migrations on runtime
with app.app_context():
    upgrade()

# mail
mail.init_app(app)

# translations
babel = Babel(app)

# sentry
sentry = Sentry(app)

@babel.localeselector
def get_locale():
    # get the lang from the session if defined, fallback on the browser "accept
    # languages" header.
    lang = session.get('lang', request.accept_languages.best_match(['fr', 'en']))
    setattr(g, 'lang', lang)
    return lang

def main():
    app.run(host="0.0.0.0", debug=True)

if __name__ == '__main__':
    main()