1
# -*-  coding: utf-8 -*-
2
"""
3
    __init__.py
4
    :copyright: (c) 2014 by Anon Ray.
5
    :license: BSD, see LICENSE for details
6
"""
7
8
from flask import Flask, request, jsonify, render_template, make_response, g
9
import os
10
11
from classes.database import db
12
from config import DefaultConfig
13
from classes import views
14
15
#from classes import models
16
17
__all__ = ['create_app', 'getDBInstance']
18
19
DEFAULT_APP_NAME = __name__
20
21
DEFAULT_MODULES = (
22
    (views.frontend, ''),
23
    (views.api, '/api')
24
)
25
26
27
def create_app(config=None, app_name=None, modules=None):
28
29
    if app_name is None:
30
        app_name = DEFAULT_APP_NAME
31
32
    if modules is None:
33
        modules = DEFAULT_MODULES
34
35
    app = Flask(app_name)
36
37
    configure_app(app, config)
38
39
    configure_logging(app)
40
    configure_errorhandlers(app)
41
    configure_extensions(app)
42
    #configure_beforehandlers(app)
43
    configure_modules(app, modules)
44
45
    return app
46
47
48
def configure_app(app, config):
49
50
    app.config.from_object(DefaultConfig())
51
52
    if config is not None:
53
        app.config.from_object(config)
54
55
    app.config.from_envvar('APP_CONFIG', silent=True)
56
57
58
def configure_modules(app, modules):
59
    for module, url_prefix in modules:
60
        app.register_module(module, url_prefix=url_prefix)
61
62
63
def configure_extensions(app):
64
65
    db.init_app(app)
66
    db.app = app
67
68
# return the current db instance
69
# TODO: is this needed so much?
70
def getDBInstance():
71
    return db
72
73
74
def configure_errorhandlers(app):
75
76
    if app.testing:
77
        return
78
79
    # TODO: with all these request can we send back the respective HTTP status
80
    # codes instead of 200?
81
    @app.errorhandler(404)
82
    def not_found(error):
83
        response = make_response()
84
        response.status_code = 404
85
86
        if request.is_xhr:
87
            response.data = jsonify(error=error)
88
        else:
89
            response.data = render_template('errors/404.html')
90
91
        return response
92
93
    @app.errorhandler(403)
94
    def forbidden(error):
95
        response = make_response()
96
        response.status_code = 403
97
98
        if request.is_xhr:
99
            response.data = jsonify(error=error)
100
        else:
101
            response.data = render_template('errors/403.html')
102
103
        return response
104
105
    @app.errorhandler(401)
106
    def unauthorized(error):
107
        response = make_response()
108
        response.status_code = 401
109
110
        if request.is_xhr:
111
            response.data = jsonify(error=error)
112
        else:
113
            response.data = render_template('errors/401.html')
114
115
        return response
116
117
    @app.errorhandler(400)
118
    def bad_request(error):
119
        response = make_response()
120
        response.status_code = 400
121
122
        # Check if we have any custom error messages
123
        print 'g.error:'
124
        print g.error
125
        if g.error:
126
            error = g.error
127
128
        if request.is_xhr:
129
            response.data = jsonify(error=error)
130
        else:
131
            response.data = render_template('errors/400.html', error=error)
132
133
        return response
134
135
    @app.errorhandler(500)
136
    def server_error(error):
137
        response = make_response()
138
        response.status_code = 500
139
140
        if request.is_xhr:
141
            response.data = jsonify(error=error)
142
        else:
143
            response.data = render_template('errors/500.html')
144
145
        return response
146
147
148
def configure_logging(app):
149
    #TODO: implement
150
    pass