migrations: Update active status of Channels based on recent activity.

This commit adds a database migration to set is_recently_active=False
for channels based on the last time a message was sent.

The migration follows the same logic used in the
`update_channel_recently_active_status` management command.

This change is particularly useful for self-hosted servers, as it
avoids the need to wait a week for the
`update_channel_recently_active_status` management command to run
via cron.
This commit is contained in:
Prakhar Pratyush
2024-12-23 11:44:39 +05:30
committed by Tim Abbott
parent 86cd8349f7
commit 891a35570b

View File

@@ -0,0 +1,55 @@
# Generated by Django 5.0.9 on 2024-12-23 10:03
from datetime import timedelta
from django.db import migrations, transaction
from django.db.backends.base.schema import BaseDatabaseSchemaEditor
from django.db.migrations.state import StateApps
from django.utils.timezone import now as timezone_now
def check_update_all_channels_active_status(
apps: StateApps, schema_editor: BaseDatabaseSchemaEditor
) -> None:
Channel = apps.get_model("zerver", "Stream")
Message = apps.get_model("zerver", "Message")
Realm = apps.get_model("zerver", "Realm")
Recipient = apps.get_model("zerver", "Recipient")
Recipient.STREAM = 2
Channel.LAST_ACTIVITY_DAYS_BEFORE_FOR_ACTIVE = 180
date_days_ago = timezone_now() - timedelta(days=Channel.LAST_ACTIVITY_DAYS_BEFORE_FOR_ACTIVE)
for realm in Realm.objects.filter(deactivated=False):
with transaction.atomic(durable=True):
active_channel_ids = (
Message.objects.filter(
date_sent__gte=date_days_ago,
recipient__type=Recipient.STREAM,
realm=realm,
)
.values_list("recipient__type_id", flat=True)
.distinct()
)
channels_to_mark_inactive_queryset = Channel.objects.filter(
is_recently_active=True, realm=realm
).exclude(id__in=active_channel_ids)
channels_to_mark_inactive_queryset.update(is_recently_active=False)
class Migration(migrations.Migration):
atomic = False
dependencies = [
("zerver", "0643_realm_scheduled_deletion_date"),
]
operations = [
migrations.RunPython(
check_update_all_channels_active_status,
elidable=True,
reverse_code=migrations.RunPython.noop,
)
]