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): email = email or "" 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): email = email or "" 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 }