mirror of
https://github.com/zulip/zulip.git
synced 2025-11-01 12:33:40 +00:00
slack importer: Support custom emoji reactions.
This commit is contained in:
@@ -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')
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user