mirror of https://github.com/zulip/zulip.git
migrations: Add migration to fix Attachment cache.
This migration needs to be run after the previous commit is deployed to a given Zulip installation, to fix any stale values of is_realm_public and is_web_public.
This commit is contained in:
parent
d149af936d
commit
abea1f4598
|
@ -0,0 +1,64 @@
|
|||
# Generated by Django 3.2.12 on 2022-03-23 04:32
|
||||
|
||||
from django.db import migrations, models
|
||||
from django.db.backends.postgresql.schema import DatabaseSchemaEditor
|
||||
from django.db.migrations.state import StateApps
|
||||
from django.db.models import Exists, Model, OuterRef
|
||||
|
||||
|
||||
def fix_attachment_caches(apps: StateApps, schema_editor: DatabaseSchemaEditor) -> None:
|
||||
Attachment = apps.get_model("zerver", "Attachment")
|
||||
ArchivedAttachment = apps.get_model("zerver", "ArchivedAttachment")
|
||||
Message = apps.get_model("zerver", "Message")
|
||||
ArchivedMessage = apps.get_model("zerver", "ArchivedMessage")
|
||||
|
||||
BATCH_SIZE = 10000
|
||||
|
||||
def update_batch(attachment_model: Model, message_model: Model, lower_bound: int) -> None:
|
||||
attachment_model.objects.filter(
|
||||
id__gt=lower_bound, id__lte=lower_bound + BATCH_SIZE
|
||||
).update(
|
||||
is_web_public=Exists(
|
||||
message_model.objects.filter(
|
||||
attachment=OuterRef("id"),
|
||||
recipient__stream__invite_only=False,
|
||||
recipient__stream__is_web_public=True,
|
||||
),
|
||||
),
|
||||
is_realm_public=Exists(
|
||||
message_model.objects.filter(
|
||||
attachment=OuterRef("id"),
|
||||
recipient__stream__invite_only=False,
|
||||
)
|
||||
),
|
||||
)
|
||||
|
||||
max_id = Attachment.objects.aggregate(models.Max("id"))["id__max"]
|
||||
if max_id is not None:
|
||||
lower_bound = 0
|
||||
|
||||
while lower_bound < max_id:
|
||||
print(f"Processed {lower_bound}/{max_id} attachments.")
|
||||
update_batch(Attachment, Message, lower_bound)
|
||||
lower_bound += BATCH_SIZE
|
||||
|
||||
max_id = ArchivedAttachment.objects.aggregate(models.Max("id"))["id__max"]
|
||||
if max_id is not None:
|
||||
lower_bound = 0
|
||||
|
||||
while lower_bound < max_id:
|
||||
print(f"Processed {lower_bound}/{max_id} archived attachments.")
|
||||
update_batch(ArchivedAttachment, ArchivedMessage, lower_bound)
|
||||
lower_bound += BATCH_SIZE
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
atomic = False
|
||||
|
||||
dependencies = [
|
||||
("zerver", "0385_attachment_flags_cache"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RunPython(fix_attachment_caches, reverse_code=migrations.RunPython.noop),
|
||||
]
|
Loading…
Reference in New Issue