~widelands-dev/widelands-website/django_staticfiles

« back to all changes in this revision

Viewing changes to pybb/gravatar.py

  • Committer: Holger Rapp
  • Date: 2009-02-25 16:55:36 UTC
  • Revision ID: sirver@kallisto.local-20090225165536-3abfhjx8qsgtzyru
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :(

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
def fetch_gravatar(email):
 
22
    """
 
23
    Fetch avatar from gravatar.com service.
 
24
 
 
25
    Return None if avatar was not found.
 
26
    """
 
27
 
 
28
    hash = md5(email).hexdigest()
 
29
    size = max(pybb_settings.AVATAR_WIDTH, pybb_settings.AVATAR_HEIGHT)
 
30
    default = urllib.quote('http://spam.egg/')
 
31
 
 
32
    url = 'http://www.gravatar.com/avatar/%s?s=%d&d=%s' % (hash, size, default)
 
33
    fname = os.tmpnam()
 
34
 
 
35
    class RedirectHandler(urllib2.HTTPRedirectHandler):
 
36
        def http_error_302(*args):
 
37
            raise IOError('Redirect found')
 
38
 
 
39
    timeout = socket.getdefaulttimeout()
 
40
    socket.setdefaulttimeout(10)
 
41
    opener = urllib2.build_opener(RedirectHandler())
 
42
    socket.setdefaulttimeout(timeout)
 
43
 
 
44
    try:
 
45
        file(fname, 'wb').write(opener.open(url, fname).read())
 
46
    except IOError, ex:
 
47
        #logging.error(ex)
 
48
        return None
 
49
    else:
 
50
        return fname
 
51
 
 
52
 
 
53
def check_gravatar(user, ignore_date_joined=False, ignore_saved_avatar=False):
 
54
    if user.is_active:
 
55
        if ignore_date_joined or (datetime.now() - user.date_joined) < timedelta(seconds=3):
 
56
            if ignore_saved_avatar or not user.pybb_profile.avatar:
 
57
                path = fetch_gravatar(user.email)
 
58
                if path:
 
59
                    avatars_dir = os.path.join(settings.MEDIA_ROOT, pybb_settings.AVATARS_UPLOAD_TO)
 
60
                    avatar_name = '_pybb_%d' % user.id
 
61
 
 
62
                    avatar_path = os.path.join(avatars_dir, avatar_name)
 
63
                    shutil.copy(path, avatar_path)
 
64
 
 
65
                    relpath = os.path.join(pybb_settings.AVATARS_UPLOAD_TO, avatar_name)
 
66
                    user.pybb_profile.avatar = relpath
 
67
                    user.pybb_profile.save()
 
68
                    return True
 
69
    return False