summaryrefslogtreecommitdiffstats
path: root/bugzilla/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'bugzilla/__init__.py')
-rw-r--r--bugzilla/__init__.py74
1 files changed, 74 insertions, 0 deletions
diff --git a/bugzilla/__init__.py b/bugzilla/__init__.py
new file mode 100644
index 0000000..564f00b
--- /dev/null
+++ b/bugzilla/__init__.py
@@ -0,0 +1,74 @@
+# python-bugzilla - a Python interface to bugzilla using xmlrpclib.
+#
+# Copyright (C) 2007,2008 Red Hat Inc.
+# Author: Will Woods <wwoods@redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version. See http://www.gnu.org/copyleft/gpl.html for
+# the full text of the license.
+
+from bugzilla3 import Bugzilla3, Bugzilla32
+from rhbugzilla import RHBugzilla, RHBugzilla3
+from base import version
+import xmlrpclib
+import logging
+log = logging.getLogger("bugzilla")
+
+def getBugzillaClassForURL(url):
+ log.debug("Choosing subclass for %s" % url)
+ s = xmlrpclib.ServerProxy(url)
+ rhbz = False
+ bzversion = ''
+ c = None
+
+ # Check for a RH-only method
+ try:
+ log.debug("Checking for RH Bugzilla method bugzilla.getProdInfo()")
+ prodinfo = s.bugzilla.getProdInfo()
+ rhbz = True
+ except xmlrpclib.Fault:
+ pass
+ log.debug("rhbz=%s" % str(rhbz))
+
+ # Try to get the bugzilla version string
+ try:
+ log.debug("Checking return value of Buzilla.version()")
+ r = s.Bugzilla.version()
+ bzversion = r['version']
+ except xmlrpclib.Fault:
+ pass
+ log.debug("bzversion='%s'" % str(bzversion))
+
+ # XXX note preference order: RHBugzilla* wins if available
+ # RH BZ 3.2 will have rhbz == True and bzversion == 3.1.x or 3.2.x.
+ if rhbz:
+ if bzversion.startswith('3.'):
+ c = RHBugzilla3
+ else:
+ c = RHBugzilla
+ elif bzversion.startswith('3.'):
+ if bzversion.startswith('3.0'):
+ c = Bugzilla3
+ else: # 3.1 or higher
+ c = Bugzilla32
+
+ return c
+
+class Bugzilla(object):
+ '''Magical Bugzilla class that figures out which Bugzilla implementation
+ to use and uses that. Requires 'url' parameter so we can check available
+ XMLRPC methods to determine the Bugzilla version.'''
+ def __init__(self,**kwargs):
+ log.info("Bugzilla v%s initializing" % base.version)
+ if 'url' in kwargs:
+ c = getBugzillaClassForURL(kwargs['url'])
+ if c:
+ self.__class__ = c
+ c.__init__(self,**kwargs)
+ log.info("Chose subclass %s v%s" % (c.__name__,c.version))
+ else:
+ raise ValueError, "Couldn't determine Bugzilla version for %s" % kwargs['url']
+ else:
+ raise TypeError, "You must pass a valid bugzilla xmlrpc.cgi URL"