allow various bnc instances in NovellBugzilla
[opensuse:python-bugzilla.git] / bugzilla / __init__.py
1 # python-bugzilla - a Python interface to bugzilla using xmlrpclib.
2 #
3 # Copyright (C) 2007,2008 Red Hat Inc.
4 # Author: Will Woods <wwoods@redhat.com>
5
6 # This program is free software; you can redistribute it and/or modify it
7 # under the terms of the GNU General Public License as published by the
8 # Free Software Foundation; either version 2 of the License, or (at your
9 # option) any later version.  See http://www.gnu.org/copyleft/gpl.html for
10 # the full text of the license.
11
12 from bugzilla3 import Bugzilla3, Bugzilla32, Bugzilla34, Bugzilla36
13 from rhbugzilla import RHBugzilla, RHBugzilla3
14 from nvlbugzilla import NovellBugzilla
15 from base import version
16 import xmlrpclib
17 import logging
18 log = logging.getLogger("bugzilla")
19
20 # advertised class list
21 classlist = ['Bugzilla3', 'Bugzilla32', 'Bugzilla34', 'Bugzilla36',
22              'RHBugzilla3', 'NovellBugzilla']
23
24 def getBugzillaClassForURL(url):
25     log.debug("Choosing subclass for %s" % url)
26     if 'novell.com' in url:
27         return NovellBugzilla
28
29     s = xmlrpclib.ServerProxy(url)
30     rhbz = False
31     bzversion = ''
32     c = None
33
34     # Check for a RH-only method
35     try:
36         log.debug("Checking for RH Bugzilla method bugzilla.getProdInfo()")
37         prodinfo = s.bugzilla.getProdInfo()
38         rhbz = True
39     except xmlrpclib.Fault:
40         pass
41     log.debug("rhbz=%s" % str(rhbz))
42
43     # Try to get the bugzilla version string
44     try:
45         log.debug("Checking return value of Buzilla.version()")
46         r = s.Bugzilla.version()
47         bzversion = r['version']
48     except xmlrpclib.Fault:
49         pass
50     log.debug("bzversion='%s'" % str(bzversion))
51
52     # XXX note preference order: RHBugzilla* wins if available
53     # RH BZ 3.2 will have rhbz == True and bzversion == 3.1.x or 3.2.x. 
54     if rhbz:
55         if bzversion.startswith('3.'):
56             c = RHBugzilla3
57         else:
58             c = RHBugzilla
59     elif bzversion.startswith('3.'):
60         if bzversion.startswith('3.6'):
61             c = Bugzilla36
62         elif bzversion.startswith('3.4'):
63             c = Bugzilla34
64         elif bzversion.startswith('3.2'):
65             c = Bugzilla32
66         else:
67             c = Bugzilla3
68
69     return c
70
71 class Bugzilla(object):
72     '''Magical Bugzilla class that figures out which Bugzilla implementation
73     to use and uses that. Requires 'url' parameter so we can check available
74     XMLRPC methods to determine the Bugzilla version.'''
75     def __init__(self,**kwargs):
76         log.info("Bugzilla v%s initializing" % base.version)
77         if 'url' in kwargs:
78             c = getBugzillaClassForURL(kwargs['url'])
79             if c:
80                 self.__class__ = c
81                 c.__init__(self,**kwargs)
82                 log.info("Chose subclass %s v%s" % (c.__name__,c.version))
83             else:
84                 raise ValueError, "Couldn't determine Bugzilla version for %s" % kwargs['url']
85         else:
86             raise TypeError, "You must pass a valid bugzilla xmlrpc.cgi URL"