mirror of https://github.com/jumpserver/jumpserver
				
				
				
			
		
			
				
	
	
		
			76 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
| #!/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()
 |