~widelands-dev/widelands-website/django_staticfiles

« back to all changes in this revision

Viewing changes to wlprofile/gravatar.py

  • Committer: Holger Rapp
  • Date: 2009-02-19 15:31:42 UTC
  • Revision ID: sirver@h566336-20090219153142-dc8xuabldnw5t395
Initial commit of new widelands homepage

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
try:
2
 
    from hashlib import md5
3
 
except ImportError:
4
 
    from md5 import md5
5
 
import os
6
 
import os.path
7
 
import warnings
8
 
import logging
9
 
import urllib
10
 
import urllib2
11
 
from datetime import datetime, timedelta
12
 
import shutil
13
 
import socket
14
 
 
15
 
from pybb import settings as pybb_settings
16
 
from django.core.files.uploadedfile import SimpleUploadedFile
17
 
from django.conf import settings
18
 
 
19
 
warnings.filterwarnings('ignore', r'tmpnam')
20
 
 
21
 
 
22
 
def fetch_gravatar(email):
23
 
    """Fetch avatar from gravatar.com service.
24
 
 
25
 
    Return None if avatar was not found.
26
 
 
27
 
    """
28
 
 
29
 
    hash = md5(email).hexdigest()
30
 
    size = max(pybb_settings.AVATAR_WIDTH, pybb_settings.AVATAR_HEIGHT)
31
 
    default = urllib.quote('http://spam.egg/')
32
 
 
33
 
    url = 'http://www.gravatar.com/avatar/%s?s=%d&d=%s' % (hash, size, default)
34
 
    fname = os.tmpnam()
35
 
 
36
 
    class RedirectHandler(urllib2.HTTPRedirectHandler):
37
 
 
38
 
        def http_error_302(*args):
39
 
            raise IOError('Redirect found')
40
 
 
41
 
    timeout = socket.getdefaulttimeout()
42
 
    socket.setdefaulttimeout(10)
43
 
    opener = urllib2.build_opener(RedirectHandler())
44
 
    socket.setdefaulttimeout(timeout)
45
 
 
46
 
    try:
47
 
        file(fname, 'wb').write(opener.open(url, fname).read())
48
 
    except IOError, ex:
49
 
        # logging.error(ex)
50
 
        return None
51
 
    else:
52
 
        return fname
53
 
 
54
 
 
55
 
def check_gravatar(user, ignore_date_joined=False, ignore_saved_avatar=False):
56
 
    if user.is_active:
57
 
        if ignore_date_joined or (datetime.now() - user.date_joined) < timedelta(seconds=3):
58
 
            if ignore_saved_avatar or not user.pybb_profile.avatar:
59
 
                path = fetch_gravatar(user.email)
60
 
                if path:
61
 
                    avatars_dir = os.path.join(
62
 
                        settings.MEDIA_ROOT, pybb_settings.AVATARS_UPLOAD_TO)
63
 
                    avatar_name = '_pybb_%d' % user.id
64
 
 
65
 
                    avatar_path = os.path.join(avatars_dir, avatar_name)
66
 
                    shutil.copy(path, avatar_path)
67
 
 
68
 
                    relpath = os.path.join(
69
 
                        pybb_settings.AVATARS_UPLOAD_TO, avatar_name)
70
 
                    user.pybb_profile.avatar = relpath
71
 
                    user.pybb_profile.save()
72
 
                    return True
73
 
    return False