migration: Rename previously archived streams to their original names.

As several archived streams may have the same new name,
it is essential to verify whether any stream, regardless
of its current status (active or archived), already has that name
before executing any renaming operation.
This commit is contained in:
sanchi-t 2024-01-18 19:21:35 +05:30 committed by Tim Abbott
parent 40da0e44fb
commit e25bbe1005
1 changed files with 56 additions and 0 deletions

View File

@ -0,0 +1,56 @@
import hashlib
from django.db import migrations
from django.db.backends.base.schema import BaseDatabaseSchemaEditor
from django.db.migrations.state import StateApps
def remove_prefix_from_archived_streams(
apps: StateApps, schema_editor: BaseDatabaseSchemaEditor
) -> None:
Stream = apps.get_model("zerver", "Stream")
archived_streams = Stream.objects.filter(deactivated=True)
for archived_stream in archived_streams:
old_prefix = "!DEACTIVATED:"
streamID = str(archived_stream.id)
stream_id_hash_object = hashlib.sha512(streamID.encode())
hashed_stream_id = stream_id_hash_object.hexdigest()[0:7]
prefix = hashed_stream_id + old_prefix
prefix_length = len(prefix)
old_name = archived_stream.name
new_name = old_name
if old_name.startswith(prefix):
new_name = old_name[prefix_length:]
# Check for archived streams before commit 1b6f68b.
elif old_prefix in old_name:
prefix_end_index = old_name.find(old_prefix) + len(old_prefix)
new_name = old_name[prefix_end_index:]
else:
continue
# Check if there's an active stream or another archived stream with the new name
if not Stream.objects.filter(realm=archived_stream.realm, name=new_name).exists():
archived_stream.name = new_name
archived_stream.save(update_fields=["name"])
class Migration(migrations.Migration):
atomic = False
dependencies = [
(
"zerver",
"0616_userprofile_can_change_user_emails",
),
]
operations = [
migrations.RunPython(
remove_prefix_from_archived_streams,
reverse_code=migrations.RunPython.noop,
elidable=True,
),
]