# rhbugzilla.py - a Python interface to Red Hat Bugzilla using xmlrpclib.
#
# Copyright (C) 2008-2012 Red Hat Inc.
# Author: Will Woods <wwoods@redhat.com>
#
# This work is licensed under the GNU GPLv2 or later.
# See the COPYING file in the top-level directory.
from logging import getLogger
from ._util import listify
log = getLogger(__name__)
class _RHBugzillaConverters(object):
"""
Static class that holds functional Red Hat back compat converters.
Called inline in Bugzilla
"""
@staticmethod
def convert_build_update(
component=None,
fixed_in=None,
qa_whiteboard=None,
devel_whiteboard=None,
internal_whiteboard=None,
sub_component=None):
adddict = {}
def get_alias():
# RHBZ has a custom extension to allow a bug to have multiple
# aliases, so the format of aliases is
# {"add": [...], "remove": [...]}
# But that means in order to approximate upstream, behavior
# which just overwrites the existing alias, we need to read
# the bug's state first to know what string to remove. Which
# we can't do, since we don't know the bug numbers at this point.
# So fail for now.
#
# The API should provide {"set": [...]}
# https://bugzilla.redhat.com/show_bug.cgi?id=1173114
#
# Implementation will go here when it's available
pass
if fixed_in is not None:
adddict["cf_fixed_in"] = fixed_in
if qa_whiteboard is not None:
adddict["cf_qa_whiteboard"] = qa_whiteboard
if devel_whiteboard is not None:
adddict["cf_devel_whiteboard"] = devel_whiteboard
if internal_whiteboard is not None:
adddict["cf_internal_whiteboard"] = internal_whiteboard
if sub_component:
if not isinstance(sub_component, dict):
component = listify(component)
if not component:
raise ValueError("component must be specified if "
"specifying sub_component")
sub_component = {component[0]: sub_component}
adddict["sub_components"] = sub_component
get_alias()
return adddict
#################
# Query methods #
#################
@staticmethod
def pre_translation(query):
"""
Translates the query for possible aliases
"""
old = query.copy()
def split_comma(_v):
if isinstance(_v, list):
return _v
return _v.split(",")
if 'bug_id' in query:
query['id'] = split_comma(query.pop('bug_id'))
if 'component' in query:
query['component'] = split_comma(query['component'])
if 'include_fields' not in query and 'column_list' in query:
query['include_fields'] = query.pop('column_list')
if old != query:
log.debug("RHBugzilla pretranslated query to: %s", query)
@staticmethod
def post_translation(query, bug):
"""
Convert the results of getbug back to the ancient RHBZ value
formats
"""
ignore = query
# RHBZ _still_ returns component and version as lists, which
# deviates from upstream. Copy the list values to components
# and versions respectively.
if 'component' in bug and "components" not in bug:
val = bug['component']
bug['components'] = isinstance(val, list) and val or [val]
bug['component'] = bug['components'][0]
if 'version' in bug and "versions" not in bug:
val = bug['version']
bug['versions'] = isinstance(val, list) and val or [val]
bug['version'] = bug['versions'][0]
# sub_components isn't too friendly of a format, add a simpler
# sub_component value
if 'sub_components' in bug and 'sub_component' not in bug:
val = bug['sub_components']
bug['sub_component'] = ""
if isinstance(val, dict):
values = []
for vallist in val.values():
values += vallist
bug['sub_component'] = " ".join(values)