mgt c8 checkpoint at tests
This commit is contained in:
		@@ -9,6 +9,13 @@ import pydenticon, hashlib, base64
 | 
			
		||||
from app import db, login
 | 
			
		||||
from flask_login import UserMixin
 | 
			
		||||
 | 
			
		||||
followers = sa.Table(
 | 
			
		||||
        'followers',
 | 
			
		||||
        db.metadata,
 | 
			
		||||
        sa.Column('follower_id', sa.Integer, sa.ForeignKey('user.id'), primary_key=True),
 | 
			
		||||
        sa.Column('followed_id', sa.Integer, sa.ForeignKey('user.id'), primary_key=True)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
class User(UserMixin, db.Model):
 | 
			
		||||
    id: so.Mapped[int] = so.mapped_column(primary_key=True)
 | 
			
		||||
    username: so.Mapped[str] = so.mapped_column(sa.String(64), index=True, unique=True)
 | 
			
		||||
@@ -17,6 +24,16 @@ class User(UserMixin, db.Model):
 | 
			
		||||
    posts: so.WriteOnlyMapped['Post'] = so.relationship(back_populates='author')
 | 
			
		||||
    about_me: so.Mapped[Optional[str]] = so.mapped_column(sa.String(140))
 | 
			
		||||
    last_seen: so.Mapped[Optional[datetime]] = so.mapped_column(default=lambda: datetime.now(timezone.utc))
 | 
			
		||||
    following: so.WriteOnlyMapped['User'] = so.relationship(
 | 
			
		||||
            secondary=followers,
 | 
			
		||||
            primaryjoin=(followers.c.follower_id == id),
 | 
			
		||||
            secondaryjoin=(followers.c.followed_id == id),
 | 
			
		||||
            back_populates='followers')
 | 
			
		||||
    followers: so.WriteOnlyMapped['User'] = so.relationship(
 | 
			
		||||
            secondary=followers,
 | 
			
		||||
            primaryjoin=(followers.c.followed_id == id),
 | 
			
		||||
            secondaryjoin=(followers.c.follower_id == id),
 | 
			
		||||
            back_populates='following')
 | 
			
		||||
 | 
			
		||||
    def set_password(self, password):
 | 
			
		||||
        self.password_hash = generate_password_hash(password)
 | 
			
		||||
@@ -49,6 +66,36 @@ class User(UserMixin, db.Model):
 | 
			
		||||
        pngloc = os.path.join(basedir, 'usercontent', 'identicon', digest + '.png')
 | 
			
		||||
        return pngloc
 | 
			
		||||
 | 
			
		||||
    def follow(self, user):
 | 
			
		||||
        if not self.is_following(user):
 | 
			
		||||
            self.following.add(user)
 | 
			
		||||
    def unfollow(self, user):
 | 
			
		||||
        if self.is_following(user):
 | 
			
		||||
            self.following.remove(user)
 | 
			
		||||
    def is_following(self, user):
 | 
			
		||||
        query = self.following.select().where(User.id == user.id)
 | 
			
		||||
        return db.session.scalar(query) is not None
 | 
			
		||||
    def followers_count(self):
 | 
			
		||||
        query = sa.select(sa.func.count()).select_from(self.followers.select().subquery())
 | 
			
		||||
        return db.session.scalar(query)
 | 
			
		||||
    def following_count(self):
 | 
			
		||||
        query = sa.select(sa.func.count()).select_from(self.following.select().subquery())
 | 
			
		||||
        return db.session.scalar(query)
 | 
			
		||||
    def following_posts(self):
 | 
			
		||||
        Author = so.aliased(User)
 | 
			
		||||
        Follower = so.aliased(User)
 | 
			
		||||
        return (
 | 
			
		||||
                sa.select(Post)
 | 
			
		||||
                .join(Post.author.of_type(Author))
 | 
			
		||||
                .join(Author.followers.of_type(Follower), isouter=True)
 | 
			
		||||
                .where(sa.or_(
 | 
			
		||||
                    Follower.id == self.id
 | 
			
		||||
                    Author.id == self.id
 | 
			
		||||
                ))
 | 
			
		||||
                .group_by(Post)
 | 
			
		||||
                .order_by(Post.timestamp.desc())
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    def __repr__(self):
 | 
			
		||||
        return '<User {}>'.format(self.username)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user