2014-11-25 00:25:13 +00:00
|
|
|
import hashlib
|
|
|
|
|
|
|
|
class Avatar(object):
|
|
|
|
def __init__(self, app=None):
|
|
|
|
self.app = app
|
|
|
|
self.state = self._init_app(app)
|
|
|
|
|
|
|
|
def _init_app(self, app):
|
|
|
|
return AVATAR_CLASSES[app.config.get('AVATAR_KIND', 'Gravatar')](
|
|
|
|
app.config['SERVER_HOSTNAME'],
|
|
|
|
app.config['PREFERRED_URL_SCHEME'])
|
|
|
|
|
|
|
|
def __getattr__(self, name):
|
|
|
|
return getattr(self.state, name, None)
|
|
|
|
|
|
|
|
|
|
|
|
class BaseAvatar(object):
|
|
|
|
""" Base class for all avatar implementations. """
|
|
|
|
def __init__(self, server_hostname, preferred_url_scheme):
|
|
|
|
self.server_hostname = server_hostname
|
|
|
|
self.preferred_url_scheme = preferred_url_scheme
|
|
|
|
|
|
|
|
def get_url(self, email, size=16, name=None):
|
|
|
|
""" Returns the full URL for viewing the avatar of the given email address, with
|
|
|
|
an optional size.
|
|
|
|
"""
|
|
|
|
raise NotImplementedError
|
|
|
|
|
|
|
|
def compute_hash(self, email, name=None):
|
|
|
|
""" Computes the avatar hash for the given email address. If the name is given and a default
|
|
|
|
avatar is being computed, the name can be used in place of the email address. """
|
|
|
|
raise NotImplementedError
|
|
|
|
|
|
|
|
|
|
|
|
class GravatarAvatar(BaseAvatar):
|
|
|
|
""" Avatar system that uses gravatar for generating avatars. """
|
|
|
|
def compute_hash(self, email, name=None):
|
2014-11-25 00:40:03 +00:00
|
|
|
email = email or ""
|
2014-11-25 00:25:13 +00:00
|
|
|
return hashlib.md5(email.strip().lower()).hexdigest()
|
|
|
|
|
|
|
|
def get_url(self, email, size=16, name=None):
|
|
|
|
computed = self.compute_hash(email, name=name)
|
|
|
|
return '%s://www.gravatar.com/avatar/%s?d=identicon&size=%s' % (self.preferred_url_scheme,
|
|
|
|
computed, size)
|
|
|
|
|
|
|
|
class LocalAvatar(BaseAvatar):
|
|
|
|
""" Avatar system that uses the local system for generating avatars. """
|
|
|
|
def compute_hash(self, email, name=None):
|
2014-11-25 00:40:03 +00:00
|
|
|
email = email or ""
|
2014-11-25 00:25:13 +00:00
|
|
|
if not name and not email:
|
|
|
|
return ''
|
|
|
|
|
|
|
|
prefix = name if name else email
|
|
|
|
return prefix[0] + hashlib.md5(email.strip().lower()).hexdigest()
|
|
|
|
|
|
|
|
def get_url(self, email, size=16, name=None):
|
|
|
|
computed = self.compute_hash(email, name=name)
|
|
|
|
return '%s://%s/avatar/%s?size=%s' % (self.preferred_url_scheme, self.server_hostname,
|
|
|
|
computed, size)
|
|
|
|
|
|
|
|
|
|
|
|
AVATAR_CLASSES = {
|
|
|
|
'gravatar': GravatarAvatar,
|
|
|
|
'local': LocalAvatar
|
|
|
|
}
|