/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz

« back to all changes in this revision

Viewing changes to avatarproviders.py

  • Committer: Jelmer Vernooij
  • Date: 2011-03-14 20:12:19 UTC
  • Revision ID: jelmer@samba.org-20110314201219-wo692nzwywu6mevh
Fix formatting, imports.

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
import hashlib
21
21
import threading
22
22
 
23
 
 
24
23
class AvatarProvider(object):
25
 
    """Base class for Avatar providers.
26
 
 
 
24
    """
 
25
    Master class for Avatar providers.
 
26
    
27
27
    All AvatarProviderXxxx classes should inherite from this one
28
28
    and override at least get_base_url.
29
29
    """
30
30
    def __init__(self, size=80):
31
31
        """ Constructor """
32
32
        self.size = size
33
 
 
 
33
    
34
34
    def get_base_url(self):
35
 
        """Return the base URL of this provider.
36
 
        """
37
 
        raise NotImplementedError(self.get_base_url)
 
35
        """
 
36
        Override this methode in your provider class in order to return
 
37
        base url of your provider.
 
38
        """
 
39
        raise NotImplementedError("You must implement the get_base_url method.")
38
40
 
39
41
 
40
42
class AvatarDownloaderWorker(threading.Thread):
41
 
    """Threaded worker to retrieve avatar from a provider.
42
 
 
43
 
    This creates a persistant connection to the provider in order
44
 
    to get avatars quickly through the same socket (urllib2).
45
 
    """
46
 
 
 
43
    """
 
44
    Threaded worker to retrieve avatar from a provider.
 
45
    
 
46
    It create a persitante connection to the provider in order
 
47
    to get avatars quickly through the same socket (urllib3).
 
48
    """
 
49
    
47
50
    def __init__(self, provider_method):
48
 
        """Constructor
49
 
 
50
 
        :param provider_method: Provider method that returns fields
51
 
                 to send with the request.
 
51
        """
 
52
        Constructor
 
53
        
 
54
        provider_method: Provider method that return fields
 
55
                         to send with the request.
52
56
        """
53
57
        threading.Thread.__init__(self)
54
58
        self.__stop = threading.Event()
55
59
        self.__queue = Queue.Queue()
 
60
        
56
61
        self.__provider_method = provider_method
57
 
        self.__callback_method = None
58
 
        self.__error_method = None
59
 
 
 
62
        self.__end_thread = False
 
63
    
60
64
    def stop(self):
61
65
        """ Stop this worker """
 
66
        self.__end_thread = True
62
67
        self.__stop.set()
63
 
        while self.__queue.qsize() > 0:
64
 
            self.__queue.get_nowait()
65
 
            self.__queue.task_done()
66
 
        self.__queue.join()
67
 
 
68
 
    @property
69
 
    def is_running(self):
70
 
        return not self.__stop.is_set()
71
 
 
 
68
    
72
69
    def set_callback_method(self, method):
73
 
        """Fire the given callback method when treatment is finished."""
 
70
        """ Fire the given callback method when treatment is finished """
74
71
        self.__callback_method = method
75
 
 
76
 
    def set_error_method(self, method):
77
 
        """Fire the given callback when retrieving a avatar fails."""
78
 
        self.__error_method = method
79
 
 
 
72
    
80
73
    def queue(self, id_field):
81
 
        """Put in Queue the id_field to treat in the thread.
82
 
 
 
74
        """
 
75
        Put in Queue the id_field to treat in the thread.
83
76
        This id_field is for example with Gravatar the email address.
84
77
        """
85
 
        if self.is_running:
86
 
            self.__queue.put(id_field)
87
 
            if not self.is_alive():
88
 
                self.start()
89
 
 
 
78
        self.__queue.put(id_field)
 
79
    
90
80
    def run(self):
91
 
        """Worker core code. """
92
 
        while self.is_running:
93
 
            try:
94
 
                id_field = self.__queue.get_nowait()
95
 
                # Call provider method to get fields to pass in the request
96
 
                url = self.__provider_method(id_field)
97
 
                # Execute the request
98
 
                try:
99
 
                    response = urllib2.urlopen(url)
100
 
                except urllib2.URLError, e:
101
 
                    if self.__error_method is not None:
102
 
                        self.__error_method(e)
103
 
                else:
104
 
                    # Fire the callback method
105
 
                    if not self.__callback_method is None:
106
 
                        self.__callback_method(response, id_field)
107
 
                self.__queue.task_done()
108
 
            except Queue.Empty:
109
 
                # There is no more work to do.
110
 
                pass
 
81
        """ Worker core code. """
 
82
        while not self.__end_thread:
 
83
            id_field = self.__queue.get()
 
84
            # Call provider method to get fields to pass in the request
 
85
            url = self.__provider_method(id_field)
 
86
            # Execute the request
 
87
            response = urllib2.urlopen(url)
 
88
            # Fire the callback method
 
89
            if not self.__callback_method is None:
 
90
                self.__callback_method(response, id_field)
 
91
            self.__queue.task_done()
111
92
 
112
93
 
113
94
class AvatarProviderGravatar(AvatarProvider):
114
 
    """Gravatar provider."""
115
 
 
 
95
    """ Gravatar provider """
 
96
    
 
97
    def __init__(self):
 
98
        """ Constructor """
 
99
        super(AvatarProviderGravatar, self).__init__()
 
100
    
116
101
    def get_base_url(self):
117
102
        return "http://www.gravatar.com/avatar.php?"
118
 
 
 
103
    
119
104
    def gravatar_id_for_email(self, email):
120
 
        """Return a gravatar URL for an email address.."""
 
105
        """ Return a converted email address to a gravatar_id """
121
106
        return self.get_base_url() + \
122
107
                urllib.urlencode({
123
 
                    'gravatar_id': hashlib.md5(email.lower()).hexdigest(),
124
 
                    'size': str(self.size)
 
108
                    'gravatar_id':hashlib.md5(email.lower()).hexdigest(),
 
109
                    'size':str(self.size)
125
110
                })