from app import db
from hashlib import md5
+import re
+
+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):
id = db.Column(db.Integer, primary_key=True)
posts = db.relationship('Post', backref='author', lazy='dynamic')
about_me = db.Column(db.String(140))
last_seen = db.Column(db.DateTime)
+ 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')
@property
def is_authenticated(self):
def avatar(self, size):
return 'http://www.gravatar.com/avatar/%s?d=mm&s=%d' % (md5(self.email.encode('utf-8')).hexdigest(), size)
+ @staticmethod
+ def make_valid_nickname(nickname):
+ return re.sub('[^a-zA-Z0-9_\.]', '', nickname)
+
@staticmethod
def make_unique_nickname(nickname):
if User.query.filter_by(nickname=nickname).first() is None:
version += 1
return new_nickname
+ def follow(self, user):
+ if not self.is_following(user):
+ self.followed.append(user)
+ return self
+
+ def unfollow(self, user):
+ if self.is_following(user):
+ self.followed.remove(user)
+ return self
+
+ def is_following(self, user):
+ return self.followed.filter(followers.c.followed_id == user.id).count() > 0
+
+ def followed_posts(self):
+ return Post.query.join(followers, (followers.c.followed_id == Post.user_id)).filter(followers.c.follower_id == self.id).order_by(Post.timestamp.desc())
+
+ def sorted_posts(self):
+ return self.posts.order_by(Post.timestamp.desc())
+
def __repr__(self):
return '<User %r>' % (self.nickname)