from flask_login import login_user, logout_user, current_user, login_required
from datetime import datetime
from app import app, db, lm, oid
-from .forms import LoginForm, EditForm
-from .models import User
-
+from .forms import LoginForm, EditForm, PostForm
+from .models import User, Post
+from config import POSTS_PER_PAGE
+from .emails import follower_notification
@lm.user_loader
def load_user(id):
return User.query.get(int(id))
-
@app.before_request
def before_request():
g.user = current_user
return render_template('500.html'), 500
-@app.route('/')
-@app.route('/index')
+@app.route('/', methods=['GET', 'POST'])
+@app.route('/index', methods=['GET', 'POST'])
+@app.route('/index/<int:page>', methods=['GET', 'POST'])
@login_required
-def index():
- user = g.user
- posts = [
- {
- 'author': {'nickname': 'John'},
- 'body': 'Beautiful day in Portland!'
- },
- {
- 'author': {'nickname': 'Susan'},
- 'body': 'The Avengers movie was so cool!'
- }
- ]
+def index(page=1):
+ form = PostForm()
+ if form.validate_on_submit():
+ post = Post(body=form.post.data, timestamp=datetime.utcnow(), author=g.user)
+ db.session.add(post)
+ db.session.commit()
+ flash('Your post is now live!')
+ app.logger.info("%s: published a post" % g.user)
+ return redirect(url_for('index'))
+ posts = g.user.followed_posts().paginate(page, POSTS_PER_PAGE, False)
return render_template('index.html',
title='Home',
- user=user,
+ form=form,
posts=posts)
nickname = resp.email.split('@')[0]
nickname = User.make_unique_nickname(nickname)
user = User(nickname=nickname, email=resp.email)
+ app.logger.info("Add: %s - %s" % (nickname, respo.email))
db.session.add(user)
db.session.commit()
+ # make the user follow him/herself
+ db.session.add(user.follow(user))
+ db.session.commit()
remember_me = False
if 'remember_me' in session:
remember_me = session['remember_me']
@app.route('/logout')
def logout():
+ app.logger.info("Logout: %s" % g.user)
logout_user()
return redirect(url_for('login'))
@app.route('/user/<nickname>')
+@app.route('/user/<nickname>/<int:page>')
@login_required
-def user(nickname):
+def user(nickname, page=1):
user = User.query.filter_by(nickname=nickname).first()
if user is None:
flash('User %s not found.' % nickname)
return redirect(url_for('index'))
- posts = [
- {'author': user, 'body': 'Test post #1'},
- {'author': user, 'body': 'Test post #2'}
- ]
+ posts = user.sorted_posts().paginate(page, POSTS_PER_PAGE, False)
+ app.logger.info("%s: show profile" % user)
return render_template('user.html',
user=user,
posts=posts)
db.session.add(g.user)
db.session.commit()
flash('Your changes have been saved.')
+ app.logger.info("%s: updated profile" % g.user)
return redirect(url_for('edit'))
elif request.method != "POST":
form.nickname.data = g.user.nickname
form.about_me.data = g.user.about_me
return render_template('edit.html', form=form)
+@app.route('/follow/<nickname>')
+@login_required
+def follow(nickname):
+ user = User.query.filter_by(nickname=nickname).first()
+ if user is None:
+ flash('User %s not found.' % nickname)
+ return redirect(url_for('index'))
+ if user == g.user:
+ flash('You can\'t follow yourself!')
+ return redirect(url_for('user', nickname=nickname))
+ u = g.user.follow(user)
+ if u is None:
+ flash('Cannot follow ' + nickname + '.')
+ return redirect(url_for('user', nickname=nickname))
+ db.session.add(u)
+ db.session.commit()
+ flash('You are now following ' + nickname + '!')
+ follower_notification(user, g.user)
+ return redirect(url_for('user', nickname=nickname))
+
+@app.route('/unfollow/<nickname>')
+@login_required
+def unfollow(nickname):
+ user = User.query.filter_by(nickname=nickname).first()
+ if user is None:
+ flash('User %s not found.' % nickname)
+ return redirect(url_for('index'))
+ if user == g.user:
+ flash('You can\'t unfollow yourself!')
+ return redirect(url_for('user', nickname=nickname))
+ u = g.user.unfollow(user)
+ if u is None:
+ flash('Cannot unfollow ' + nickname + '.')
+ return redirect(url_for('user', nickname=nickname))
+ db.session.add(u)
+ db.session.commit()
+ flash('You have stopped following ' + nickname + '.')
+ return redirect(url_for('user', nickname=nickname))
+
+@app.route('/delete/<int:id>')
+@login_required
+def delete(id):
+ post = Post.query.get(id)
+ if post is None:
+ flash('Post not found.')
+ return redirect(url_for('index'))
+ if post.author.id != g.user.id:
+ flash('You cannot delete this post.')
+ return redirect(url_for('index'))
+ db.session.delete(post)
+ db.session.commit()
+ flash('Your post has been deleted.')
+ return redirect(url_for('index'))
+