/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz
719.2.1 by zedtux
Added committers and authors avatars from Gravatar (urllib2 version)
1
# Copyright (C) 2011 by Guillaume Hain (zedtux) <zedtux@zedroot.org>
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
719.2.5 by zedtux
Moved AvatarDownloaderWorker class into avatarsbox.py file
17
import Queue
18
import urllib
19
import urllib2
719.2.3 by zedtux
Renamed avatarprovider.py to avatarproviders.py
20
import hashlib
719.2.5 by zedtux
Moved AvatarDownloaderWorker class into avatarsbox.py file
21
import threading
719.2.3 by zedtux
Renamed avatarprovider.py to avatarproviders.py
22
728 by Jelmer Vernooij
Cleanups, fix compatibility with older versions of pygtk.
23
719.2.1 by zedtux
Added committers and authors avatars from Gravatar (urllib2 version)
24
class AvatarProvider(object):
728 by Jelmer Vernooij
Cleanups, fix compatibility with older versions of pygtk.
25
    """Base class for Avatar providers.
26
719.2.1 by zedtux
Added committers and authors avatars from Gravatar (urllib2 version)
27
    All AvatarProviderXxxx classes should inherite from this one
28
    and override at least get_base_url.
29
    """
30
    def __init__(self, size=80):
31
        """ Constructor """
719.2.2 by zedtux
Patched code following Jelmer's recommandations
32
        self.size = size
728 by Jelmer Vernooij
Cleanups, fix compatibility with older versions of pygtk.
33
719.2.3 by zedtux
Renamed avatarprovider.py to avatarproviders.py
34
    def get_base_url(self):
728 by Jelmer Vernooij
Cleanups, fix compatibility with older versions of pygtk.
35
        """Return the base URL of this provider.
36
        """
37
        raise NotImplementedError(self.get_base_url)
719.2.3 by zedtux
Renamed avatarprovider.py to avatarproviders.py
38
39
719.2.5 by zedtux
Moved AvatarDownloaderWorker class into avatarsbox.py file
40
class AvatarDownloaderWorker(threading.Thread):
728 by Jelmer Vernooij
Cleanups, fix compatibility with older versions of pygtk.
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
719.2.5 by zedtux
Moved AvatarDownloaderWorker class into avatarsbox.py file
47
    def __init__(self, provider_method):
728 by Jelmer Vernooij
Cleanups, fix compatibility with older versions of pygtk.
48
        """Constructor
734.1.32 by Curtis Hovey
Lint fixes while looking at thread issues.
49
728 by Jelmer Vernooij
Cleanups, fix compatibility with older versions of pygtk.
50
        :param provider_method: Provider method that returns fields
51
                 to send with the request.
719.2.5 by zedtux
Moved AvatarDownloaderWorker class into avatarsbox.py file
52
        """
53
        threading.Thread.__init__(self)
54
        self.__stop = threading.Event()
55
        self.__queue = Queue.Queue()
56
        self.__provider_method = provider_method
739 by Jelmer Vernooij
testfix: Allow registration of error methods when retrieving avatars. This should fix the daily builds.
57
        self.__callback_method = None
58
        self.__error_method = None
728 by Jelmer Vernooij
Cleanups, fix compatibility with older versions of pygtk.
59
719.2.5 by zedtux
Moved AvatarDownloaderWorker class into avatarsbox.py file
60
    def stop(self):
61
        """ Stop this worker """
62
        self.__stop.set()
734.1.35 by Curtis Hovey
Remove unneeded exception handlers.
63
        while self.__queue.qsize() > 0:
64
            self.__queue.get_nowait()
65
            self.__queue.task_done()
734.1.34 by Curtis Hovey
Ensure the avatar threads are stopped when the widget is destroyed.
66
        self.__queue.join()
67
68
    @property
69
    def is_running(self):
70
        return not self.__stop.is_set()
728 by Jelmer Vernooij
Cleanups, fix compatibility with older versions of pygtk.
71
719.2.5 by zedtux
Moved AvatarDownloaderWorker class into avatarsbox.py file
72
    def set_callback_method(self, method):
739 by Jelmer Vernooij
testfix: Allow registration of error methods when retrieving avatars. This should fix the daily builds.
73
        """Fire the given callback method when treatment is finished."""
719.2.5 by zedtux
Moved AvatarDownloaderWorker class into avatarsbox.py file
74
        self.__callback_method = method
728 by Jelmer Vernooij
Cleanups, fix compatibility with older versions of pygtk.
75
739 by Jelmer Vernooij
testfix: Allow registration of error methods when retrieving avatars. This should fix the daily builds.
76
    def set_error_method(self, method):
77
        """Fire the given callback when retrieving a avatar fails."""
78
        self.__error_method = method
79
719.2.5 by zedtux
Moved AvatarDownloaderWorker class into avatarsbox.py file
80
    def queue(self, id_field):
728 by Jelmer Vernooij
Cleanups, fix compatibility with older versions of pygtk.
81
        """Put in Queue the id_field to treat in the thread.
82
719.2.5 by zedtux
Moved AvatarDownloaderWorker class into avatarsbox.py file
83
        This id_field is for example with Gravatar the email address.
84
        """
734.1.34 by Curtis Hovey
Ensure the avatar threads are stopped when the widget is destroyed.
85
        if self.is_running:
734.1.36 by Curtis Hovey
Do not exit the run method until stop is set.
86
            self.__queue.put(id_field)
734.1.34 by Curtis Hovey
Ensure the avatar threads are stopped when the widget is destroyed.
87
            if not self.is_alive():
88
                self.start()
728 by Jelmer Vernooij
Cleanups, fix compatibility with older versions of pygtk.
89
719.2.5 by zedtux
Moved AvatarDownloaderWorker class into avatarsbox.py file
90
    def run(self):
728 by Jelmer Vernooij
Cleanups, fix compatibility with older versions of pygtk.
91
        """Worker core code. """
734.1.36 by Curtis Hovey
Do not exit the run method until stop is set.
92
        while self.is_running:
93
            try:
734.1.34 by Curtis Hovey
Ensure the avatar threads are stopped when the widget is destroyed.
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
739 by Jelmer Vernooij
testfix: Allow registration of error methods when retrieving avatars. This should fix the daily builds.
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)
734.1.35 by Curtis Hovey
Remove unneeded exception handlers.
107
                self.__queue.task_done()
734.1.36 by Curtis Hovey
Do not exit the run method until stop is set.
108
            except Queue.Empty:
109
                # There is no more work to do.
110
                pass
719.2.5 by zedtux
Moved AvatarDownloaderWorker class into avatarsbox.py file
111
112
719.2.3 by zedtux
Renamed avatarprovider.py to avatarproviders.py
113
class AvatarProviderGravatar(AvatarProvider):
728 by Jelmer Vernooij
Cleanups, fix compatibility with older versions of pygtk.
114
    """Gravatar provider."""
115
719.2.3 by zedtux
Renamed avatarprovider.py to avatarproviders.py
116
    def get_base_url(self):
117
        return "http://www.gravatar.com/avatar.php?"
728 by Jelmer Vernooij
Cleanups, fix compatibility with older versions of pygtk.
118
719.2.3 by zedtux
Renamed avatarprovider.py to avatarproviders.py
119
    def gravatar_id_for_email(self, email):
728 by Jelmer Vernooij
Cleanups, fix compatibility with older versions of pygtk.
120
        """Return a gravatar URL for an email address.."""
719.2.3 by zedtux
Renamed avatarprovider.py to avatarproviders.py
121
        return self.get_base_url() + \
122
                urllib.urlencode({
734.1.32 by Curtis Hovey
Lint fixes while looking at thread issues.
123
                    'gravatar_id': hashlib.md5(email.lower()).hexdigest(),
124
                    'size': str(self.size)
719.2.3 by zedtux
Renamed avatarprovider.py to avatarproviders.py
125
                })