From cfdbfeb6958b8858a17aeff57a66daf20c2feb90 Mon Sep 17 00:00:00 2001 From: Tomas Kopecek Date: Oct 30 2019 16:12:55 +0000 Subject: Add function to list sidetags --- diff --git a/sidetag_cli.py b/sidetag_cli.py index 3d11dc4..b6dccda 100644 --- a/sidetag_cli.py +++ b/sidetag_cli.py @@ -55,3 +55,28 @@ def handle_remove_sidetag(options, session, args): for sidetag in opts.sidetags: session.removeSideTag(sidetag) session.multiCall(strict=True) + + +@export_cli +def handle_list_sidetags(options, session, args): + "List sidetags" + usage = _("usage: %(prog)s list-sidetags [options]") + usage += _("\n(Specify the --help global option for a list of other help options)") + parser = ArgumentParser(usage=usage) + parser.add_argument("--basetag", action="store", help=_("Filter on basetag")) + parser.add_argument("--user", action="store", help=_("Filter on user")) + parser.add_argument("--mine", action="store_true", help=_("Filter on user")) + + opts = parser.parse_args(args) + + if opts.mine and opts.user: + parser.error(_("Specify only one from --user --mine")) + + if opts.mine: + activate_session(session, options) + user = session.getLoggedInUser()["name"] + else: + user = opts.user + + for tag in session.listSideTags(basetag=opts.basetag, user=user): + print (tag["name"]) diff --git a/sidetag_hub.py b/sidetag_hub.py index 7f43674..9624d66 100644 --- a/sidetag_hub.py +++ b/sidetag_hub.py @@ -26,7 +26,6 @@ from kojihub import ( assert_policy, get_tag, get_user, - get_event, get_build_target, _create_tag, _create_build_target, @@ -34,6 +33,7 @@ from kojihub import ( _delete_build_target, readTaggedBuilds, QueryProcessor, + nextval, ) @@ -55,25 +55,25 @@ def createSideTag(base_tag): query = QueryProcessor( tables=["tag_extra"], clauses=["key='sidetag_user_id'", "value=%(user_id)s", "active IS TRUE"], - columns=["COUNT(*)", "MAX(tag_id) + 1"], - aliases=["user_tags", "tag_id_candidate"], + columns=["COUNT(*)"], + aliases=["user_tags"], values={"user_id": str(user["id"])}, ) - data = query.executeOne() - if not data: + user_tags = query.executeOne() + if user_tags is None: # should not ever happen raise koji.GenericError("Unknown db error") # Policy is a very flexible mechanism, that can restrict for which # tags sidetags can be created, or which users can create sidetags etc. assert_policy( - "sidetag", {"tag": base_tag["id"], "number_of_tags": data["user_tags"]} + "sidetag", {"tag": base_tag["id"], "number_of_tags": user_tags["user_tags"]} ) - # tag_id_candidate is just used a unique value that makes sidetags names - # unique, it is the first unused number in user/tag sequence, not global - # top tag_id. Nothing should be infered from this number. - sidetag_name = "%s-side-%s" % (base_tag["name"], data["tag_id_candidate"]) + # ugly, it will waste one number in tag_id_seq, but result will match with + # id assigned by _create_tag + tag_id = nextval("tag_id_seq") + 1 + sidetag_name = "%s-side-%s" % (base_tag["name"], tag_id) sidetag_id = _create_tag( sidetag_name, parent=base_tag["id"], @@ -117,6 +117,52 @@ def _remove_sidetag(sidetag): _delete_tag(sidetag["id"]) +@export +def listSideTags(basetag=None, user=None): + """List all sidetags possible filtered by basetag or user""" + # te1.sidetag + # te2.user_id + # te3.basetag + if user is not None: + user_id = str(get_user(user, strict=True)["id"]) + else: + user_id = None + if basetag is not None: + basetag_id = get_tag(basetag, strict=True)["id"] + else: + basetag_id = None + + joins = ["LEFT JOIN tag_extra AS te1 ON tag.id = te1.tag_id"] + clauses = ["te1.active IS TRUE", "te1.key = 'sidetag'", "te1.value = 'true'"] + if user_id: + joins.append("LEFT JOIN tag_extra AS te2 ON tag.id = te2.tag_id") + clauses.extend( + [ + "te2.active IS TRUE", + "te2.key = 'sidetag_user_id'", + "te2.value = %(user_id)s", + ] + ) + if basetag_id: + joins.append("LEFT JOIN tag_inheritance ON tag.id = tag_inheritance.tag_id") + clauses.extend( + [ + "tag_inheritance.active IS TRUE", + "tag_inheritance.parent_id = %(basetag_id)s", + ] + ) + + query = QueryProcessor( + tables=["tag"], + clauses=clauses, + columns=["tag.id", "tag.name"], + aliases=["id", "name"], + joins=joins, + values={"basetag_id": basetag_id, "user_id": user_id}, + ) + return query.execute() + + @callback("postUntag") def handle_sidetag_untag(cbtype, *args, **kws): """Remove a side tag when its last build is untagged