Newer
Older
# -*- coding: utf-8 -*-
"""
app.factory
~~~~~~~~~~~
Create the WSGI application.
:copyright: (c) 2017 European Spallation Source ERIC
:license: BSD 2-Clause, see LICENSE for more details.
"""
import sqlalchemy as sa
from flask import Flask
from . import settings
from .extensions import db, migrate, login_manager, ldap_manager, bootstrap, admin, mail, jwt
from .models import User, Role, Action, Vendor, Model, Location, Status
from .admin.views import AdminModelView, ItemAdmin
from .main.views import bp as main
from .users.views import bp as users
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
from .defaults import defaults
def register_cli(app):
@app.cli.command()
def initdb():
"""Create the database tables and initialize them with default values"""
db.create_all()
for instance in defaults:
db.session.add(instance)
try:
db.session.commit()
except sa.exc.IntegrityError as e:
db.session.rollback()
app.logger.debug(f'{instance} already exists')
def create_app():
app = Flask(__name__)
app.config.from_object(settings)
app.config.from_envvar('LOCAL_SETTINGS', silent=True)
if not app.debug:
import logging
# Send ERROR via mail
from logging.handlers import SMTPHandler
mail_handler = SMTPHandler(app.config['MAIL_SERVER'],
app.config['EMAIL_SENDER'],
app.config['ADMIN_EMAILS'],
'Inventory: ERROR raised')
mail_handler.setFormatter(logging.Formatter("""
Message type: %(levelname)s
Location: %(pathname)s:%(lineno)d
Module: %(module)s
Function: %(funcName)s
Time: %(asctime)s
Message:
%(message)s
"""))
mail_handler.setLevel(logging.ERROR)
app.logger.addHandler(mail_handler)
# Log to stderr
handler = logging.StreamHandler()
handler.setFormatter(logging.Formatter(
'%(asctime)s %(levelname)s: %(message)s '
'[in %(pathname)s:%(lineno)d]'
))
# Set app logger level to DEBUG
# otherwise only WARNING and above are propagated
app.logger.setLevel(logging.DEBUG)
handler.setLevel(logging.DEBUG)
app.logger.addHandler(handler)
app.logger.info('Inventory created!')
app.logger.info('Settings:\n{}'.format(
'\n'.join(['{}: {}'.format(key, value) for key, value in app.config.items()
if key not in ('SECRET_KEY', 'LDAP_BIND_USER_PASSWORD')])))
bootstrap.init_app(app)
db.init_app(app)
migrate.init_app(app)
login_manager.init_app(app)
login_manager.login_view = 'users.login'
ldap_manager.init_app(app)
mail.init_app(app)
admin.add_view(AdminModelView(Role, db.session))
admin.add_view(AdminModelView(User, db.session))
admin.add_view(AdminModelView(Action, db.session))
admin.add_view(AdminModelView(Vendor, db.session))
admin.add_view(AdminModelView(Model, db.session))
admin.add_view(AdminModelView(Location, db.session))
admin.add_view(AdminModelView(Status, db.session))
admin.add_view(ItemAdmin(db.session))
app.register_blueprint(main)
app.register_blueprint(users)