Twisted API for Bugzilla
Project description
Access Bugzilla’s XML-RPC API asyncronously (non-blocking) using the Twisted framework.
Simple Example: Fetching a bug
from txbugzilla import connect, BugzillaException
from twisted.internet import defer, reactor
@defer.inlineCallbacks
def example():
# connect() defaults to https://bugzilla.redhat.com/xmlrpc.cgi
bz = yield connect()
# fetch a bug
try:
bug = yield bz.get_bug_simple(10000)
print(bug.summary)
except BugzillaException as e:
print(e)
if __name__ == '__main__':
example().addCallback(lambda ign: reactor.stop())
reactor.run()
Example: Authentication
By default, connections to Bugzilla are anonymous, so you cannot do fun things like update bugs or view private bugs or private information. If you wish to authenticate your connection to Bugzilla, you can pass a username and password to connect(). The deferred that connect() returns will fire a callback when the authentication succeeds.
from txbugzilla import connect
from twisted.internet import defer
@defer.inlineCallbacks
def example():
# Authenticate via username and password
bz = yield connect(username='user@example.com', password='foo')
# Do something as this logged-in username, for example:
# bug = yield bz.getbugsimple(...)
Example: Re-using Authentication token
Authenticating to Bugzilla with a username and password involves one XML-RPC roundtrip during connect() in order to obtain a token and use that token on subsequent actions.
If you’ve already authenticated one time, you can save the token offline and re-use it when your program runs again.
from txbugzilla import connect
from twisted.internet import defer
@defer.inlineCallbacks
def example():
# Authenticate via username and password
bz = yield connect(username='user@example.com', password='foo')
# Save bz.token to a file or database to reuse it later and avoid
# having to re-authenticate.
print(bz.token)
# prints "123456-abcdef987"
And then, to re-use this token later:
from txbugzilla import Connection
from twisted.internet import defer
@defer.inlineCallbacks
def some_time_later():
# Re-connect using that saved token
bz = Connection(username='user@example.com', token='123456-abcdef987')
# Do something as this logged-in username, for example assign a bug
# to someone:
yield bz.assign(1234, 'someone@redhat.com')
Side note: ~/.bugzillatoken
If you pass no parameters to connect(), the resulting connection will be anonymous unless you have a special .bugzillatoken file in your home directory. This file should look something like this:
$ cat ~/.bugzillatoken [bugzilla.redhat.com] token = 123456-abcdef987
txbugzilla will look for this file and attempt to use the token there if one exists.
To construct this .bugzillatoken file, you can use the python-bugzilla module, like so:
$ pip install python-bugzilla $ bugzilla login Bugzilla Username: user@example.com Bugzilla Password: ********** Login successful.
Example: Assigning bugs
This will definitely earn you friends.
from txbugzilla import connect, BugzillaException
from twisted.internet import defer
@defer.inlineCallbacks
def example():
bz = yield connect(username='user@example.com', password='foo')
try:
result = yield bz.assign(1234, 'someone@redhat.com')
if result:
print('assigned bz #1234 to someone@redhat.com')
else:
print('bz #1234 is already assigned to someone@redhat.com')
except BugzillaException as e:
print(e)
Example: Searching with an upstream bug
Quickly find out “What BZ matches this external tracker ticket?”
from txbugzilla import connect, BugzillaException
from twisted.internet import defer
def example():
bz = yield connect()
try:
result = yield bz.find_by_external_tracker(
'http://tracker.ceph.com', '16673')
for b in result:
print(b.weburl + ' ' + b.summary)
except BugzillaException as e:
print(e)
Example: Raw XML-RPC calls
Want to make some API call not mentioned here? Use the call() method to make raw XML-RPC calls. It will take care of token authentication for you, too.
For example, to see a list of all the groups of which you are a member:
from txbugzilla import connect, BugzillaException
from twisted.internet import defer
from pprint import pprint
@defer.inlineCallbacks
def example():
bz = yield connect(username='user@example.com', password='foo')
try:
result = yield bz.call('User.get', {'names': [bz.username],
'include_fields': ['groups']})
pprint(result['users'][0]['groups'])
except BugzillaException as e:
print(e)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.