diff --git a/tools/semgrep-py.yml b/tools/semgrep-py.yml index a3a9e985b9..d0ebd640ba 100644 --- a/tools/semgrep-py.yml +++ b/tools/semgrep-py.yml @@ -54,6 +54,7 @@ rules: - id: dont-import-models-in-migrations patterns: + - pattern-not: from zerver.lib.migrate import $X - pattern-not: from zerver.lib.partial import partial - pattern-not: from zerver.lib.mime_types import $X - pattern-not: from zerver.lib.redis_utils import get_redis_client diff --git a/zerver/migrations/0691_backfill_message_is_channel_message.py b/zerver/migrations/0691_backfill_message_is_channel_message.py new file mode 100644 index 0000000000..3127257009 --- /dev/null +++ b/zerver/migrations/0691_backfill_message_is_channel_message.py @@ -0,0 +1,37 @@ +from django.db import connection, migrations +from django.db.backends.base.schema import BaseDatabaseSchemaEditor +from django.db.migrations.state import StateApps +from psycopg2.sql import SQL + +from zerver.lib.migrate import do_batch_update + + +def update_is_channel_message(apps: StateApps, schema_editor: BaseDatabaseSchemaEditor) -> None: + Message = apps.get_model("zerver", "Message") + ArchivedMessage = apps.get_model("zerver", "ArchivedMessage") + + with connection.cursor() as cursor: + for message_model in [Message, ArchivedMessage]: + do_batch_update( + cursor, + message_model._meta.db_table, + [ + SQL( + "is_channel_message = (SELECT type = 2 FROM zerver_recipient WHERE zerver_recipient.id = recipient_id)" + ) + ], + ) + + +class Migration(migrations.Migration): + atomic = False + + dependencies = [ + ("zerver", "0690_message_is_channel_message"), + ] + + operations = [ + migrations.RunPython( + update_is_channel_message, reverse_code=migrations.RunPython.noop, elidable=True + ) + ]