Exemple #1
0
    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
Exemple #2
0
    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
Exemple #5
0
    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