FitTrackee/fittrackee/__init__.py

126 lines
4.2 KiB
Python
Raw Normal View History

2017-12-16 21:00:46 +01:00
import logging
2018-04-10 21:53:18 +02:00
import os
from importlib import import_module, reload
2021-01-02 19:28:03 +01:00
from typing import Any
2017-12-16 21:00:46 +01:00
2021-01-02 19:28:03 +01:00
from flask import Flask, Response, render_template, send_file
2017-12-16 21:00:46 +01:00
from flask_bcrypt import Bcrypt
from flask_dramatiq import Dramatiq
2018-01-20 19:12:34 +01:00
from flask_migrate import Migrate
2017-12-16 21:00:46 +01:00
from flask_sqlalchemy import SQLAlchemy
2021-01-20 16:47:00 +01:00
from fittrackee.emails.email import Email
2022-01-01 22:47:01 +01:00
VERSION = __version__ = '0.5.4'
2017-12-16 21:00:46 +01:00
db = SQLAlchemy()
bcrypt = Bcrypt()
2018-01-20 19:12:34 +01:00
migrate = Migrate()
email_service = Email()
dramatiq = Dramatiq()
2020-09-18 08:49:48 +02:00
log_file = os.getenv('APP_LOG')
logging.basicConfig(
filename=log_file,
format='%(asctime)s - %(name)s - %(levelname)s - ' '%(message)s',
datefmt='%Y/%m/%d %H:%M:%S',
)
appLog = logging.getLogger('fittrackee')
2017-12-16 21:00:46 +01:00
2018-04-09 22:09:58 +02:00
2021-01-02 19:28:03 +01:00
def create_app() -> Flask:
2018-04-09 22:09:58 +02:00
# instantiate the app
app = Flask(__name__, static_folder='dist/static', template_folder='dist')
2018-04-09 22:09:58 +02:00
# set config
with app.app_context():
app_settings = os.getenv(
'APP_SETTINGS', 'fittrackee.config.ProductionConfig'
)
if app_settings == 'fittrackee.config.TestingConfig':
# reload config on tests
config = import_module('fittrackee.config')
reload(config)
2018-04-10 21:53:18 +02:00
app.config.from_object(app_settings)
2018-04-09 22:09:58 +02:00
# set up extensions
db.init_app(app)
bcrypt.init_app(app)
migrate.init_app(app, db)
dramatiq.init_app(app)
2018-04-09 22:09:58 +02:00
# set up email
email_service.init_email(app)
# get configuration from database
from .application.models import AppConfig
from .application.utils import init_config, update_app_config_from_database
with app.app_context():
# Note: check if "app_config" table exist to avoid errors when
# dropping tables on dev environments
2021-05-22 17:13:48 +02:00
if db.engine.dialect.has_table(db.engine.connect(), 'app_config'):
db_app_config = AppConfig.query.one_or_none()
if not db_app_config:
_, db_app_config = init_config()
update_app_config_from_database(app, db_app_config)
from .application.app_config import config_blueprint # noqa
from .users.auth import auth_blueprint # noqa
from .users.users import users_blueprint # noqa
from .workouts.records import records_blueprint # noqa
from .workouts.sports import sports_blueprint # noqa
from .workouts.stats import stats_blueprint # noqa
from .workouts.workouts import workouts_blueprint # noqa
2018-04-09 22:09:58 +02:00
app.register_blueprint(auth_blueprint, url_prefix='/api')
app.register_blueprint(config_blueprint, url_prefix='/api')
app.register_blueprint(records_blueprint, url_prefix='/api')
2018-05-01 16:17:12 +02:00
app.register_blueprint(sports_blueprint, url_prefix='/api')
2018-06-06 00:22:24 +02:00
app.register_blueprint(stats_blueprint, url_prefix='/api')
app.register_blueprint(users_blueprint, url_prefix='/api')
app.register_blueprint(workouts_blueprint, url_prefix='/api')
2018-04-09 22:09:58 +02:00
if app.debug:
logging.getLogger('sqlalchemy').setLevel(logging.WARNING)
2019-08-28 13:25:39 +02:00
logging.getLogger('sqlalchemy').handlers = logging.getLogger(
'werkzeug'
).handlers
2018-04-09 22:09:58 +02:00
logging.getLogger('sqlalchemy.orm').setLevel(logging.WARNING)
logging.getLogger('flake8').propagate = False
appLog.setLevel(logging.DEBUG)
# Enable CORS
@app.after_request
2021-01-02 19:28:03 +01:00
def after_request(response: Response) -> Response:
2018-04-09 22:09:58 +02:00
response.headers.add('Access-Control-Allow-Origin', '*')
response.headers.add(
'Access-Control-Allow-Headers', 'Content-Type,Authorization'
)
response.headers.add(
'Access-Control-Allow-Methods',
2019-08-28 13:25:39 +02:00
'GET,PUT,POST,DELETE,PATCH,OPTIONS',
2018-04-09 22:09:58 +02:00
)
return response
2020-09-16 15:53:05 +02:00
@app.route('/favicon.ico')
2021-01-02 19:28:03 +01:00
def favicon() -> Any:
return send_file(
os.path.join(app.root_path, 'dist/favicon.ico') # type: ignore
)
2020-09-16 15:53:05 +02:00
@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
2021-01-02 19:28:03 +01:00
def catch_all(path: str) -> Any:
2020-09-16 15:53:05 +02:00
# workaround to serve images (not in static directory)
if path.startswith('img/'):
2021-01-02 19:28:03 +01:00
return send_file(
os.path.join(
app.root_path, # type: ignore
'dist',
path,
)
)
2020-09-16 15:53:05 +02:00
else:
return render_template('index.html')
2018-04-09 22:09:58 +02:00
return app