From 95c7c2090aabc8b232a56ed7c8cfe8e88dd3a765 Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Fri, 5 Feb 2016 16:01:59 -0500 Subject: [PATCH] Add a tool for purging users --- tools/deleteaccount.py | 52 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 tools/deleteaccount.py diff --git a/tools/deleteaccount.py b/tools/deleteaccount.py new file mode 100644 index 000000000..5dda48ec1 --- /dev/null +++ b/tools/deleteaccount.py @@ -0,0 +1,52 @@ +import logging +import sys + +from app import app +from data import model +from data.database import Repository, User + +logger = logging.getLogger(__name__) + + +def delete_summary(username): + found = User.get(User.username == username) + dependencies = found.dependencies(search_nullable=False) + counts = {} + for expression, field in dependencies: + use_count = field.model_class.select().where(expression).count() + if use_count > 0: + counts[field.model_class.__name__] = use_count + + return counts + + +def delete_username(username): + # First delete the repositories owned by this user + found = User.get(User.username == username) + for repository in list(Repository.select().where(Repository.namespace_user == found)): + print 'Deleting repository: {0}/{1}'.format(found.username, repository.name) + model.repository.purge_repository(found.username, repository.name) + + # Now recursively delete user, which will clean up all non-nullable referencing fields + print 'Deleting user: {0}'.format(username) + found.delete_instance(recursive=True) + + +if __name__ == '__main__': + logging.basicConfig(level=logging.DEBUG) + + summary = delete_summary(sys.argv[1]).items() + + if summary: + print 'Will delete:' + for model_name, count in summary: + print '{0}: {1}'.format(model_name, count) + else: + print 'Nothing references user.' + + print 'Delete? [y/n]' + delete_yn = raw_input().lower().strip() + if delete_yn == 'y': + delete_username(sys.argv[1]) + else: + print 'Aborted!'