109 lines
3.3 KiB
Python
109 lines
3.3 KiB
Python
import hashlib
|
|
|
|
from django.conf import settings
|
|
|
|
from .compat import urlencode, urlopen, Request, HTTPError, URLError
|
|
|
|
# These options can be used to change the default image if no gravatar is found
|
|
GRAVATAR_DEFAULT_IMAGE_404 = '404'
|
|
GRAVATAR_DEFAULT_IMAGE_MYSTERY_MAN = 'mm'
|
|
GRAVATAR_DEFAULT_IMAGE_IDENTICON = 'identicon'
|
|
GRAVATAR_DEFAULT_IMAGE_MONSTER = 'monsterid'
|
|
GRAVATAR_DEFAULT_IMAGE_WAVATAR = 'wavatar'
|
|
GRAVATAR_DEFAULT_IMAGE_RETRO = 'retro'
|
|
|
|
# These options can be used to restrict gravatar content
|
|
GRAVATAR_RATING_G = 'g'
|
|
GRAVATAR_RATING_PG = 'pg'
|
|
GRAVATAR_RATING_R = 'r'
|
|
GRAVATAR_RATING_X = 'x'
|
|
|
|
# Get Gravatar base url from settings.py
|
|
GRAVATAR_URL = getattr(settings, 'GRAVATAR_URL', 'http://www.gravatar.com/')
|
|
GRAVATAR_SECURE_URL = getattr(settings, 'GRAVATAR_SECURE_URL', 'https://secure.gravatar.com/')
|
|
|
|
# Get user defaults from settings.py
|
|
GRAVATAR_DEFAULT_SIZE = getattr(settings, 'GRAVATAR_DEFAULT_SIZE', 80)
|
|
GRAVATAR_DEFAULT_IMAGE = getattr(settings, 'GRAVATAR_DEFAULT_IMAGE',
|
|
GRAVATAR_DEFAULT_IMAGE_MYSTERY_MAN)
|
|
GRAVATAR_DEFAULT_RATING = getattr(settings, 'GRAVATAR_DEFAULT_RATING',
|
|
GRAVATAR_RATING_G)
|
|
GRAVATAR_DEFAULT_SECURE = getattr(settings, 'GRAVATAR_DEFAULT_SECURE', True)
|
|
|
|
|
|
def calculate_gravatar_hash(email):
|
|
# Calculate the email hash
|
|
enc_email = email.strip().lower().encode("utf-8")
|
|
email_hash = hashlib.md5(enc_email).hexdigest()
|
|
return email_hash
|
|
|
|
|
|
def get_gravatar_url(email, size=GRAVATAR_DEFAULT_SIZE, default=GRAVATAR_DEFAULT_IMAGE,
|
|
rating=GRAVATAR_DEFAULT_RATING, secure=GRAVATAR_DEFAULT_SECURE):
|
|
"""
|
|
Builds a url to a gravatar from an email address.
|
|
|
|
:param email: The email to fetch the gravatar for
|
|
:param size: The size (in pixels) of the gravatar to fetch
|
|
:param default: What type of default image to use if the gravatar does not exist
|
|
:param rating: Used to filter the allowed gravatar ratings
|
|
:param secure: If True use https, otherwise plain http
|
|
"""
|
|
if secure:
|
|
url_base = GRAVATAR_SECURE_URL
|
|
else:
|
|
url_base = GRAVATAR_URL
|
|
|
|
# Calculate the email hash
|
|
email_hash = calculate_gravatar_hash(email)
|
|
|
|
# Build querystring
|
|
query_string = urlencode({
|
|
's': str(size),
|
|
'd': default,
|
|
'r': rating,
|
|
})
|
|
|
|
# Build url
|
|
url = '{base}avatar/{hash}.jpg?{qs}'.format(base=url_base,
|
|
hash=email_hash, qs=query_string)
|
|
|
|
return url
|
|
|
|
|
|
def has_gravatar(email):
|
|
"""
|
|
Returns True if the user has a gravatar, False if otherwise
|
|
"""
|
|
# Request a 404 response if the gravatar does not exist
|
|
url = get_gravatar_url(email, default=GRAVATAR_DEFAULT_IMAGE_404)
|
|
|
|
# Verify an OK response was received
|
|
try:
|
|
request = Request(url)
|
|
request.get_method = lambda: 'HEAD'
|
|
return 200 == urlopen(request).code
|
|
except (HTTPError, URLError):
|
|
return False
|
|
|
|
|
|
def get_gravatar_profile_url(email, secure=GRAVATAR_DEFAULT_SECURE):
|
|
"""
|
|
Builds a url to a gravatar profile from an email address.
|
|
|
|
:param email: The email to fetch the gravatar for
|
|
:param secure: If True use https, otherwise plain http
|
|
"""
|
|
if secure:
|
|
url_base = GRAVATAR_SECURE_URL
|
|
else:
|
|
url_base = GRAVATAR_URL
|
|
|
|
# Calculate the email hash
|
|
email_hash = calculate_gravatar_hash(email)
|
|
|
|
# Build url
|
|
url = '{base}{hash}'.format(base=url_base, hash=email_hash)
|
|
|
|
return url
|