Browse Source

Chapter 12: Followers in the application (12b)

master
T. Meissner 6 years ago
parent
commit
f35793218a
5 changed files with 121 additions and 1 deletions
  1. +69
    -1
      app/main/views.py
  2. +3
    -0
      app/static/styles.css
  3. +27
    -0
      app/templates/followers.html
  4. +21
    -0
      app/templates/user.html
  5. +1
    -0
      config.py

+ 69
- 1
app/main/views.py View File

@ -5,7 +5,7 @@ from . import main
from .forms import EditProfileForm, EditProfileAdminForm, PostForm from .forms import EditProfileForm, EditProfileAdminForm, PostForm
from .. import db from .. import db
from ..models import User, Role, Permission, Post from ..models import User, Role, Permission, Post
from ..decorators import admin_required
from ..decorators import admin_required, permission_required
@main.route('/', methods=['GET', 'POST']) @main.route('/', methods=['GET', 'POST'])
@ -106,3 +106,71 @@ def edit(id):
return redirect(url_for('.post', id=post.id)) return redirect(url_for('.post', id=post.id))
form.body.data = post.body form.body.data = post.body
return render_template('edit_post.html', form=form) return render_template('edit_post.html', form=form)
@main.route('/follow/<username>')
@login_required
@permission_required(Permission.FOLLOW)
def follow(username):
user = User.query.filter_by(username=username).first()
if user is None:
flash('Invalud user')
return redirect(url_for('.index'))
if current_user.is_following(user):
flash('You are already follwoing this user.')
return redirect(url_for('.user', username=username))
current_user.follow(user)
db.session.commit()
flash('You are now following %s' % username)
return redirect(url_for('.user', username=username))
@main.route('/unfollow/<username>')
@login_required
@permission_required(Permission.FOLLOW)
def unfollow(username):
user = User.query.filter_by(username=username).first()
if user is None:
flash('Invalid user')
return redirect(url_for('.index'))
if not current_user.is_following(user):
flash('You are not following this user.')
return redirect(url_for('.user', username=username))
current_user.unfollow(user)
db.session.commit()
flash('You are not following %s anymore' % username)
return redirect(url_for('.user', username=username))
@main.route('/followers/<username>')
def followers(username):
user = User.query.filter_by(username=username).first()
if user is None:
flash('Invalid user')
return redirect(url_for('.index'))
page = request.args.get('page', 1, type=int)
pagination = user.followers.paginate(
page, per_page=current_app.config['FLASKY_FOLLOWERS_PER_PAGE'],
error_out=False)
follows = [{'user': item.follower, 'timestamp': item.timestamp}
for item in pagination.items]
return render_template('followers.html', user=user, title="Followers of",
endpoint='.followers', pagination=pagination,
follows=follows)
@main.route('/followed-by/<username>')
def followed_by(username):
user = User.query.filter_by(username=username).first()
if user is None:
flash('Invalid user')
return redirect(url_for('.index'))
page = request.args.get('page', 1, type=int)
pagination = user.followed.paginate(
page, per_page=current_app.config['FLASKY_FOLLOWERS_PER_PAGE'],
error_out=False)
follows = [{'user': item.followed, 'timestamp': item.timestamp}
for item in pagination.items]
return render_template('followers.html', user=user, title="Followed by",
endpoint='.followed_by', pagination=pagination,
follows=follows)

+ 3
- 0
app/static/styles.css View File

@ -63,3 +63,6 @@ div.flask-pagedown-preview {
.post-body h3 { .post-body h3 {
font-size: 120%; font-size: 120%;
} }
.table.followers tr {
border-bottom: 1px solid #e0e0e0;
}

+ 27
- 0
app/templates/followers.html View File

@ -0,0 +1,27 @@
{% extends "base.html" %}
{% import "_macros.html" as macros %}
{% block title %}Flasky - {{ title }} {{ user.username }}{% endblock %}
{% block page_content %}
<div class="page-header">
<h1>{{ title }} {{ user.username }}</h1>
</div>
<table class="table table-hover followers">
<thead><tr><th>User</th><th>Since</th></tr></thead>
{% for follow in follows %}
<tr>
<td>
<a href="{{ url_for('.user', username = follow.user.username) }}">
<img class="img-rounded" src="{{ follow.user.gravatar(size=32) }}">
{{ follow.user.username }}
</a>
</td>
<td>{{ moment(follow.timestamp).format('L') }}</td>
</tr>
{% endfor %}
</table>
<div class="pagination">
{{ macros.pagination_widget(pagination, endpoint, username = user.username) }}
</div>
{% endblock %}

+ 21
- 0
app/templates/user.html View File

@ -29,6 +29,27 @@
Last seen {{ moment(user.last_seen).fromNow() }}. Last seen {{ moment(user.last_seen).fromNow() }}.
<p>{{ user.posts.count() }} blog post{% if user.posts.count() > 1 %}s{% endif %}.</p> <p>{{ user.posts.count() }} blog post{% if user.posts.count() > 1 %}s{% endif %}.</p>
</p> </p>
<p>
{% if current_user.can(Permission.FOLLOW) and user != current_user %}
{% if not current_user.is_following(user) %}
<a href="{{ url_for('.follow', username=user.username) }}"
class="btn btn-primary">Follow</a>
{% else %}
<a href="{{ url_for('.unfollow', username=user.username) }}"
class="btn btn-primary">Unfollow</a>
{% endif %}
{% endif %}
<a href="{{ url_for('.followers', username=user.username) }}">
Followers: <span class="badge">{{ user.followers.count() }}</span>
</a>
<a href="{{ url_for('.followed_by', username=user.username) }}">
Following: <span class="badge">{{ user.followed.count() }}</span>
</a>
{% if current_user.is_authenticated and user != current_user and
user.is_following(current_user) %}
| <span class="label label-default">Follows you</span>
{% endif %}
</p>
<p> <p>
{% if user == current_user %} {% if user == current_user %}
<a class="btn btn-default" href="{{ url_for('.edit_profile') }}">Edit Profile</a> <a class="btn btn-default" href="{{ url_for('.edit_profile') }}">Edit Profile</a>


+ 1
- 0
config.py View File

@ -15,6 +15,7 @@ class Config:
FLASKY_ADMIN = os.environ.get('FLASKY_ADMIN') FLASKY_ADMIN = os.environ.get('FLASKY_ADMIN')
SQLALCHEMY_TRACK_MODIFICATIONS = False SQLALCHEMY_TRACK_MODIFICATIONS = False
FLASKY_POSTS_PER_PAGE = 20 FLASKY_POSTS_PER_PAGE = 20
FLASKY_FOLLOWERS_PER_PAGE = 50
@staticmethod @staticmethod
def init_app(app): def init_app(app):


Loading…
Cancel
Save