]> git.datanom.net - flask-test.git/blame - app/models.py
final
[flask-test.git] / app / models.py
CommitLineData
db4f0ba9
MR
1from app import db
2from hashlib import md5
163c4d87
MR
3import re
4
5followers = db.Table('followers',
6 db.Column('follower_id', db.Integer, db.ForeignKey('user.id')),
7 db.Column('followed_id', db.Integer, db.ForeignKey('user.id'))
8)
db4f0ba9
MR
9
10class User(db.Model):
11 id = db.Column(db.Integer, primary_key=True)
12 nickname = db.Column(db.String(64), index=True, unique=True)
13 email = db.Column(db.String(120), index=True, unique=True)
14 posts = db.relationship('Post', backref='author', lazy='dynamic')
15 about_me = db.Column(db.String(140))
16 last_seen = db.Column(db.DateTime)
163c4d87
MR
17 followed = db.relationship('User',
18 secondary=followers,
19 primaryjoin=(followers.c.follower_id == id),
20 secondaryjoin=(followers.c.followed_id == id),
21 backref=db.backref('followers', lazy='dynamic'),
22 lazy='dynamic')
db4f0ba9
MR
23
24 @property
25 def is_authenticated(self):
26 return True
27
28 @property
29 def is_active(self):
30 return True
31
32 @property
33 def is_anonymous(self):
34 return False
35
36 def get_id(self):
37 try:
38 return unicode(self.id) # python 2
39 except NameError:
40 return str(self.id) # python 3
41
42 def avatar(self, size):
43 return 'http://www.gravatar.com/avatar/%s?d=mm&s=%d' % (md5(self.email.encode('utf-8')).hexdigest(), size)
44
163c4d87
MR
45 @staticmethod
46 def make_valid_nickname(nickname):
47 return re.sub('[^a-zA-Z0-9_\.]', '', nickname)
48
db4f0ba9
MR
49 @staticmethod
50 def make_unique_nickname(nickname):
51 if User.query.filter_by(nickname=nickname).first() is None:
52 return nickname
53 version = 2
54 while True:
55 new_nickname = nickname + str(version)
56 if User.query.filter_by(nickname=new_nickname).first() is None:
57 break
58 version += 1
59 return new_nickname
60
163c4d87
MR
61 def follow(self, user):
62 if not self.is_following(user):
63 self.followed.append(user)
64 return self
65
66 def unfollow(self, user):
67 if self.is_following(user):
68 self.followed.remove(user)
69 return self
70
71 def is_following(self, user):
72 return self.followed.filter(followers.c.followed_id == user.id).count() > 0
73
74 def followed_posts(self):
75 return Post.query.join(followers, (followers.c.followed_id == Post.user_id)).filter(followers.c.follower_id == self.id).order_by(Post.timestamp.desc())
76
77 def sorted_posts(self):
78 return self.posts.order_by(Post.timestamp.desc())
79
db4f0ba9
MR
80 def __repr__(self):
81 return '<User %r>' % (self.nickname)
82
83class Post(db.Model):
84 id = db.Column(db.Integer, primary_key = True)
85 body = db.Column(db.String(140))
86 timestamp = db.Column(db.DateTime)
87 user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
88
89 def __repr__(self):
90 return '<Post %r>' % (self.body)
91
This page took 0.03921 seconds and 5 git commands to generate.