slack importer: Support custom emoji reactions.

This commit is contained in:
Rhea Parekh
2018-03-30 16:08:03 +05:30
committed by Tim Abbott
parent 2c116e46ce
commit 1bba6cc4ce
3 changed files with 36 additions and 15 deletions

View File

@@ -1716,6 +1716,10 @@ def import_message_data(import_dir: Path) -> None:
if 'zerver_reaction' in data:
re_map_foreign_keys(data['zerver_reaction'], 'message', related_table="message")
re_map_foreign_keys(data['zerver_reaction'], 'user_profile', related_table="user_profile")
for reaction in data['zerver_reaction']:
if reaction['reaction_type'] == Reaction.REALM_EMOJI:
re_map_foreign_keys(data['zerver_reaction'], 'emoji_code',
related_table="realmemoji", id_field=True)
update_model_ids(Reaction, data, 'zerver_reaction', 'reaction')
bulk_import_model(data, Reaction, 'zerver_reaction')

View File

@@ -465,6 +465,7 @@ def build_subscription(channel_members: List[str], zerver_subscription: List[Zer
def convert_slack_workspace_messages(slack_data_dir: str, users: List[ZerverFieldsT], realm_id: int,
added_users: AddedUsersT, added_recipient: AddedRecipientsT,
added_channels: AddedChannelsT, realm: ZerverFieldsT,
zerver_realmemoji: List[ZerverFieldsT],
domain_name: str) -> Tuple[ZerverFieldsT,
List[ZerverFieldsT],
List[ZerverFieldsT]]:
@@ -489,6 +490,7 @@ def convert_slack_workspace_messages(slack_data_dir: str, users: List[ZerverFiel
zerver_message, zerver_usermessage, attachment, uploads, \
reactions = channel_message_to_zerver_message(realm_id, users, added_users,
added_recipient, all_messages,
zerver_realmemoji,
realm['zerver_subscription'], domain_name)
logging.info('######### IMPORTING MESSAGES FINISHED #########\n')
@@ -517,6 +519,7 @@ def channel_message_to_zerver_message(realm_id: int, users: List[ZerverFieldsT],
added_users: AddedUsersT,
added_recipient: AddedRecipientsT,
all_messages: List[ZerverFieldsT],
zerver_realmemoji: List[ZerverFieldsT],
zerver_subscription: List[ZerverFieldsT],
domain_name: str) -> Tuple[List[ZerverFieldsT],
List[ZerverFieldsT],
@@ -561,7 +564,8 @@ def channel_message_to_zerver_message(realm_id: int, users: List[ZerverFieldsT],
# Process message reactions
if 'reactions' in message.keys():
reaction_id_count = build_reactions(reaction_list, message['reactions'], added_users,
message_id, reaction_id_count, name_to_codepoint)
message_id, reaction_id_count, name_to_codepoint,
zerver_realmemoji)
# Process different subtypes of slack messages
if 'subtype' in message.keys():
@@ -652,24 +656,37 @@ def get_attachment_path_and_content(fileinfo: ZerverFieldsT, realm_id: int) -> T
def build_reactions(reaction_list: List[ZerverFieldsT], reactions: List[ZerverFieldsT],
added_users: AddedUsersT, message_id: int, reaction_id: int,
name_to_codepoint: ZerverFieldsT) -> int:
name_to_codepoint: ZerverFieldsT,
zerver_realmemoji: List[ZerverFieldsT]) -> int:
realmemoji = {}
for realm_emoji in zerver_realmemoji:
realmemoji[realm_emoji['name']] = realm_emoji['id']
# For the unicode emoji codes, we use equivalent of
# function 'emoji_name_to_emoji_code' in 'zerver/lib/emoji' here
for slack_reaction in reactions:
emoji_name = slack_reaction['name']
# Check in unicode emoji
if emoji_name in name_to_codepoint:
emoji_code = name_to_codepoint[emoji_name]
reaction_type = Reaction.UNICODE_EMOJI
# Check in realm emoji
elif emoji_name in realmemoji:
emoji_code = realmemoji[emoji_name]
reaction_type = Reaction.REALM_EMOJI
else:
continue
for user in slack_reaction['users']:
reaction = dict(
id=reaction_id,
emoji_code=name_to_codepoint[emoji_name],
emoji_code=emoji_code,
emoji_name=emoji_name,
message=message_id,
reaction_type=Reaction.UNICODE_EMOJI,
reaction_type=reaction_type,
user_profile=added_users[user])
reaction_id += 1
reaction_list.append(reaction)
else:
continue
return reaction_id
def build_uploads(user_id: int, realm_id: int, email: str, fileinfo: ZerverFieldsT, s3_path: str,
@@ -761,7 +778,7 @@ def do_convert_data(slack_zip_file: str, realm_subdomain: str, output_dir: str,
message_json, uploads_list, zerver_attachment = convert_slack_workspace_messages(
slack_data_dir, user_list, realm_id, added_users, added_recipient, added_channels,
realm, domain_name)
realm, realm['zerver_realmemoji'], domain_name)
emoji_folder = os.path.join(output_dir, 'emoji')
os.makedirs(emoji_folder, exist_ok=True)

View File

@@ -409,7 +409,7 @@ class SlackImporter(ZulipTestCase):
zerver_subscription = [] # type: List[Dict[str, Any]]
zerver_message, zerver_usermessage, attachment, uploads, \
reaction = channel_message_to_zerver_message(1, user_data, added_users, added_recipient,
all_messages, zerver_subscription, 'domain')
all_messages, zerver_subscription, [], 'domain')
# functioning already tested in helper function
self.assertEqual(zerver_usermessage, [])
# subtype: channel_join is filtered
@@ -459,7 +459,7 @@ class SlackImporter(ZulipTestCase):
mock_message.side_effect = [[zerver_message, zerver_usermessage, [], [], []]]
message_json, uploads, zerver_attachment = convert_slack_workspace_messages(
'./random_path', user_list, 2, {}, {}, added_channels, realm, 'domain')
'./random_path', user_list, 2, {}, {}, added_channels, realm, [], 'domain')
self.assertEqual(message_json['zerver_message'], zerver_message)
self.assertEqual(message_json['zerver_usermessage'], zerver_usermessage)