import logging from flask import (abort, send_file, redirect, request, url_for, render_template) from flask.ext.login import login_user, UserMixin, login_required, logout_user from flask.ext.principal import identity_changed, Identity, AnonymousIdentity from data import model from app import app, login_manager logger = logging.getLogger(__name__) class _LoginWrappedDBUser(UserMixin): def __init__(self, db_user): self.db_user = db_user def is_active(self): return self.db_user.verified def get_id(self): return unicode(self.db_user.username) @login_manager.user_loader def load_user(username): logger.debug('Loading user: %s' % username) db_user = model.get_user(username) if db_user: return _LoginWrappedDBUser(db_user) else: return None @app.route('/', methods=['GET']) def index(): return send_file('templates/index.html') @app.route('/tos', methods=['GET']) def tos(): return send_file('templates/tos.html') @app.route('/privacy', methods=['GET']) def privacy(): return send_file('templates/privacy.html') def common_login(db_user): if login_user(_LoginWrappedDBUser(db_user)): logger.debug('Successfully signed in as: %s' % db_user.username) identity_changed.send(app, identity=Identity(db_user.username, 'username')) return True else: logger.debug('User could not be logged in, inactive?.'); return False @app.route('/signin', methods=['GET']) def render_signin_page(): return render_template('signin.html') @app.route('/signin', methods=['POST']) def signin(): username = request.form['username'] password = request.form['password'] #TODO Allow email login verified = model.verify_user(username, password) if verified: if common_login(verified): return redirect(request.args.get('next') or url_for('index')) else: return render_template('signin.html', needs_email_verification=True) else: return render_template('signin.html', username=username, invalid_credentials=True) @app.route('/confirm', methods=['GET']) def confirm_email(): code = request.values['code'] user = model.confirm_user_email(code) common_login(user) return redirect(url_for('index')) @app.route('/reset', methods=['GET']) def password_reset(): pass @app.route("/signout") @login_required def logout(): logout_user() identity_changed.send(app, identity=AnonymousIdentity()) return redirect(url_for('index'))