mirror of
https://github.com/rmontanana/microblog.git
synced 2025-08-16 15:55:51 +00:00
Chapeter 8
This commit is contained in:
@@ -2,12 +2,10 @@ import os
|
||||
from flask import Flask
|
||||
from config import Config
|
||||
import logging
|
||||
from loggin.handlers import RotatingFileHandler
|
||||
from logging.handlers import SMTPHandler
|
||||
from logging.handlers import RotatingFileHandler, SMTPHandler
|
||||
from flask_sqlalchemy import SQLAlchemy
|
||||
from flask_migrate import Migrate
|
||||
from flask_login import LoginManager
|
||||
from app import routes, models, errors
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config.from_object(Config)
|
||||
@@ -54,3 +52,4 @@ if not app.debug:
|
||||
|
||||
app.logger.setLevel(logging.INFO)
|
||||
app.logger.info("Microblog startup")
|
||||
from app import routes, models, errors
|
||||
|
@@ -57,3 +57,7 @@ class EditProfileForm(FlaskForm):
|
||||
user = User.query.filter_by(username=self.username.data).first()
|
||||
if user is not None:
|
||||
raise ValidationError("Please use a different username.")
|
||||
|
||||
|
||||
class EmptyForm(FlaskForm):
|
||||
submit = SubmitField("Submit")
|
||||
|
@@ -10,6 +10,13 @@ def load_user(id):
|
||||
return User.query.get(int(id))
|
||||
|
||||
|
||||
followers = db.Table(
|
||||
"followers",
|
||||
db.Column("follower_id", db.Integer, db.ForeignKey("user.id")),
|
||||
db.Column("followed_id", db.Integer, db.ForeignKey("user.id")),
|
||||
)
|
||||
|
||||
|
||||
class User(UserMixin, db.Model):
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
username = db.Column(db.String(64), index=True, unique=True)
|
||||
@@ -18,6 +25,14 @@ class User(UserMixin, db.Model):
|
||||
posts = db.relationship("Post", backref="author", lazy="dynamic")
|
||||
about_me = db.Column(db.String(140))
|
||||
last_seen = db.Column(db.DateTime, default=datetime.utcnow)
|
||||
followed = db.relationship(
|
||||
"User",
|
||||
secondary=followers,
|
||||
primaryjoin=(followers.c.follower_id == id),
|
||||
secondaryjoin=(followers.c.followed_id == id),
|
||||
backref=db.backref("followers", lazy="dynamic"),
|
||||
lazy="dynamic",
|
||||
)
|
||||
|
||||
def __repr__(self):
|
||||
return "<User {}>".format(self.username)
|
||||
@@ -34,6 +49,27 @@ class User(UserMixin, db.Model):
|
||||
digest, size
|
||||
)
|
||||
|
||||
def follow(self, user):
|
||||
if not self.is_following(user):
|
||||
self.followed.append(user)
|
||||
|
||||
def unfollow(self, user):
|
||||
if self.is_following(user):
|
||||
self.followed.remove(user)
|
||||
|
||||
def is_following(self, user):
|
||||
return (
|
||||
self.followed.filter(followers.c.followed_id == user.id).count()
|
||||
> 0
|
||||
)
|
||||
|
||||
def followed_posts(self):
|
||||
followed = Post.query.join(
|
||||
followers, (followers.c.followed_id == Post.user_id)
|
||||
).filter(followers.c.follower_id == self.id)
|
||||
own = Post.query.filter_by(user_id=self.id)
|
||||
return followed.union(own).order_by(Post.timestamp.desc())
|
||||
|
||||
|
||||
class Post(db.Model):
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
|
@@ -3,7 +3,7 @@ from flask import render_template, flash, redirect, url_for, request
|
||||
from flask_login import current_user, login_user, logout_user, login_required
|
||||
from werkzeug.urls import url_parse
|
||||
from app import app, db
|
||||
from app.forms import LoginForm, RegistrationForm, EditProfileForm
|
||||
from app.forms import LoginForm, RegistrationForm, EditProfileForm, EmptyForm
|
||||
from app.models import User
|
||||
|
||||
|
||||
@@ -94,3 +94,43 @@ def edit_profile():
|
||||
return render_template(
|
||||
"edit_profile.html", title="Edit Profile", form=form
|
||||
)
|
||||
|
||||
|
||||
@app.route("/follow/<username>", methods=["POST"])
|
||||
@login_required
|
||||
def follow(username):
|
||||
form = EmptyForm()
|
||||
if form.validate_on_submit():
|
||||
user = User.query.filter_by(username=username).first()
|
||||
if user is None:
|
||||
flash("User {} not found.".format(username))
|
||||
return redirect(url_for("index"))
|
||||
if user == current_user:
|
||||
flash("You cannot follow yourself!")
|
||||
return redirect(url_for("user", username=username))
|
||||
current_user.follow(user)
|
||||
db.session.commit()
|
||||
flash("You are following {}!".format(username))
|
||||
return redirect(url_for("user", username=username))
|
||||
else:
|
||||
return redirect(url_for("index"))
|
||||
|
||||
|
||||
@app.route("/unfollow/<username>", methods=["POST"])
|
||||
@login_required
|
||||
def unfollow(username):
|
||||
form = EmptyForm()
|
||||
if form.validate_on_submit():
|
||||
user = User.query.filter_by(username=username).first()
|
||||
if user is None:
|
||||
flash("User {} not found.".format(username))
|
||||
return redirect(url_for("index"))
|
||||
if user == current_user:
|
||||
flash("You cannot unfollow yourself!")
|
||||
return redirect(url_for("user", username=username))
|
||||
current_user.unfollow(user)
|
||||
db.session.commit()
|
||||
flash("You are not following {}.".format(username))
|
||||
return redirect(url_for("user", username=username))
|
||||
else:
|
||||
return redirect(url_for("index"))
|
||||
|
@@ -17,10 +17,25 @@
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p>{{ user.followers.count() }} followers, {{ user.followed.count() }} following.</p>
|
||||
{% if user == current_user %}
|
||||
<p>
|
||||
<a href="{{ url_for('edit_profile') }}">Edit your profile</a>
|
||||
</p>
|
||||
{% elif not current_user.is_following(user) %}
|
||||
<p>
|
||||
<form action="{{ url_for('follow', username = user.username) }}" method="post">
|
||||
{{ form.hidden_tag() }}
|
||||
{{ form.submit(value = 'Follow') }}
|
||||
</form>
|
||||
</p>
|
||||
{% else %}
|
||||
<p>
|
||||
<form action="{{ url_for('unfollow', username = user.username) }}" method="post">
|
||||
{{ form.hidden_tag() }}
|
||||
{{ form.submit(value = 'Unfollow') }}
|
||||
</form>
|
||||
</p>
|
||||
{% endif %}
|
||||
<hr />
|
||||
{% for post in posts %}
|
||||
|
Reference in New Issue
Block a user