diff --git a/zerver/migrations/0617_remove_prefix_from_archived_streams.py b/zerver/migrations/0617_remove_prefix_from_archived_streams.py new file mode 100644 index 0000000000..9b2aeee0d6 --- /dev/null +++ b/zerver/migrations/0617_remove_prefix_from_archived_streams.py @@ -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, + ), + ]