Files
notifications-admin/app/__init__.py

109 lines
2.9 KiB
Python
Raw Normal View History

2015-11-24 09:40:14 +00:00
import os
import re
from flask import Flask, session, Markup
2015-11-24 09:40:14 +00:00
from flask._compat import string_types
from flask.ext.sqlalchemy import SQLAlchemy
from flask_login import LoginManager
from flask_wtf import CsrfProtect
from werkzeug.exceptions import abort
from app.notify_client.api_client import AdminAPIClient
from app.its_dangerous_session import ItsdangerousSessionInterface
2015-11-30 14:32:58 +00:00
import app.proxy_fix
from config import configs
2015-11-30 14:32:58 +00:00
db = SQLAlchemy()
login_manager = LoginManager()
csrf = CsrfProtect()
2015-11-20 16:22:44 +00:00
admin_api_client = AdminAPIClient()
2015-11-20 16:22:44 +00:00
2015-11-24 09:40:14 +00:00
def create_app(config_name):
2015-11-20 16:22:44 +00:00
application = Flask(__name__)
2015-11-24 09:40:14 +00:00
application.config['NOTIFY_API_ENVIRONMENT'] = config_name
application.config.from_object(configs[config_name])
if 'FLASK_CONFIG' in os.environ:
application.config.from_envvar('FLASK_CONFIG')
db.init_app(application)
2015-11-24 09:40:14 +00:00
init_app(application)
init_csrf(application)
login_manager.init_app(application)
login_manager.login_view = 'main.render_sign_in'
2015-11-24 09:40:14 +00:00
2015-11-20 16:33:11 +00:00
from app.main import main as main_blueprint
2015-11-20 16:22:44 +00:00
application.register_blueprint(main_blueprint)
2015-11-30 14:32:58 +00:00
proxy_fix.init_app(application)
application.session_interface = ItsdangerousSessionInterface()
admin_api_client.init_app(application)
2015-11-30 14:32:58 +00:00
application.add_template_filter(placeholders)
2015-12-11 12:02:21 +00:00
application.add_template_filter(replace_placeholders)
2015-11-20 16:22:44 +00:00
return application
2015-11-24 09:40:14 +00:00
def init_csrf(application):
csrf.init_app(application)
@csrf.error_handler
def csrf_handler(reason):
if 'user_id' not in session:
application.logger.info(
u'csrf.session_expired: Redirecting user to log in page'
)
return application.login_manager.unauthorized()
application.logger.info(
u'csrf.invalid_token: Aborting request, user_id: {user_id}',
extra={'user_id': session['user_id']})
abort(400, reason)
2015-11-24 09:40:14 +00:00
def init_app(app):
for key, value in app.config.items():
if key in os.environ:
app.config[key] = convert_to_boolean(os.environ[key])
@app.context_processor
def inject_global_template_variables():
return {'asset_path': '/static/'}
2015-11-24 09:40:14 +00:00
def convert_to_boolean(value):
if isinstance(value, string_types):
if value.lower() in ['t', 'true', 'on', 'yes', '1']:
return True
elif value.lower() in ['f', 'false', 'off', 'no', '0']:
return False
return value
def placeholders(value):
if not value:
return value
return Markup(re.sub(
r"\(\(([^\)]+)\)\)", # anything that looks like ((registration number))
lambda match: "<span class='placeholder'>{}</span>".format(match.group(1)),
value
))
2015-12-11 12:02:21 +00:00
def replace_placeholders(template, values):
if not template:
return template
return Markup(re.sub(
r"\(\(([^\)]+)\)\)", # anything that looks like ((registration number))
lambda match: values.get(match.group(1), ''),
template
))