]>
Commit | Line | Data |
---|---|---|
db4f0ba9 MR |
1 | from app import db |
2 | from hashlib import md5 | |
163c4d87 MR |
3 | import re |
4 | ||
5 | followers = 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 | |
10 | class 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 | ||
83 | class 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 |