43 lines
1.9 KiB
Python
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."))
|