FogBugz » FogBugzPy A Python wrapper for the FogBugz API Read More
Clone URL:  
fogbugz.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import urllib import urllib2 from BeautifulSoup import BeautifulSoup, CData class FogBugzAPIError(Exception): pass class FogBugzLogonError(FogBugzAPIError): pass class FogBugzConnectionError(FogBugzAPIError): pass class FogBugz: def __init__(self, url): self.__handlerCache = {} if not url.endswith('/'): url += '/' self._token = None self._opener = urllib2.build_opener() try: soup = BeautifulSoup(self._opener.open(url + 'api.xml')) except URLError: raise FogBugzConnectionError("Library could not connect to the FogBugz API. Either this installation of FogBugz does not support the API, or the url, %s, is incorrect." % (self._url,)) self._url = url + soup.response.url.string self.currentFilter = None def logon(self, username, password): """ Logs the user on to FogBugz. Returns None for a successful login. """ if self._token: self.logoff() try: response = self.__makerequest('logon', email=username, password=password) except FogBugzAPIError, e: raise FogBugzLogonError(e) self._token = response.token.string if type(self._token) == CData: self._token = self._token.encode('utf-8') def logoff(self): """ Logs off the current user. """ self.__makerequest('logoff') self._token = None def __makerequest(self, cmd, **kwargs): kwargs["cmd"] = cmd if self._token: kwargs["token"] = self._token try: response = BeautifulSoup(self._opener.open(self._url+urllib.urlencode(kwargs))).response except urllib2.URLError, e: raise FogBugzConnectionError(e) if response.error: raise FogBugzAPIError('Error Code %s: %s' % (response.error['code'], response.error.string,)) return response def __getattr__(self, name): """ Handle all FogBugz API calls. >>> fb.logon(email@example.com, password) >>> response = fb.search(q="assignedto:email") """ # Let's leave the private stuff to Python if name.startswith("__"): raise AttributeError("No such attribute '%s'" % name) if not self.__handlerCache.has_key(name): def handler(**kwargs): return self.__makerequest(name, **kwargs) self.__handlerCache[name] = handler return self.__handlerCache[name]