]>
Commit | Line | Data |
---|---|---|
db4f0ba9 MR |
1 | from flask import render_template, flash, redirect, session, url_for, request, g |
2 | from flask_login import login_user, logout_user, current_user, login_required | |
3 | from datetime import datetime | |
4 | from app import app, db, lm, oid | |
5 | from .forms import LoginForm, EditForm | |
6 | from .models import User | |
7 | ||
8 | ||
9 | @lm.user_loader | |
10 | def load_user(id): | |
11 | return User.query.get(int(id)) | |
12 | ||
13 | ||
14 | @app.before_request | |
15 | def before_request(): | |
16 | g.user = current_user | |
17 | if g.user.is_authenticated: | |
18 | g.user.last_seen = datetime.utcnow() | |
19 | db.session.add(g.user) | |
20 | db.session.commit() | |
21 | ||
22 | ||
23 | @app.errorhandler(404) | |
24 | def not_found_error(error): | |
25 | return render_template('404.html'), 404 | |
26 | ||
27 | ||
28 | @app.errorhandler(500) | |
29 | def internal_error(error): | |
30 | db.session.rollback() | |
31 | return render_template('500.html'), 500 | |
32 | ||
43064c75 MR |
33 | |
34 | @app.route('/') | |
35 | @app.route('/index') | |
db4f0ba9 | 36 | @login_required |
43064c75 | 37 | def index(): |
db4f0ba9 MR |
38 | user = g.user |
39 | posts = [ | |
40 | { | |
41 | 'author': {'nickname': 'John'}, | |
42 | 'body': 'Beautiful day in Portland!' | |
43 | }, | |
44 | { | |
45 | 'author': {'nickname': 'Susan'}, | |
46 | 'body': 'The Avengers movie was so cool!' | |
47 | } | |
48 | ] | |
49 | return render_template('index.html', | |
50 | title='Home', | |
51 | user=user, | |
52 | posts=posts) | |
53 | ||
54 | ||
55 | @app.route('/login', methods=['GET', 'POST']) | |
56 | @oid.loginhandler | |
57 | def login(): | |
58 | if g.user is not None and g.user.is_authenticated: | |
59 | return redirect(url_for('index')) | |
60 | form = LoginForm() | |
61 | if form.validate_on_submit(): | |
62 | session['remember_me'] = form.remember_me.data | |
63 | return oid.try_login(form.openid.data, ask_for=['nickname', 'email']) | |
64 | return render_template('login.html', | |
65 | title='Sign In', | |
66 | form=form, | |
67 | providers=app.config['OPENID_PROVIDERS']) | |
68 | ||
69 | ||
70 | @oid.after_login | |
71 | def after_login(resp): | |
72 | if resp.email is None or resp.email == "": | |
73 | flash('Invalid login. Please try again.') | |
74 | return redirect(url_for('login')) | |
75 | user = User.query.filter_by(email=resp.email).first() | |
76 | if user is None: | |
77 | nickname = resp.nickname | |
78 | if nickname is None or nickname == "": | |
79 | nickname = resp.email.split('@')[0] | |
80 | nickname = User.make_unique_nickname(nickname) | |
81 | user = User(nickname=nickname, email=resp.email) | |
82 | db.session.add(user) | |
83 | db.session.commit() | |
84 | remember_me = False | |
85 | if 'remember_me' in session: | |
86 | remember_me = session['remember_me'] | |
87 | session.pop('remember_me', None) | |
88 | login_user(user, remember=remember_me) | |
89 | return redirect(request.args.get('next') or url_for('index')) | |
90 | ||
91 | ||
92 | @app.route('/logout') | |
93 | def logout(): | |
94 | logout_user() | |
95 | return redirect(url_for('login')) | |
96 | ||
97 | ||
98 | @app.route('/user/<nickname>') | |
99 | @login_required | |
100 | def user(nickname): | |
101 | user = User.query.filter_by(nickname=nickname).first() | |
102 | if user is None: | |
103 | flash('User %s not found.' % nickname) | |
104 | return redirect(url_for('index')) | |
105 | posts = [ | |
106 | {'author': user, 'body': 'Test post #1'}, | |
107 | {'author': user, 'body': 'Test post #2'} | |
108 | ] | |
109 | return render_template('user.html', | |
110 | user=user, | |
111 | posts=posts) | |
112 | ||
113 | ||
114 | @app.route('/edit', methods=['GET', 'POST']) | |
115 | @login_required | |
116 | def edit(): | |
117 | form = EditForm(g.user.nickname) | |
118 | if form.validate_on_submit(): | |
119 | g.user.nickname = form.nickname.data | |
120 | g.user.about_me = form.about_me.data | |
121 | db.session.add(g.user) | |
122 | db.session.commit() | |
123 | flash('Your changes have been saved.') | |
124 | return redirect(url_for('edit')) | |
125 | elif request.method != "POST": | |
126 | form.nickname.data = g.user.nickname | |
127 | form.about_me.data = g.user.about_me | |
128 | return render_template('edit.html', form=form) | |
129 |