Skip to content

Commit 7880d6e

Browse files
committed
Update migration
1 parent a5ce3de commit 7880d6e

File tree

1 file changed

+34
-20
lines changed

1 file changed

+34
-20
lines changed

cvat/apps/iam/migrations/0002_delete_dummy_email_addresses_and_fix_case_related_mismatches.py

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,52 @@
11
# Generated by Django 4.2.21 on 2025-07-10 17:28
22

3+
from django.conf import settings
34
from django.db import migrations
4-
from django.db.models import Count
5+
from django.db.models import Exists, F, OuterRef
56

67

78
def delete_email_addresses_for_dummy_users(apps, schema_editor):
89
EmailAddress = apps.get_model("account", "EmailAddress")
10+
SocialAccount = apps.get_model("socialaccount", "SocialAccount")
911

12+
social_accounts = SocialAccount.objects.filter(user=OuterRef("user"))
1013
# delete EmailAddress records for dummy users that were created by invitations
11-
EmailAddress.objects.filter(verified=False).annotate(
12-
social_accounts_count=Count("user__socialaccount")
13-
).filter(
14-
social_accounts_count=0, user__password__startswith="!" # nosec
14+
EmailAddress.objects.filter(
15+
~Exists(social_accounts), verified=False, user__password__startswith="!" # nosec
1516
).delete()
1617

1718

18-
def normalize_email_case_mismatches(apps, schema_editor):
19+
def restore_email_addresses_for_dummy_users(apps, schema_editor):
20+
User = apps.get_model(settings.AUTH_USER_MODEL)
1921
EmailAddress = apps.get_model("account", "EmailAddress")
22+
SocialAccount = apps.get_model("socialaccount", "SocialAccount")
2023

21-
# fix case-related mismatches between User.email and EmailAddress.email
22-
email_addresses = (
23-
EmailAddress.objects.filter(verified=True)
24-
.annotate(social_accounts_count=Count("user__socialaccount"))
25-
.filter(social_accounts_count=0)
26-
.select_related("user")
24+
social_accounts = SocialAccount.objects.filter(user=OuterRef("user"))
25+
email_addresses = EmailAddress.objects.filter(user=OuterRef("user"))
26+
dummy_users = (
27+
User.objects.filter(password__startswith="!")
28+
.annotate(
29+
has_social_account=Exists(social_accounts), has_email_address=Exists(email_addresses)
30+
)
31+
.filter(has_social_account=False, has_email_address=False)
2732
)
28-
email_addresses_to_update = []
2933

30-
for email_address in email_addresses:
31-
user_email = email_address.user.email
32-
if email_address.email.lower() == user_email.lower() and email_address.email != user_email:
33-
email_address.email = user_email
34-
email_addresses_to_update.append(email_address)
35-
EmailAddress.objects.bulk_update(email_addresses_to_update, ["email"])
34+
email_addresses_to_create = [
35+
EmailAddress(email=user.email, user=user, primary=True, verified=False)
36+
for user in dummy_users
37+
]
38+
EmailAddress.objects.bulk_create(email_addresses_to_create)
39+
40+
41+
def normalize_email_case_mismatches(apps, schema_editor):
42+
EmailAddress = apps.get_model("account", "EmailAddress")
43+
SocialAccount = apps.get_model("socialaccount", "SocialAccount")
44+
45+
social_accounts = SocialAccount.objects.filter(user=OuterRef("user"))
46+
# fix case-related mismatches between User.email and EmailAddress.email
47+
EmailAddress.objects.filter(
48+
~Exists(social_accounts), verified=True, email__iexact=F("user__email")
49+
).exclude(email=F("user__email")).update(email=F("user__email"))
3650

3751

3852
class Migration(migrations.Migration):
@@ -44,7 +58,7 @@ class Migration(migrations.Migration):
4458
operations = [
4559
migrations.RunPython(
4660
delete_email_addresses_for_dummy_users,
47-
reverse_code=migrations.RunPython.noop,
61+
reverse_code=restore_email_addresses_for_dummy_users,
4862
),
4963
migrations.RunPython(
5064
normalize_email_case_mismatches,

0 commit comments

Comments
 (0)