From 96856df3e4a651e61ab66c320dc0c9816e24bd63 Mon Sep 17 00:00:00 2001 From: Sandro Date: Sat, 19 Nov 2022 13:57:27 +0100 Subject: [PATCH] Add additional scripts Both scripts help when cleaning up badges. All authorizations and all invitations as well as awardees need to be removed before the badge itself can be removed. There's no functionality in the web interface to see who's authorized for particular badges. Invitations are a bit of an undocumented feature. But I stumbled upon it trying to delete an old badge. --- roles/badges/backend/files/list-authorization | 69 ++++++++++++++++ roles/badges/backend/files/revoke-invitations | 79 +++++++++++++++++++ 2 files changed, 148 insertions(+) create mode 100644 roles/badges/backend/files/list-authorization create mode 100644 roles/badges/backend/files/revoke-invitations diff --git a/roles/badges/backend/files/list-authorization b/roles/badges/backend/files/list-authorization new file mode 100644 index 0000000000..bcf337da34 --- /dev/null +++ b/roles/badges/backend/files/list-authorization @@ -0,0 +1,69 @@ +#!/usr/bin/env python +""" +This is a CLI script for listing that are authorized on a badge. +""" + +import __main__ +__main__.__requires__ = __requires__ = ["tahrir-api", "sqlalchemy>=0.7"]; +import pkg_resources +pkg_resources.require(__requires__) + +import argparse +import transaction +import sys + +from tahrir_api.dbapi import TahrirDatabase +import tahrir_api.model + +import fedmsg +import fedmsg.config + +import fedbadges.utils + + +def parse_args(): + parser = argparse.ArgumentParser(__doc__) + parser.add_argument('--badge', default=None, help="A badge id") + args = parser.parse_args() + if not args.badge: + print "You must specify a badge id." + sys.exit(1) + return args + + +def initialize(): + fm_config = fedmsg.config.load_config() + fm_config['cert_prefix'] = 'fedbadges' + fm_config['name'] = 'relay_inbound' + fm_config['active'] = True + fedmsg.init(**fm_config) + uri = fm_config['badges_global']['database_uri'] + tahrir = TahrirDatabase( + uri, + notification_callback=fedbadges.utils.notification_callback, + ) + return tahrir + + +def main(tahrir, badge_id): + badge = tahrir.get_badge(badge_id) + + if not badge: + print "No such badge %r" % badge_id + sys.exit(1) + + authz = tahrir.session.query(tahrir_api.model.Authorization)\ + .filter(tahrir_api.model.Authorization.badge_id==badge.id)\ + .all() + + if not authz: + print "no-one is authorized for %r badge..." % (badge_id) + return + + for person in [assertion.person for assertion in authz]: + print person.nickname + +if __name__ == '__main__': + args = parse_args() + tahrir = initialize() + main(tahrir, args.badge) diff --git a/roles/badges/backend/files/revoke-invitations b/roles/badges/backend/files/revoke-invitations new file mode 100644 index 0000000000..cbb8f9c2f6 --- /dev/null +++ b/roles/badges/backend/files/revoke-invitations @@ -0,0 +1,79 @@ +#!/usr/bin/env python +""" +This is a CLI script for revoking all invitations on a badge. +""" + +import __main__ +__main__.__requires__ = __requires__ = ["tahrir-api", "sqlalchemy>=0.7"]; +import pkg_resources +pkg_resources.require(__requires__) + +import argparse +import transaction +import sys + +from tahrir_api.dbapi import TahrirDatabase +import tahrir_api.model + +import fedmsg +import fedmsg.config + +import fedbadges.utils + + +def parse_args(): + parser = argparse.ArgumentParser(__doc__) + parser.add_argument('--badge', default=None, help="A badge id") + args = parser.parse_args() + if not args.badge: + print "You must specify a badge id." + sys.exit(1) + return args + + +def initialize(): + fm_config = fedmsg.config.load_config() + fm_config['cert_prefix'] = 'fedbadges' + fm_config['name'] = 'relay_inbound' + fm_config['active'] = True + fedmsg.init(**fm_config) + uri = fm_config['badges_global']['database_uri'] + tahrir = TahrirDatabase( + uri, + notification_callback=fedbadges.utils.notification_callback, + ) + return tahrir + + +def main(tahrir, badge_id): + badge = tahrir.get_badge(badge_id) + + if not badge: + print "No such badge %r" % badge_id + sys.exit(1) + + invites = tahrir.session.query(tahrir_api.model.Invitation)\ + .filter(tahrir_api.model.Invitation.badge_id==badge.id)\ + .all() + + if not invites: + print "There are no invitations on %r badge..." % badge_id + return + + print "Found %r invitation(s)" % len(invites) + try: + transaction.begin() + for item in invites: + print " deleting:", item + tahrir.session.delete(item) + tahrir.session.commit() + transaction.commit() + except Exception as e: + transaction.abort() + print "Failure:", e + + +if __name__ == '__main__': + args = parse_args() + tahrir = initialize() + main(tahrir, args.badge)