def build_update(self, **kwargs): adddict = {} def pop(key, destkey): val = kwargs.pop(key, None) if val is None: return adddict[destkey] = val def get_sub_component(): val = kwargs.pop("sub_component", None) if val is None: return if type(val) is not dict: component = self._listify(kwargs.get("component")) if not component: raise ValueError("component must be specified if " "specifying sub_component") val = {component[0]: val} adddict["sub_components"] = val pop("fixed_in", "cf_fixed_in") pop("qa_whiteboard", "cf_qa_whiteboard") pop("devel_whiteboard", "cf_devel_whiteboard") pop("internal_whiteboard", "cf_internal_whiteboard") get_sub_component() vals = _parent.build_update(self, **kwargs) vals.update(adddict) return vals
def __init__(self, *args, **kwargs): """ @rhbz_back_compat: If True, convert parameters to the format they were in prior RHBZ upgrade in June 2012. Mostly this replaces lists with comma separated strings, and alters groups and flags. Default is False. Please don't use this in new code, just update your scripts. @multicall: Unused nowadays, will be removed in the future """ # 'multicall' is no longer used, just ignore it multicall = kwargs.pop("multicall", None) self.rhbz_back_compat = bool(kwargs.pop("rhbz_back_compat", False)) if multicall is not None: log.warn("multicall is unused and will be removed in a " "future release.") if self.rhbz_back_compat: log.warn("rhbz_back_compat will be removed in a future release.") _parent.__init__(self, *args, **kwargs) def _add_both_alias(newname, origname): self._add_field_alias(newname, origname, is_api=False) self._add_field_alias(origname, newname, is_bug=False) _add_both_alias("fixed_in", "cf_fixed_in") _add_both_alias("qa_whiteboard", "cf_qa_whiteboard") _add_both_alias("devel_whiteboard", "cf_devel_whiteboard") _add_both_alias("internal_whiteboard", "cf_internal_whiteboard") self._add_field_alias("component", "components", is_bug=False) self._add_field_alias("version", "versions", is_bug=False) self._add_field_alias("sub_component", "sub_components", is_bug=False) # flags format isn't exactly the same but it's the closest approx self._add_field_alias("flags", "flag_types") self._getbug_extra_fields = self._getbug_extra_fields + [ "comments", "description", "external_bugs", "flags", "sub_components", "tags", ] self._supports_getbug_extra_fields = True
def __init__(self, **kwargs): """ @multicall: No longer used @rhbz_back_compat: If True, convert parameters to the format they were in prior RHBZ upgrade in June 2012. Mostly this replaces lists with comma separated strings, and alters groups and flags. Default is False """ # 'multicall' is no longer used, keep it here for back compat self.multicall = True self.rhbz_back_compat = False if "multicall" in kwargs: self.multicall = kwargs.pop("multicall") if "rhbz_back_compat" in kwargs: self.rhbz_back_compat = bool(kwargs.pop("rhbz_back_compat")) _parent.__init__(self, **kwargs)
def build_update(self, *args, **kwargs): adddict = {} def pop(key, destkey): if key not in kwargs: return val = kwargs.pop(key) if val is None: return adddict[destkey] = val pop("fixed_in", "cf_fixed_in") pop("qa_whiteboard", "cf_qa_whiteboard") pop("devel_whiteboard", "cf_devel_whiteboard") pop("internal_whiteboard", "cf_internal_whiteboard") vals = _parent.build_update(self, *args, **kwargs) vals.update(adddict) return vals
def build_query(self, **kwargs): query = {} def _add_key(paramname, keyname, listify=False): val = kwargs.pop(paramname, None) if val is None: return if listify: val = self._listify(val) query[keyname] = val def add_longdesc(): val = kwargs.pop("long_desc", None) if val is None: return query["query_format"] = "advanced" query["longdesc"] = val query["longdesc_type"] = "allwordssubstr" def add_email(key, count): value = kwargs.pop(key, None) if value is None: return count query["query_format"] = "advanced" query["email%i" % count] = value query["email%s%i" % (key, count)] = True query["emailtype%i" % count] = kwargs.get("emailtype", "substring") return count + 1 def bool_smart_split(boolval): # This parses the CLI command syntax, but we only want to # do space splitting if the space is actually part of a # boolean operator boolchars = ["|", "&", "!"] add = "" retlist = [] for word in boolval.split(" "): if word.strip() in boolchars: word = word.strip() if add: retlist.append(add) add = "" retlist.append(word) else: if add: add += " " add += word if add: retlist.append(add) return retlist def add_boolean(kwkey, key, bool_id): value = self._listify(kwargs.pop(kwkey, None)) if value is None: return bool_id query["query_format"] = "advanced" for boolval in value: and_count = 0 or_count = 0 def make_bool_str(prefix): return "%s%i-%i-%i" % (prefix, bool_id, and_count, or_count) for par in bool_smart_split(boolval): field = None fval = par typ = kwargs.get("booleantype", "substring") if par == "&": and_count += 1 elif par == "|": or_count += 1 elif par == "!": query["negate%i" % bool_id] = 1 elif not key: if par.find("-") == -1: raise RuntimeError("Malformed boolean query: %s" % value) args = par.split("-", 2) field = args[0] typ = args[1] fval = None if len(args) == 3: fval = args[2] else: field = key query[make_bool_str("field")] = field if fval: query[make_bool_str("value")] = fval query[make_bool_str("type")] = typ bool_id += 1 return bool_id # Use fancy email specification for RH bugzilla. It isn't # strictly required, but is more powerful, and it is what # bin/bugzilla historically generated. This requires # query_format='advanced' which is an RHBZ only XMLRPC extension email_count = 1 email_count = add_email("cc", email_count) email_count = add_email("assigned_to", email_count) email_count = add_email("reporter", email_count) email_count = add_email("qa_contact", email_count) chart_id = 0 chart_id = add_boolean("fixed_in", "cf_fixed_in", chart_id) chart_id = add_boolean("blocked", "blocked", chart_id) chart_id = add_boolean("dependson", "dependson", chart_id) chart_id = add_boolean("flag", "flagtypes.name", chart_id) chart_id = add_boolean("qa_whiteboard", "cf_qa_whiteboard", chart_id) chart_id = add_boolean("devel_whiteboard", "cf_devel_whiteboard", chart_id) chart_id = add_boolean("alias", "alias", chart_id) chart_id = add_boolean("boolean_query", None, chart_id) add_longdesc() _add_key("quicksearch", "quicksearch") _add_key("savedsearch", "savedsearch") _add_key("savedsearch_sharer_id", "sharer_id") _add_key("sub_component", "sub_components", listify=True) extra_fields = self._convert_include_field_list(kwargs.pop("extra_fields", None)) if extra_fields: query["extra_fields"] = extra_fields newquery = _parent.build_query(self, **kwargs) query.update(newquery) self.pre_translation(query) return query
def build_query(self, **kwargs): query = {} def add_email(key, count): if not key in kwargs: return count value = kwargs.get(key) del(kwargs[key]) if value is None: return count query["query_format"] = "advanced" query['email%i' % count] = value query['email%s%i' % (key, count)] = True query['emailtype%i' % count] = kwargs.get("emailtype", "substring") return count + 1 def bool_smart_split(boolval): # This parses the CLI command syntax, but we only want to # do space splitting if the space is actually part of a # boolean operator boolchars = ["|", "&", "!"] add = "" retlist = [] for word in boolval.split(" "): if word.strip() in boolchars: word = word.strip() if add: retlist.append(add) add = "" retlist.append(word) else: if add: add += " " add += word if add: retlist.append(add) return retlist def add_boolean(kwkey, key, bool_id): if not kwkey in kwargs: return bool_id value = self._listify(kwargs.pop(kwkey)) if value is None: return bool_id query["query_format"] = "advanced" for boolval in value: and_count = 0 or_count = 0 def make_bool_str(prefix): return "%s%i-%i-%i" % (prefix, bool_id, and_count, or_count) for par in bool_smart_split(boolval): field = None fval = par typ = kwargs.get("booleantype", "substring") if par == "&": and_count += 1 elif par == "|": or_count += 1 elif par == "!": query['negate%i' % bool_id] = 1 elif not key: if par.find('-') == -1: raise RuntimeError('Malformed boolean query: %s' % value) args = par.split('-', 2) field = args[0] typ = args[1] fval = None if len(args) == 3: fval = args[2] else: field = key query[make_bool_str("field")] = field if fval: query[make_bool_str("value")] = fval query[make_bool_str("type")] = typ bool_id += 1 return bool_id # Use fancy email specification for RH bugzilla. It isn't # strictly required, but is more powerful, and it is what # bin/bugzilla historically generated. This requires # query_format='advanced' which is an RHBZ only XMLRPC extension email_count = 1 email_count = add_email("cc", email_count) email_count = add_email("assigned_to", email_count) email_count = add_email("reporter", email_count) email_count = add_email("qa_contact", email_count) chart_id = 0 chart_id = add_boolean("fixed_in", "cf_fixed_in", chart_id) chart_id = add_boolean("blocked", "blocked", chart_id) chart_id = add_boolean("dependson", "dependson", chart_id) chart_id = add_boolean("flag", "flagtypes.name", chart_id) chart_id = add_boolean("qa_whiteboard", "cf_qa_whiteboard", chart_id) chart_id = add_boolean("devel_whiteboard", "cf_devel_whiteboard", chart_id) chart_id = add_boolean("alias", "alias", chart_id) chart_id = add_boolean("boolean_query", None, chart_id) newquery = _parent.build_query(self, **kwargs) query.update(newquery) self.pre_translation(query) return query