Initial cleanup of the codebase
Change-Id: Idbc92ea3c2d7ee4d4807d1d83ceee9a299b9a9f7
diff --git a/app/application.py b/app/application.py
new file mode 100644
index 0000000..6ca6e9a
--- /dev/null
+++ b/app/application.py
@@ -0,0 +1,194 @@
+from functools import wraps
+import json
+
+from flask_admin import Admin
+from werkzeug.utils import redirect
+
+import APIFactory
+import messaging
+from models import SigninForm, SignupForm, UserEncoder, ProfileForm, AdminView
+from providers import User
+import providers
+
+
+__author__ = 'hanl'
+
+from flask import Flask, render_template, request, session, url_for, flash, current_app
+
+from flask_babel import Babel, gettext as _
+from flask_login import LoginManager, logout_user, login_user, current_user
+import config
+
+lm = LoginManager()
+babel = Babel()
+admin = Admin()
+
+app = Flask(__name__)
+message_handler = messaging.NotificationHandler()
+providers.load_provider(config.AUTH_PROVIDER, message_handler)
+
+app.config.from_object(config)
+app.json_encoder = UserEncoder
+app.debug = config.DEBUG
+
+admin.init_app(app)
+babel.init_app(app)
+lm.init_app(app)
+
+admin.add_view(AdminView())
+
+# @app.before_request
+@app.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(config.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):
+ if current_app.login_manager._login_disabled:
+ return func(*args, **kwargs)
+ elif not current_user.is_authenticated():
+ # fixme: how to set next?
+ return redirect(request.args.get('next') or 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(username, session)
+
+
+@app.route('/')
+def index():
+ return render_template('index.html', lang_code=get_locale())
+
+
+@app.route('/profile', methods=['GET', 'POST'])
+@secured
+def profile():
+ user = providers.provider.get_user(session['user_id'], session, True)
+ form = ProfileForm(obj=user)
+ if request.method == 'POST':
+ pass
+ elif request.method == 'GET':
+ return render_template('profile.html', form=form, submit=_('Update'))
+
+
+@app.route('/profile/<user>', methods=['GET'])
+def user_profile(user=None):
+ user = User(username=user)
+ form = ProfileForm(obj=user)
+ if request.method == 'POST':
+ pass
+ elif request.method == 'GET':
+ return render_template('profile.html', form=form, submit=_('Update'))
+
+
+@app.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 message_handler.isError(response):
+ message_handler.notifyNext(response.json(), flash)
+ else:
+ raw_json = response.json()
+ return render_template('search.html', lang=config.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=config.QUERY_LANGUAGES,
+ q=None, ql=None,
+ result=None)
+
+
+@app.route('/serialize', methods=['GET', 'POST'])
+@secured
+def serialize():
+ return render_template('search.html')
+
+
+@app.route('/login', methods=['GET', 'POST'])
+def login():
+ form = SigninForm()
+ if request.method == 'POST':
+ if not form.validate():
+ print "unsuccessful validation"
+ return render_template('login.html', form=form)
+ else:
+ user = User(username=form.username.data, password=form.password.data)
+ success = providers.provider.login(session, user)
+ if success:
+ login_user(user)
+ else:
+ return redirect(url_for('login'))
+ print "the data serialized %s" % json.dumps(user, cls=UserEncoder)
+ return redirect(request.args.get('next') or url_for('profile'))
+ elif request.method == 'GET':
+ return render_template('login.html', form=form, submit=_('sign in'))
+
+
+@app.route('/logout')
+@secured
+def logout():
+ if not providers.provider.logout(session):
+ redirect(url_for('login'))
+ logout_user()
+ return redirect(url_for('index'))
+
+
+@app.route('/signup', methods=['GET', 'POST'])
+def signup():
+ form = SignupForm()
+ if request.method == 'POST':
+ if not form.validate():
+ print "unsuccessful validation"
+ return render_template('signup.html', form=form)
+ else:
+ passw = form.password.data
+ newuser = User(firstName=form.firstName.data, lastName=form.lastName.data,
+ email=form.email.data, username=form.username.data,
+ institution=form.institution.data, phone=form.phone.data,
+ address=form.address.data)
+ response = APIFactory.post("user/register")
+
+ elif request.method == 'GET':
+ return render_template('signup.html', form=form, submit=_('sign up'))
+
+
+@app.route('/reset', methods=['POST'])
+def reset():
+ pass
+
+
+@app.errorhandler(404)
+def page_not_found(e):
+ return render_template('404.html'), 404
+
+
+if __name__ == '__main__':
+ app.run()
\ No newline at end of file