blob: d71c094213df8b10217e13944f2cd8dccd9e13de [file] [log] [blame]
from functools import wraps
import json
from werkzeug.utils import redirect
import APIFactory
from app import user
import config
from models import UserEncoder
import providers
__author__ = 'hanl'
from flask import Flask, render_template, request, session, url_for, flash, current_app, Blueprint
from flask_email import LocmemMail
from flask_babel import Babel
from flask_login import LoginManager, current_user
app = Flask(__name__)
lm = LoginManager(app)
babel = Babel(app)
# admin = Admin(app)
mail = LocmemMail(app)
router = Blueprint('app', __name__,
template_folder='templates')
@router.route('/lang/<language>')
def set_locale(lang=None):
setattr(session, 'lang', lang)
return render_template(url_for('index'), lang_code=lang)
@babel.localeselector
def get_locale():
browser_locale = request.accept_languages.best_match(app.config.get('LANGUAGES'), default="de")
lang = session.get('lang', browser_locale)
setattr(session, 'lang', lang)
return lang
def secured(func):
'''
overriding login_required, but redirects to login, not to unauthorized page
:param func:
:return:
'''
@wraps(func)
def decorated_view(*args, **kwargs):
print "args %s" % str(args)
print "kwargs %s" % str(kwargs)
print "func %s" % str(func)
if current_app.login_manager._login_disabled:
return func(*args, **kwargs)
elif not current_user.is_authenticated():
# fixme: how to set next?
# request.args.get('next') or
return redirect(url_for('.login'))
return func(*args, **kwargs)
return decorated_view
@lm.user_loader
def load_user(username):
# either from session of via rest; cache if possible
return providers.PROVIDER.get_user(session)
# used to override the cookie encryption behaviour
# @lm.token_loader
def load_token(token):
return providers.PROVIDER.get_user()
@router.route('/')
def index():
return render_template('index.html', lang_code=get_locale())
@router.route('/search', methods=['GET'])
@secured
def search():
if request.method == "GET":
data = request.args
print "has query %s" % str(data)
if 'q' in data:
# auth=APIFactory.Oauth2Auth(session['access_token'])
response = APIFactory.get("search", params=data)
if response is None:
pass
elif providers.NotificationHandler.isError(response):
providers.NotificationHandler.notify(response.json(), flash)
else:
raw_json = response.json()
return render_template('search.html', lang=app.config.get('QUERY_LANGUAGES'),
q=data['q'], ql=data['ql'], result=raw_json,
result_string=json.dumps(raw_json, indent=4))
return render_template('search.html', lang=app.config.get('QUERY_LANGUAGES'),
q=None, ql=None,
result=None)
@router.route('/serialize', methods=['GET', 'POST'])
@secured
def serialize():
return render_template('search.html')
# @router.app_errorhandler(404)
def page_not_found(e):
return render_template('404.html'), 404
if __name__ == '__main__':
import admin
app.config.from_object(config)
app.json_encoder = UserEncoder
app.debug = config.DEBUG
app.register_blueprint(router, url_prefix='/app')
app.register_blueprint(user.router, url_prefix='/user')
app.register_blueprint(admin.router, url_prefix='/admin')
providers.init_app(app.config)
app.run()