migrations: Fix 0301 to replace a Python loop with SQL.

The previous code is correctly flagged by semgrep 0.23 as a violation
of our sql-format rule.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
This commit is contained in:
Anders Kaseorg 2020-09-12 20:08:25 -07:00 committed by Tim Abbott
parent f57196b1d0
commit 42d038f09b
1 changed files with 11 additions and 19 deletions

View File

@ -1,21 +1,6 @@
from django.db import connection, migrations from django.db import migrations
from django.db.backends.postgresql.schema import DatabaseSchemaEditor
from django.db.migrations.state import StateApps
def mark_messages_read(apps: StateApps, schema_editor: DatabaseSchemaEditor) -> None:
Stream = apps.get_model("zerver", "Stream")
deactivated_stream_ids = list(Stream.objects.filter(deactivated=True).values_list('id', flat=True))
with connection.cursor() as cursor:
for i in deactivated_stream_ids:
cursor.execute(f"""
UPDATE zerver_usermessage SET flags = flags | 1
FROM zerver_message
INNER JOIN zerver_stream ON zerver_stream.recipient_id = zerver_message.recipient_id
WHERE zerver_message.id = zerver_usermessage.message_id
AND zerver_stream.id = {i};
""")
class Migration(migrations.Migration): class Migration(migrations.Migration):
""" """
We're changing the stream deactivation process to make it mark all messages We're changing the stream deactivation process to make it mark all messages
@ -23,12 +8,19 @@ class Migration(migrations.Migration):
deactivated before this change, we need a migration to fix those old streams, deactivated before this change, we need a migration to fix those old streams,
to have all messages marked as read. to have all messages marked as read.
""" """
atomic = False
dependencies = [ dependencies = [
('zerver', '0300_add_attachment_is_web_public'), ('zerver', '0300_add_attachment_is_web_public'),
] ]
operations = [ operations = [
migrations.RunPython(mark_messages_read, reverse_code=migrations.RunPython.noop), migrations.RunSQL(
sql="""
UPDATE zerver_usermessage SET flags = flags | 1
FROM zerver_message
INNER JOIN zerver_stream ON zerver_stream.recipient_id = zerver_message.recipient_id
WHERE zerver_message.id = zerver_usermessage.message_id
AND zerver_stream.deactivated;
""",
reverse_sql="",
),
] ]