from collections import defaultdict from django.core.management.base import BaseCommand from apps.users.email_identity import is_placeholder_email, normalize_email_identity from apps.users.models import User class Command(BaseCommand): help = "Audit legacy email identities for Google auto-link safety." def handle(self, *args, **options): duplicate_map: dict[str, list[User]] = defaultdict(list) placeholder_users: list[User] = [] email_only_users: list[User] = [] for user in User.all_objects.all().order_by("id"): normalized_email = normalize_email_identity(user.email) if normalized_email: duplicate_map[normalized_email].append(user) if is_placeholder_email(user.email): placeholder_users.append(user) if normalized_email and not user.mobile: email_only_users.append(user) duplicates = {email: users for email, users in duplicate_map.items() if len(users) > 1} self.stdout.write(self.style.WARNING(f"Case-insensitive duplicate emails: {len(duplicates)}")) for email, users in duplicates.items(): user_ids = ", ".join(str(user.id) for user in users) self.stdout.write(f" {email}: user_ids=[{user_ids}]") self.stdout.write(self.style.WARNING(f"Placeholder emails: {len(placeholder_users)}")) for user in placeholder_users[:50]: self.stdout.write(f" user_id={user.id} email={user.email}") self.stdout.write(self.style.WARNING(f"Email-only users needing mobile bind: {len(email_only_users)}")) for user in email_only_users[:100]: self.stdout.write(f" user_id={user.id} email={user.email}") if not duplicates and not placeholder_users: self.stdout.write(self.style.SUCCESS("No blocking legacy email issues were found."))