# Generated by Django 5.1.8 on 2025-05-23 09:25 from django.db import migrations from django.db.backends.base.schema import BaseDatabaseSchemaEditor from django.db.migrations.state import StateApps from django.db.models import Max def fix_topic_for_direct_messages(apps: StateApps, schema_editor: BaseDatabaseSchemaEditor) -> None: Message = apps.get_model("zerver", "Message") ArchivedMessage = apps.get_model("zerver", "ArchivedMessage") ScheduledMessage = apps.get_model("zerver", "ScheduledMessage") RECIPIENT_STREAM = 2 DM_TOPIC = "\x07" BATCH_SIZE = 10000 for message_model in [Message, ArchivedMessage, ScheduledMessage]: lower_bound = 1 max_id = message_model.objects.aggregate(Max("id"))["id__max"] if max_id is None: continue while lower_bound <= max_id: upper_bound = lower_bound + BATCH_SIZE - 1 print(f"Processing batch {lower_bound} to {upper_bound} for {message_model.__name__}") message_model.objects.filter( id__range=(lower_bound, upper_bound), ).exclude(recipient__type=RECIPIENT_STREAM).update(subject=DM_TOPIC) lower_bound += BATCH_SIZE class Migration(migrations.Migration): atomic = False dependencies = [ ("zerver", "0717_stream_topics_policy"), ] operations = [ migrations.RunPython( fix_topic_for_direct_messages, reverse_code=migrations.RunPython.noop, elidable=True, ), # We need to run an ANALYZE for the query planner statistics # to no longer think most messages have "" as the topic. migrations.RunSQL("ANALYZE zerver_message"), ]