flask/flask_website/views/general.py

117 lines
4 KiB
Python
Raw Normal View History

2010-05-03 11:20:52 +02:00
from flask import Module, render_template, session, redirect, url_for, \
request, flash, g, Response
from flaskext.openid import COMMON_PROVIDERS
2010-05-16 01:06:37 +02:00
from flask_website import oid, twitter
from flask_website.utils import requires_login
2010-05-03 11:20:52 +02:00
from flask_website.database import db_session, User
2010-05-02 16:52:15 +02:00
general = Module(__name__)
2010-05-16 01:06:37 +02:00
tweets = twitter.SearchQuery(required=['flask'],
optional=['code', 'web', 'python', 'py',
'pocoo', 'micro', 'mitsuhiko',
'framework', 'django', 'jinja',
2010-05-17 02:19:57 +02:00
'werkzeug', 'documentation',
'app'])
2010-05-02 16:52:15 +02:00
@general.route('/')
def index():
2010-05-16 01:06:37 +02:00
return render_template('general/index.html', tweets=tweets)
2010-05-03 11:20:52 +02:00
@general.route('/logout/')
def logout():
if 'openid' in session:
flash(u'Logged out')
del session['openid']
return redirect(request.referrer or url_for('general.index'))
@general.route('/login/', methods=['GET', 'POST'])
2010-05-15 23:19:13 +02:00
@oid.loginhandler
2010-05-03 11:20:52 +02:00
def login():
if g.user is not None:
return redirect(url_for('general.index'))
2010-05-16 14:33:32 +02:00
if 'cancel' in request.form:
flash(u'Cancelled. The OpenID was not changed.')
return redirect(oid.get_next_url())
openid = request.values.get('openid')
if not openid:
openid = COMMON_PROVIDERS.get(request.args.get('provider'))
if openid:
return oid.try_login(openid, ask_for=['fullname', 'nickname'])
2010-05-15 23:19:13 +02:00
error = oid.fetch_error()
if error:
flash(u'Error: ' + error)
return render_template('general/login.html', next=oid.get_next_url())
2010-05-03 11:20:52 +02:00
@general.route('/first-login/', methods=['GET', 'POST'])
def first_login():
if g.user is not None or 'openid' not in session:
return redirect(url_for('login'))
if request.method == 'POST':
if 'cancel' in request.form:
del session['openid']
flash(u'Login was aborted')
return redirect(url_for('general.login'))
db_session.add(User(request.form['name'], session['openid']))
db_session.commit()
flash(u'Successfully created profile and logged in')
2010-05-15 23:19:13 +02:00
return redirect(oid.get_next_url())
2010-05-03 11:20:52 +02:00
return render_template('general/first_login.html',
2010-05-15 23:19:13 +02:00
next=oid.get_next_url(),
2010-05-03 11:20:52 +02:00
openid=session['openid'])
@general.route('/profile/', methods=['GET', 'POST'])
@requires_login
def profile():
name = g.user.name
if request.method == 'POST':
name = request.form['name'].strip()
if not name:
flash(u'Error: a name is required')
else:
g.user.name = name
db_session.commit()
flash(u'User profile updated')
return redirect(url_for('index'))
return render_template('general/profile.html', name=name)
@general.route('/profile/change-openid/', methods=['GET', 'POST'])
@requires_login
@oid.loginhandler
def change_openid():
if request.method == 'POST':
if 'cancel' in request.form:
flash(u'Cancelled. The OpenID was not changed.')
return redirect(oid.get_next_url())
openid = request.values.get('openid')
if not openid:
openid = COMMON_PROVIDERS.get(request.args.get('provider'))
if openid:
return oid.try_login(openid)
error = oid.fetch_error()
if error:
flash(u'Error: ' + error)
return render_template('general/change_openid.html',
next=oid.get_next_url())
@oid.after_login
def create_or_login(resp):
session['openid'] = resp.identity_url
user = g.user or User.query.filter_by(openid=resp.identity_url).first()
if user is None:
return redirect(url_for('first_login', next=oid.get_next_url(),
name=resp.fullname or resp.nickname))
if user.openid != resp.identity_url:
user.openid = resp.identity_url
db_session.commit()
flash(u'OpenID identity changed')
else:
flash(u'Successfully signed in')
return redirect(oid.get_next_url())