Files
zulip/zerver/migrations/0145_reactions_realm_emoji_name_to_id.py
Aman Agrawal 47bf111de8 migrations: Mark RunPython statements elidable.
This will make django automatically remove them when we run
squashmigrations. There are still some RunSQL statements which
we will have to take care of manually.
2020-04-29 10:41:20 -07:00

51 lines
2.1 KiB
Python

from collections import defaultdict
from typing import Any, Dict
from django.db import migrations
from django.db.backends.postgresql.schema import DatabaseSchemaEditor
from django.db.migrations.state import StateApps
def realm_emoji_name_to_id(apps: StateApps, schema_editor: DatabaseSchemaEditor) -> None:
Reaction = apps.get_model('zerver', 'Reaction')
RealmEmoji = apps.get_model('zerver', 'RealmEmoji')
realm_emoji_by_realm_id: Dict[int, Dict[str, Any]] = defaultdict(dict)
for realm_emoji in RealmEmoji.objects.all():
realm_emoji_by_realm_id[realm_emoji.realm_id][realm_emoji.name] = {
'id': str(realm_emoji.id),
'name': realm_emoji.name,
'deactivated': realm_emoji.deactivated,
}
for reaction in Reaction.objects.filter(reaction_type='realm_emoji'):
realm_id = reaction.user_profile.realm_id
emoji_name = reaction.emoji_name
realm_emoji = realm_emoji_by_realm_id.get(realm_id, {}).get(emoji_name)
if realm_emoji is None:
# Realm emoji used in this reaction has been deleted so this
# reaction should also be deleted. We don't need to reverse
# this step in migration reversal code.
print("Reaction for (%s, %s) refers to deleted custom emoji %s; deleting" %
(emoji_name, reaction.message_id, reaction.user_profile_id))
reaction.delete()
else:
reaction.emoji_code = realm_emoji["id"]
reaction.save()
def reversal(apps: StateApps, schema_editor: DatabaseSchemaEditor) -> None:
Reaction = apps.get_model('zerver', 'Reaction')
for reaction in Reaction.objects.filter(reaction_type='realm_emoji'):
reaction.emoji_code = reaction.emoji_name
reaction.save()
class Migration(migrations.Migration):
dependencies = [
('zerver', '0144_remove_realm_create_generic_bot_by_admins_only'),
]
operations = [
migrations.RunPython(realm_emoji_name_to_id,
reverse_code=reversal,
elidable=True),
]