Files
guilan-ace-backend/apps/users/management/commands/audit_legacy_email_identities.py
Amirhossein Khalili b7b21a6cc6
Some checks failed
Backend CI/CD / test (push) Has been cancelled
Backend CI/CD / deploy (push) Has been cancelled
feat(backend): migrate auth and notifications off email
2026-05-21 10:28:04 +03:30

43 lines
1.9 KiB
Python

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."))