#!/usr/bin/python # import os import sys from collections import Counter import django from django.db.models import Count if os.path.exists('../apps'): sys.path.insert(0, '../apps') elif os.path.exists('./apps'): sys.path.insert(0, './apps') os.environ.setdefault("DJANGO_SETTINGS_MODULE", "jumpserver.settings") django.setup() from users.models import UserGroup from django.core.exceptions import FieldError def clean_group(interactive=True): try: UserGroup.objects.all().filter(is_discard=True).delete() except FieldError: pass groups = UserGroup.objects.all() groups_name_list = groups.values_list('name', flat=True) groups_with_info = groups.annotate(Count('users'))\ .annotate(Count('asset_permissions')) counter = Counter(groups_name_list) for name, count in counter.items(): if count == 0: continue groups_duplicate = groups_with_info.filter(name=name) need_clean_count = groups_duplicate.count() for group in groups_duplicate: need_clean = True if group.users__count > 0: need_clean = False elif group.asset_permissions__count > 0: need_clean = False elif need_clean_count == 1: need_clean = False if need_clean: confirm = True if interactive: confirm = False while True: confirm = input( "Delete user group <{}>, create at {}? ([y]/n)".format( name, group.date_created) ) if confirm.lower() in ["y", ""]: confirm = True break elif confirm.lower() == "n": confirm = False break else: print("No valid input") continue if confirm: group.delete() print("Delete success: {}".format(name)) need_clean_count -= 1 else: continue if __name__ == '__main__': clean_group()