class Post(db.Model): id = db.Column(db.Integer, primary_key=True) content = db.Column(db.Text, nullable=False) date_posted = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) date_shared = db.Column(db.DateTime) user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) private = db.Column(db.Boolean, default=False, nullable=False) likes = db.relationship('PostLike', backref='post', lazy='dynamic') shares = db.relationship('PostShare', foreign_keys='PostShare.shared_post_id', backref='post', lazy='dynamic') def __repr__(self): return f"User('{self.content}', '{self.private}','{self.likes}', '{self.date_posted}')"
class PostShare(db.Model): __tablename__ = 'post_share' id = db.Column(db.Integer, primary_key=True) sharer_id = db.Column(db.Integer, db.ForeignKey('user.id')) shared_post_id = db.Column(db.Integer, db.ForeignKey('post.id'))
class User(db.Model, UserMixin): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(20), unique=True, nullable=False) email = db.Column(db.String(120), unique=True, nullable=False) image_file = db.Column(db.String(20), nullable=False, default='noprofile.jpg') password = db.Column(db.String(60), nullable=False) posts = db.relationship('Post', backref='author', lazy=True) 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') shared = db.relationship('PostShare', foreign_keys='PostShare.sharer_id', backref='sharer', lazy='dynamic') def share_post(self, post): if not self.has_shared_post(post): share = PostShare(sharer_id=self.id, shared_post_id=post.id) db.session.add(share) db.session.commit() def has_shared_post(self, post): return PostShare.query.filter(PostShare.sharer_id == self.id, PostShare.shared_post_id == post.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.date_posted.desc()) 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 liked = db.relationship('PostLike', foreign_keys='PostLike.user_id', backref='user', lazy='dynamic') # def share_post(self, post): # share = PostShare(sharer_id=self.id, shared_post_id=post.id) # db.session.add(share) def like_post(self, post): if not self.has_liked_post(post): like = PostLike(user_id=self.id, post_id=post.id) db.session.add(like) def unlike_post(self, post): if self.has_liked_post(post): PostLike.query.filter_by(user_id=self.id, post_id=post.id).delete() def has_liked_post(self, post): return PostLike.query.filter(PostLike.user_id == self.id, PostLike.post_id == post.id).count() > 0 def __repr__(self): return f"User('{self.username}', '{self.email}', '{self.image_file}')"
class PostLike(db.Model): __tablename__ = 'post_like' id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey('user.id')) post_id = db.Column(db.Integer, db.ForeignKey('post.id'))
from datetime import datetime from flask import current_app from scurry import db, login_manager from flask_login import UserMixin @login_manager.user_loader def load_user(user_id): return User.query.get(int(user_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(db.Model, UserMixin): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(20), unique=True, nullable=False) email = db.Column(db.String(120), unique=True, nullable=False) image_file = db.Column(db.String(20), nullable=False, default='noprofile.jpg') password = db.Column(db.String(60), nullable=False) posts = db.relationship('Post', backref='author', lazy=True) followed = db.relationship('User', secondary=followers, primaryjoin=(followers.c.follower_id == id), secondaryjoin=(followers.c.followed_id == id),