# Generated by Django 5.2.8 on 2025-12-17 17:47 import django.db.models.deletion from django.conf import settings from django.db import migrations, models from django.db.backends.base.schema import BaseDatabaseSchemaEditor from django.db.migrations.state import StateApps from django.db.models import OuterRef, Subquery def set_emoji_author(apps: StateApps, schema_editor: BaseDatabaseSchemaEditor) -> None: """ This function establishes the invariant that all RealmEmoji objects have .author set and is a repeat of migration 0376. This time, in the same migration, we finally alter the column to make it non-nullable - as we no longer expect the existence of any valid sources that would produce emojis with author=None. """ RealmEmoji = apps.get_model("zerver", "RealmEmoji") UserProfile = apps.get_model("zerver", "UserProfile") ROLE_REALM_OWNER = 100 RealmEmoji.objects.filter(author=None).update( author=Subquery( UserProfile.objects.filter( realm=OuterRef("realm"), is_active=True, role=ROLE_REALM_OWNER ) .order_by("id")[:1] .values("pk") ) ) # If some edge-case realms exist out in the wild on self-hosted deployments, # which don't have any active organization owners, we just fall back to # choosing a deactivated owner. # It will be extremely rare to have a realm with no owners as it's not a valid state, # so we're okay with letting this migration crash in those cases when it attempts # to make the database field non-nullable. Such situations can be repaired manually. RealmEmoji.objects.filter(author=None).update( author=Subquery( UserProfile.objects.filter( realm=OuterRef("realm"), is_active=False, role=ROLE_REALM_OWNER ) .order_by("id")[:1] .values("pk") ) ) class Migration(migrations.Migration): atomic = False dependencies = [ ("zerver", "0770_recreate_missing_realmemoji"), ] operations = [ migrations.RunPython( set_emoji_author, reverse_code=migrations.RunPython.noop, elidable=True ), migrations.AlterField( model_name="realmemoji", name="author", field=models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL ), ), ]