You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

103 lines
3.9 KiB

"""
Management command برای migration داده‌های موجود به سیستم نقش‌های چندگانه
"""
from django.core.management.base import BaseCommand
from django.contrib.auth.models import Group
from apps.account.models import User
class Command(BaseCommand):
help = 'Migrate existing user data to multiple roles system'
def add_arguments(self, parser):
parser.add_argument(
'--dry-run',
action='store_true',
help='Show what would be done without making changes',
)
def handle(self, *args, **options):
dry_run = options['dry_run']
if dry_run:
self.stdout.write(
self.style.WARNING('DRY RUN MODE - No changes will be made')
)
# اطمینان از وجود گروه‌ها
self.ensure_groups_exist(dry_run)
# Migration کاربران بر اساس user_type فعلی
self.migrate_user_types(dry_run)
self.stdout.write(
self.style.SUCCESS('Migration completed successfully!')
)
def ensure_groups_exist(self, dry_run):
"""اطمینان از وجود گروه‌های مورد نیاز"""
groups = [
"Professor Group",
"Student Group",
"Client Group",
"Admin Group",
"Super Admin Group"
]
for group_name in groups:
if dry_run:
exists = Group.objects.filter(name=group_name).exists()
if not exists:
self.stdout.write(f'Would create group: {group_name}')
else:
group, created = Group.objects.get_or_create(name=group_name)
if created:
self.stdout.write(f'Created group: {group_name}')
def migrate_user_types(self, dry_run):
"""Migration کاربران بر اساس user_type فعلی"""
users = User.objects.all()
for user in users:
# چک کنیم که آیا کاربر قبلاً در گروه مناسب است یا خیر
expected_group_name = f"{user.user_type.capitalize()} Group"
if not user.groups.filter(name=expected_group_name).exists():
if dry_run:
self.stdout.write(
f'Would add user {user.email} to group {expected_group_name}'
)
else:
try:
group = Group.objects.get(name=expected_group_name)
user.groups.add(group)
self.stdout.write(
f'Added user {user.email} to group {expected_group_name}'
)
except Group.DoesNotExist:
self.stdout.write(
self.style.ERROR(f'Group {expected_group_name} does not exist')
)
def get_user_statistics(self):
"""نمایش آمار کاربران"""
total_users = User.objects.count()
professors = User.objects.filter(groups__name="Professor Group").count()
students = User.objects.filter(groups__name="Student Group").count()
clients = User.objects.filter(groups__name="Client Group").count()
# کاربرانی که چندین نقش دارند
multi_role_users = User.objects.filter(
groups__name__in=["Professor Group", "Student Group"]
).annotate(
role_count=models.Count('groups')
).filter(role_count__gt=1).count()
self.stdout.write('\n--- User Statistics ---')
self.stdout.write(f'Total users: {total_users}')
self.stdout.write(f'Professors: {professors}')
self.stdout.write(f'Students: {students}')
self.stdout.write(f'Clients: {clients}')
self.stdout.write(f'Multi-role users: {multi_role_users}')