Skip to content

Commit 20ce2f9

Browse files
Chapter 10: Caching of user avatar hashes (10d)
1 parent 168a9e8 commit 20ce2f9

File tree

3 files changed

+35
-6
lines changed

3 files changed

+35
-6
lines changed

app/models.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ class User(UserMixin, db.Model):
8181
about_me = db.Column(db.Text())
8282
member_since = db.Column(db.DateTime(), default=datetime.utcnow)
8383
last_seen = db.Column(db.DateTime(), default=datetime.utcnow)
84+
avatar_hash = db.Column(db.String(32))
8485

8586
def __init__(self, **kwargs):
8687
super(User, self).__init__(**kwargs)
@@ -89,6 +90,8 @@ def __init__(self, **kwargs):
8990
self.role = Role.query.filter_by(name='Administrator').first()
9091
if self.role is None:
9192
self.role = Role.query.filter_by(default=True).first()
93+
if self.email is not None and self.avatar_hash is None:
94+
self.avatar_hash = self.gravatar_hash()
9295

9396
@property
9497
def password(self):
@@ -154,6 +157,7 @@ def change_email(self, token):
154157
if self.query.filter_by(email=new_email).first() is not None:
155158
return False
156159
self.email = new_email
160+
self.avatar_hash = self.gravatar_hash()
157161
db.session.add(self)
158162
return True
159163

@@ -167,9 +171,12 @@ def ping(self):
167171
self.last_seen = datetime.utcnow()
168172
db.session.add(self)
169173

174+
def gravatar_hash(self):
175+
return hashlib.md5(self.email.lower().encode('utf-8')).hexdigest()
176+
170177
def gravatar(self, size=100, default='identicon', rating='g'):
171178
url = 'https://secure.gravatar.com/avatar'
172-
hash = hashlib.md5(self.email.lower().encode('utf-8')).hexdigest()
179+
hash = self.avatar_hash or self.gravatar_hash()
173180
return '{url}/{hash}?s={size}&d={default}&r={rating}'.format(
174181
url=url, hash=hash, size=size, default=default, rating=rating)
175182

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
"""caching of avatar hashes
2+
3+
Revision ID: 198b0eebcf9
4+
Revises: d66f086b258
5+
Create Date: 2014-02-04 09:10:02.245503
6+
7+
"""
8+
9+
# revision identifiers, used by Alembic.
10+
revision = '198b0eebcf9'
11+
down_revision = 'd66f086b258'
12+
13+
from alembic import op
14+
import sqlalchemy as sa
15+
16+
17+
def upgrade():
18+
### commands auto generated by Alembic - please adjust! ###
19+
op.add_column('users', sa.Column('avatar_hash', sa.String(length=32), nullable=True))
20+
### end Alembic commands ###
21+
22+
23+
def downgrade():
24+
### commands auto generated by Alembic - please adjust! ###
25+
op.drop_column('users', 'avatar_hash')
26+
### end Alembic commands ###

tests/test_user_model.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -164,12 +164,8 @@ def test_gravatar(self):
164164
gravatar_256 = u.gravatar(size=256)
165165
gravatar_pg = u.gravatar(rating='pg')
166166
gravatar_retro = u.gravatar(default='retro')
167-
with self.app.test_request_context('/', base_url='https://example.com'):
168-
gravatar_ssl = u.gravatar()
169-
self.assertTrue('http://www.gravatar.com/avatar/' +
167+
self.assertTrue('https://secure.gravatar.com/avatar/' +
170168
'd4c74594d841139328695756648b6bd6'in gravatar)
171169
self.assertTrue('s=256' in gravatar_256)
172170
self.assertTrue('r=pg' in gravatar_pg)
173171
self.assertTrue('d=retro' in gravatar_retro)
174-
self.assertTrue('https://secure.gravatar.com/avatar/' +
175-
'd4c74594d841139328695756648b6bd6' in gravatar_ssl)

0 commit comments

Comments
 (0)