mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-03 21:43:21 +00:00 
			
		
		
		
	slack: Rename added_users to slack_user_id_to_zulip_user_id.
This commit is contained in:
		@@ -28,7 +28,7 @@ from zerver.lib.emoji import NAME_TO_CODEPOINT_PATH
 | 
			
		||||
from urllib.parse import urlencode
 | 
			
		||||
 | 
			
		||||
# stubs
 | 
			
		||||
AddedUsersT = Dict[str, int]
 | 
			
		||||
SlackToZulipUserIDT = Dict[str, int]
 | 
			
		||||
AddedChannelsT = Dict[str, Tuple[str, int]]
 | 
			
		||||
AddedMPIMsT = Dict[str, Tuple[str, int]]
 | 
			
		||||
DMMembersT = Dict[str, Tuple[str, str]]
 | 
			
		||||
@@ -40,7 +40,8 @@ def rm_tree(path: str) -> None:
 | 
			
		||||
 | 
			
		||||
def slack_workspace_to_realm(domain_name: str, realm_id: int, user_list: List[ZerverFieldsT],
 | 
			
		||||
                             realm_subdomain: str, slack_data_dir: str,
 | 
			
		||||
                             custom_emoji_list: ZerverFieldsT) -> Tuple[ZerverFieldsT, AddedUsersT,
 | 
			
		||||
                             custom_emoji_list: ZerverFieldsT) -> Tuple[ZerverFieldsT,
 | 
			
		||||
                                                                        SlackToZulipUserIDT,
 | 
			
		||||
                                                                        AddedRecipientsT,
 | 
			
		||||
                                                                        AddedChannelsT,
 | 
			
		||||
                                                                        AddedMPIMsT,
 | 
			
		||||
@@ -50,7 +51,7 @@ def slack_workspace_to_realm(domain_name: str, realm_id: int, user_list: List[Ze
 | 
			
		||||
    """
 | 
			
		||||
    Returns:
 | 
			
		||||
    1. realm, Converted Realm data
 | 
			
		||||
    2. added_users, which is a dictionary to map from slack user id to zulip user id
 | 
			
		||||
    2. slack_user_id_to_zulip_user_id, which is a dictionary to map from slack user id to zulip user id
 | 
			
		||||
    3. added_recipient, which is a dictionary to map from channel name to zulip recipient_id
 | 
			
		||||
    4. added_channels, which is a dictionary to map from channel name to channel id, zulip stream_id
 | 
			
		||||
    5. added_mpims, which is a dictionary to map from MPIM name to MPIM id, zulip huddle_id
 | 
			
		||||
@@ -63,12 +64,12 @@ def slack_workspace_to_realm(domain_name: str, realm_id: int, user_list: List[Ze
 | 
			
		||||
    zerver_realm = build_zerver_realm(realm_id, realm_subdomain, NOW, 'Slack')  # type: List[ZerverFieldsT]
 | 
			
		||||
    realm = build_realm(zerver_realm, realm_id, domain_name)
 | 
			
		||||
 | 
			
		||||
    zerver_userprofile, avatars, added_users, zerver_customprofilefield, \
 | 
			
		||||
    zerver_userprofile, avatars, slack_user_id_to_zulip_user_id, zerver_customprofilefield, \
 | 
			
		||||
        zerver_customprofilefield_value = users_to_zerver_userprofile(slack_data_dir, user_list,
 | 
			
		||||
                                                                      realm_id, int(NOW), domain_name)
 | 
			
		||||
    realm, added_channels, added_mpims, dm_members, \
 | 
			
		||||
        added_recipient = channels_to_zerver_stream(slack_data_dir, realm_id, realm,
 | 
			
		||||
                                                    added_users, zerver_userprofile)
 | 
			
		||||
                                                    slack_user_id_to_zulip_user_id, zerver_userprofile)
 | 
			
		||||
 | 
			
		||||
    zerver_realmemoji, emoji_url_map = build_realmemoji(custom_emoji_list, realm_id)
 | 
			
		||||
    realm['zerver_realmemoji'] = zerver_realmemoji
 | 
			
		||||
@@ -81,7 +82,7 @@ def slack_workspace_to_realm(domain_name: str, realm_id: int, user_list: List[Ze
 | 
			
		||||
    realm['zerver_customprofilefield'] = zerver_customprofilefield
 | 
			
		||||
    realm['zerver_customprofilefieldvalue'] = zerver_customprofilefield_value
 | 
			
		||||
 | 
			
		||||
    return realm, added_users, added_recipient, added_channels, added_mpims, \
 | 
			
		||||
    return realm, slack_user_id_to_zulip_user_id, added_recipient, added_channels, added_mpims, \
 | 
			
		||||
        dm_members, avatars, emoji_url_map
 | 
			
		||||
 | 
			
		||||
def build_realmemoji(custom_emoji_list: ZerverFieldsT,
 | 
			
		||||
@@ -112,14 +113,14 @@ def build_realmemoji(custom_emoji_list: ZerverFieldsT,
 | 
			
		||||
def users_to_zerver_userprofile(slack_data_dir: str, users: List[ZerverFieldsT], realm_id: int,
 | 
			
		||||
                                timestamp: Any, domain_name: str) -> Tuple[List[ZerverFieldsT],
 | 
			
		||||
                                                                           List[ZerverFieldsT],
 | 
			
		||||
                                                                           AddedUsersT,
 | 
			
		||||
                                                                           SlackToZulipUserIDT,
 | 
			
		||||
                                                                           List[ZerverFieldsT],
 | 
			
		||||
                                                                           List[ZerverFieldsT]]:
 | 
			
		||||
    """
 | 
			
		||||
    Returns:
 | 
			
		||||
    1. zerver_userprofile, which is a list of user profile
 | 
			
		||||
    2. avatar_list, which is list to map avatars to zulip avatard records.json
 | 
			
		||||
    3. added_users, which is a dictionary to map from slack user id to zulip
 | 
			
		||||
    3. slack_user_id_to_zulip_user_id, which is a dictionary to map from slack user id to zulip
 | 
			
		||||
       user id
 | 
			
		||||
    4. zerver_customprofilefield, which is a list of all custom profile fields
 | 
			
		||||
    5. zerver_customprofilefield_values, which is a list of user profile fields
 | 
			
		||||
@@ -129,7 +130,7 @@ def users_to_zerver_userprofile(slack_data_dir: str, users: List[ZerverFieldsT],
 | 
			
		||||
    zerver_customprofilefield = []  # type: List[ZerverFieldsT]
 | 
			
		||||
    zerver_customprofilefield_values = []  # type: List[ZerverFieldsT]
 | 
			
		||||
    avatar_list = []  # type: List[ZerverFieldsT]
 | 
			
		||||
    added_users = {}
 | 
			
		||||
    slack_user_id_to_zulip_user_id = {}
 | 
			
		||||
 | 
			
		||||
    # The user data we get from the slack api does not contain custom profile data
 | 
			
		||||
    # Hence we get it from the slack zip file
 | 
			
		||||
@@ -205,7 +206,7 @@ def users_to_zerver_userprofile(slack_data_dir: str, users: List[ZerverFieldsT],
 | 
			
		||||
        userprofile_dict['realm'] = realm_id
 | 
			
		||||
 | 
			
		||||
        zerver_userprofile.append(userprofile_dict)
 | 
			
		||||
        added_users[slack_user_id] = user_id
 | 
			
		||||
        slack_user_id_to_zulip_user_id[slack_user_id] = user_id
 | 
			
		||||
        if not user.get('is_primary_owner', False):
 | 
			
		||||
            user_id_count += 1
 | 
			
		||||
 | 
			
		||||
@@ -213,7 +214,7 @@ def users_to_zerver_userprofile(slack_data_dir: str, users: List[ZerverFieldsT],
 | 
			
		||||
 | 
			
		||||
    process_customprofilefields(zerver_customprofilefield, zerver_customprofilefield_values)
 | 
			
		||||
    logging.info('######### IMPORTING USERS FINISHED #########\n')
 | 
			
		||||
    return zerver_userprofile, avatar_list, added_users, zerver_customprofilefield, \
 | 
			
		||||
    return zerver_userprofile, avatar_list, slack_user_id_to_zulip_user_id, zerver_customprofilefield, \
 | 
			
		||||
        zerver_customprofilefield_values
 | 
			
		||||
 | 
			
		||||
def build_customprofile_field(customprofile_field: List[ZerverFieldsT], fields: ZerverFieldsT,
 | 
			
		||||
@@ -324,7 +325,8 @@ def get_user_timezone(user: ZerverFieldsT) -> str:
 | 
			
		||||
    return timezone
 | 
			
		||||
 | 
			
		||||
def channels_to_zerver_stream(slack_data_dir: str, realm_id: int,
 | 
			
		||||
                              realm: Dict[str, Any], added_users: AddedUsersT,
 | 
			
		||||
                              realm: Dict[str, Any],
 | 
			
		||||
                              slack_user_id_to_zulip_user_id: SlackToZulipUserIDT,
 | 
			
		||||
                              zerver_userprofile: List[ZerverFieldsT]) \
 | 
			
		||||
        -> Tuple[Dict[str, List[ZerverFieldsT]], AddedChannelsT, AddedMPIMsT, DMMembersT, AddedRecipientsT]:
 | 
			
		||||
    """
 | 
			
		||||
@@ -392,12 +394,13 @@ def channels_to_zerver_stream(slack_data_dir: str, realm_id: int,
 | 
			
		||||
 | 
			
		||||
            # construct the subscription object and append it to realm["zerver_subscription"]
 | 
			
		||||
            subscription_id_count = get_subscription(channel['members'], realm["zerver_subscription"],
 | 
			
		||||
                                                     recipient_id, added_users,
 | 
			
		||||
                                                     recipient_id, slack_user_id_to_zulip_user_id,
 | 
			
		||||
                                                     subscription_id_count)
 | 
			
		||||
            # TODO add realm["zerver_subscription"] which correspond to
 | 
			
		||||
            # huddles type recipient
 | 
			
		||||
            # For huddles:
 | 
			
		||||
            # sub['recipient']=recipient['id'] where recipient['type_id']=added_users[member]
 | 
			
		||||
            # sub['recipient']=recipient['id'] where
 | 
			
		||||
            # recipient['type_id']=slack_user_id_to_zulip_user_id[member]
 | 
			
		||||
 | 
			
		||||
            stream_id_count += 1
 | 
			
		||||
            recipient_id_count += 1
 | 
			
		||||
@@ -442,7 +445,7 @@ def channels_to_zerver_stream(slack_data_dir: str, realm_id: int,
 | 
			
		||||
            added_recipient[mpim['name']] = recipient_id_count
 | 
			
		||||
 | 
			
		||||
            subscription_id_count = get_subscription(mpim['members'], realm["zerver_subscription"],
 | 
			
		||||
                                                     recipient_id_count, added_users,
 | 
			
		||||
                                                     recipient_id_count, slack_user_id_to_zulip_user_id,
 | 
			
		||||
                                                     subscription_id_count)
 | 
			
		||||
 | 
			
		||||
            huddle_id_count += 1
 | 
			
		||||
@@ -455,7 +458,7 @@ def channels_to_zerver_stream(slack_data_dir: str, realm_id: int,
 | 
			
		||||
        mpims = []
 | 
			
		||||
    process_mpims(mpims)
 | 
			
		||||
 | 
			
		||||
    for slack_user_id, zulip_user_id in added_users.items():
 | 
			
		||||
    for slack_user_id, zulip_user_id in slack_user_id_to_zulip_user_id.items():
 | 
			
		||||
        recipient = build_recipient(zulip_user_id, recipient_id_count, Recipient.PERSONAL)
 | 
			
		||||
        added_recipient[slack_user_id] = recipient_id_count
 | 
			
		||||
        sub = build_subscription(recipient_id_count, zulip_user_id, subscription_id_count)
 | 
			
		||||
@@ -480,17 +483,19 @@ def channels_to_zerver_stream(slack_data_dir: str, realm_id: int,
 | 
			
		||||
    return realm, added_channels, added_mpims, dm_members, added_recipient
 | 
			
		||||
 | 
			
		||||
def get_subscription(channel_members: List[str], zerver_subscription: List[ZerverFieldsT],
 | 
			
		||||
                     recipient_id: int, added_users: AddedUsersT,
 | 
			
		||||
                     recipient_id: int, slack_user_id_to_zulip_user_id: SlackToZulipUserIDT,
 | 
			
		||||
                     subscription_id: int) -> int:
 | 
			
		||||
    for member in channel_members:
 | 
			
		||||
        sub = build_subscription(recipient_id, added_users[member], subscription_id)
 | 
			
		||||
    for slack_user_id in channel_members:
 | 
			
		||||
        sub = build_subscription(recipient_id, slack_user_id_to_zulip_user_id[slack_user_id],
 | 
			
		||||
                                 subscription_id)
 | 
			
		||||
        # The recipient corresponds to a stream for stream-readable message.
 | 
			
		||||
        zerver_subscription.append(sub)
 | 
			
		||||
        subscription_id += 1
 | 
			
		||||
    return subscription_id
 | 
			
		||||
 | 
			
		||||
def process_long_term_idle_users(slack_data_dir: str, users: List[ZerverFieldsT],
 | 
			
		||||
                                 added_users: AddedUsersT, added_channels: AddedChannelsT,
 | 
			
		||||
                                 slack_user_id_to_zulip_user_id: SlackToZulipUserIDT,
 | 
			
		||||
                                 added_channels: AddedChannelsT,
 | 
			
		||||
                                 added_mpims: AddedMPIMsT, dm_members: DMMembersT,
 | 
			
		||||
                                 zerver_userprofile: List[ZerverFieldsT]) -> Set[int]:
 | 
			
		||||
    """Algorithmically, we treat users who have sent at least 10 messages
 | 
			
		||||
@@ -527,7 +532,7 @@ def process_long_term_idle_users(slack_data_dir: str, users: List[ZerverFieldsT]
 | 
			
		||||
    for slack_user in users:
 | 
			
		||||
        if slack_user["id"] in recent_senders:
 | 
			
		||||
            continue
 | 
			
		||||
        zulip_user_id = added_users[slack_user['id']]
 | 
			
		||||
        zulip_user_id = slack_user_id_to_zulip_user_id[slack_user['id']]
 | 
			
		||||
        long_term_idle.add(zulip_user_id)
 | 
			
		||||
 | 
			
		||||
    # Record long-term idle status in zerver_userprofile
 | 
			
		||||
@@ -542,7 +547,8 @@ def process_long_term_idle_users(slack_data_dir: str, users: List[ZerverFieldsT]
 | 
			
		||||
    return long_term_idle
 | 
			
		||||
 | 
			
		||||
def convert_slack_workspace_messages(slack_data_dir: str, users: List[ZerverFieldsT], realm_id: int,
 | 
			
		||||
                                     added_users: AddedUsersT, added_recipient: AddedRecipientsT,
 | 
			
		||||
                                     slack_user_id_to_zulip_user_id: SlackToZulipUserIDT,
 | 
			
		||||
                                     added_recipient: AddedRecipientsT,
 | 
			
		||||
                                     added_channels: AddedChannelsT,
 | 
			
		||||
                                     added_mpims: AddedMPIMsT,
 | 
			
		||||
                                     dm_members: DMMembersT,
 | 
			
		||||
@@ -560,8 +566,9 @@ def convert_slack_workspace_messages(slack_data_dir: str, users: List[ZerverFiel
 | 
			
		||||
    3. attachment, which is a list of the attachments
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    long_term_idle = process_long_term_idle_users(slack_data_dir, users, added_users, added_channels,
 | 
			
		||||
                                                  added_mpims, dm_members, zerver_userprofile)
 | 
			
		||||
    long_term_idle = process_long_term_idle_users(slack_data_dir, users, slack_user_id_to_zulip_user_id,
 | 
			
		||||
                                                  added_channels, added_mpims, dm_members,
 | 
			
		||||
                                                  zerver_userprofile)
 | 
			
		||||
 | 
			
		||||
    # Now, we actually import the messages.
 | 
			
		||||
    all_messages = get_messages_iterator(slack_data_dir, added_channels, added_mpims, dm_members)
 | 
			
		||||
@@ -591,7 +598,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, message_data,
 | 
			
		||||
                realm_id, users, slack_user_id_to_zulip_user_id, added_recipient, message_data,
 | 
			
		||||
                zerver_realmemoji, subscriber_map, added_channels, dm_members,
 | 
			
		||||
                domain_name, long_term_idle)
 | 
			
		||||
 | 
			
		||||
@@ -651,7 +658,7 @@ def get_messages_iterator(slack_data_dir: str, added_channels: Dict[str, Any],
 | 
			
		||||
 | 
			
		||||
def channel_message_to_zerver_message(realm_id: int,
 | 
			
		||||
                                      users: List[ZerverFieldsT],
 | 
			
		||||
                                      added_users: AddedUsersT,
 | 
			
		||||
                                      slack_user_id_to_zulip_user_id: SlackToZulipUserIDT,
 | 
			
		||||
                                      added_recipient: AddedRecipientsT,
 | 
			
		||||
                                      all_messages: List[ZerverFieldsT],
 | 
			
		||||
                                      zerver_realmemoji: List[ZerverFieldsT],
 | 
			
		||||
@@ -685,9 +692,9 @@ def channel_message_to_zerver_message(realm_id: int,
 | 
			
		||||
    total_user_messages = 0
 | 
			
		||||
    total_skipped_user_messages = 0
 | 
			
		||||
    for message in all_messages:
 | 
			
		||||
        user = get_message_sending_user(message)
 | 
			
		||||
        if not user:
 | 
			
		||||
            # Ignore messages without user names
 | 
			
		||||
        slack_user_id = get_message_sending_user(message)
 | 
			
		||||
        if not slack_user_id:
 | 
			
		||||
            # Ignore messages without slack_user_id
 | 
			
		||||
            # These are Sometimes produced by slack
 | 
			
		||||
            continue
 | 
			
		||||
 | 
			
		||||
@@ -705,7 +712,7 @@ def channel_message_to_zerver_message(realm_id: int,
 | 
			
		||||
 | 
			
		||||
        try:
 | 
			
		||||
            content, mentioned_user_ids, has_link = convert_to_zulip_markdown(
 | 
			
		||||
                message['text'], users, added_channels, added_users)
 | 
			
		||||
                message['text'], users, added_channels, slack_user_id_to_zulip_user_id)
 | 
			
		||||
        except Exception:
 | 
			
		||||
            print("Slack message unexpectedly missing text representation:")
 | 
			
		||||
            print(ujson.dumps(message, indent=4))
 | 
			
		||||
@@ -733,9 +740,8 @@ def channel_message_to_zerver_message(realm_id: int,
 | 
			
		||||
 | 
			
		||||
        # Process message reactions
 | 
			
		||||
        if 'reactions' in message.keys():
 | 
			
		||||
            build_reactions(reaction_list, message['reactions'], added_users,
 | 
			
		||||
                            message_id, name_to_codepoint,
 | 
			
		||||
                            zerver_realmemoji)
 | 
			
		||||
            build_reactions(reaction_list, message['reactions'], slack_user_id_to_zulip_user_id,
 | 
			
		||||
                            message_id, name_to_codepoint, zerver_realmemoji)
 | 
			
		||||
 | 
			
		||||
        # Process different subtypes of slack messages
 | 
			
		||||
 | 
			
		||||
@@ -755,9 +761,9 @@ def channel_message_to_zerver_message(realm_id: int,
 | 
			
		||||
            domain_name=domain_name,
 | 
			
		||||
            realm_id=realm_id,
 | 
			
		||||
            message_id=message_id,
 | 
			
		||||
            user=user,
 | 
			
		||||
            slack_user_id=slack_user_id,
 | 
			
		||||
            users=users,
 | 
			
		||||
            added_users=added_users,
 | 
			
		||||
            slack_user_id_to_zulip_user_id=slack_user_id_to_zulip_user_id,
 | 
			
		||||
            zerver_attachment=zerver_attachment,
 | 
			
		||||
            uploads_list=uploads_list,
 | 
			
		||||
        )
 | 
			
		||||
@@ -772,8 +778,8 @@ def channel_message_to_zerver_message(realm_id: int,
 | 
			
		||||
        topic_name = 'imported from slack'
 | 
			
		||||
 | 
			
		||||
        zulip_message = build_message(topic_name, float(message['ts']), message_id, content,
 | 
			
		||||
                                      rendered_content, added_users[user], recipient_id,
 | 
			
		||||
                                      has_image, has_link, has_attachment)
 | 
			
		||||
                                      rendered_content, slack_user_id_to_zulip_user_id[slack_user_id],
 | 
			
		||||
                                      recipient_id, has_image, has_link, has_attachment)
 | 
			
		||||
        zerver_message.append(zulip_message)
 | 
			
		||||
 | 
			
		||||
        # construct usermessages
 | 
			
		||||
@@ -811,9 +817,9 @@ def process_message_files(message: ZerverFieldsT,
 | 
			
		||||
                          domain_name: str,
 | 
			
		||||
                          realm_id: int,
 | 
			
		||||
                          message_id: int,
 | 
			
		||||
                          user: str,
 | 
			
		||||
                          slack_user_id: str,
 | 
			
		||||
                          users: List[ZerverFieldsT],
 | 
			
		||||
                          added_users: AddedUsersT,
 | 
			
		||||
                          slack_user_id_to_zulip_user_id: SlackToZulipUserIDT,
 | 
			
		||||
                          zerver_attachment: List[ZerverFieldsT],
 | 
			
		||||
                          uploads_list: List[ZerverFieldsT]) -> Dict[str, Any]:
 | 
			
		||||
    has_attachment = False
 | 
			
		||||
@@ -854,10 +860,10 @@ def process_message_files(message: ZerverFieldsT,
 | 
			
		||||
            markdown_links.append(content_for_link)
 | 
			
		||||
 | 
			
		||||
            # construct attachments
 | 
			
		||||
            build_uploads(added_users[user], realm_id, file_user_email, fileinfo, s3_path,
 | 
			
		||||
                          uploads_list)
 | 
			
		||||
            build_uploads(slack_user_id_to_zulip_user_id[slack_user_id], realm_id, file_user_email,
 | 
			
		||||
                          fileinfo, s3_path, uploads_list)
 | 
			
		||||
 | 
			
		||||
            build_attachment(realm_id, {message_id}, added_users[user],
 | 
			
		||||
            build_attachment(realm_id, {message_id}, slack_user_id_to_zulip_user_id[slack_user_id],
 | 
			
		||||
                             fileinfo, s3_path, zerver_attachment)
 | 
			
		||||
        else:
 | 
			
		||||
            # For attachments with link not from slack
 | 
			
		||||
@@ -896,7 +902,7 @@ def get_attachment_path_and_content(fileinfo: ZerverFieldsT, realm_id: int) -> T
 | 
			
		||||
    return s3_path, content
 | 
			
		||||
 | 
			
		||||
def build_reactions(reaction_list: List[ZerverFieldsT], reactions: List[ZerverFieldsT],
 | 
			
		||||
                    added_users: AddedUsersT, message_id: int,
 | 
			
		||||
                    slack_user_id_to_zulip_user_id: SlackToZulipUserIDT, message_id: int,
 | 
			
		||||
                    name_to_codepoint: ZerverFieldsT,
 | 
			
		||||
                    zerver_realmemoji: List[ZerverFieldsT]) -> None:
 | 
			
		||||
    realmemoji = {}
 | 
			
		||||
@@ -918,7 +924,7 @@ def build_reactions(reaction_list: List[ZerverFieldsT], reactions: List[ZerverFi
 | 
			
		||||
        else:
 | 
			
		||||
            continue
 | 
			
		||||
 | 
			
		||||
        for user in slack_reaction['users']:
 | 
			
		||||
        for slack_user_id in slack_reaction['users']:
 | 
			
		||||
            reaction_id = NEXT_ID('reaction')
 | 
			
		||||
            reaction = Reaction(
 | 
			
		||||
                id=reaction_id,
 | 
			
		||||
@@ -929,7 +935,7 @@ def build_reactions(reaction_list: List[ZerverFieldsT], reactions: List[ZerverFi
 | 
			
		||||
            reaction_dict = model_to_dict(reaction,
 | 
			
		||||
                                          exclude=['message', 'user_profile'])
 | 
			
		||||
            reaction_dict['message'] = message_id
 | 
			
		||||
            reaction_dict['user_profile'] = added_users[user]
 | 
			
		||||
            reaction_dict['user_profile'] = slack_user_id_to_zulip_user_id[slack_user_id]
 | 
			
		||||
 | 
			
		||||
            reaction_list.append(reaction_dict)
 | 
			
		||||
 | 
			
		||||
@@ -1019,14 +1025,15 @@ def do_convert_data(slack_zip_file: str, output_dir: str, token: str, threads: i
 | 
			
		||||
    # Get custom emoji from slack api
 | 
			
		||||
    custom_emoji_list = get_slack_api_data("https://slack.com/api/emoji.list", "emoji", token=token)
 | 
			
		||||
 | 
			
		||||
    realm, added_users, added_recipient, added_channels, added_mpims, dm_members, avatar_list, \
 | 
			
		||||
        emoji_url_map = slack_workspace_to_realm(domain_name, realm_id, user_list,
 | 
			
		||||
                                                 realm_subdomain,
 | 
			
		||||
                                                 slack_data_dir, custom_emoji_list)
 | 
			
		||||
    realm, slack_user_id_to_zulip_user_id, added_recipient, added_channels, added_mpims, \
 | 
			
		||||
        dm_members, avatar_list, emoji_url_map = slack_workspace_to_realm(domain_name, realm_id, user_list,
 | 
			
		||||
                                                                          realm_subdomain, slack_data_dir,
 | 
			
		||||
                                                                          custom_emoji_list)
 | 
			
		||||
 | 
			
		||||
    reactions, uploads_list, zerver_attachment = convert_slack_workspace_messages(
 | 
			
		||||
        slack_data_dir, user_list, realm_id, added_users, added_recipient, added_channels, added_mpims,
 | 
			
		||||
        dm_members, realm, realm['zerver_userprofile'], realm['zerver_realmemoji'], domain_name, output_dir)
 | 
			
		||||
        slack_data_dir, user_list, realm_id, slack_user_id_to_zulip_user_id,
 | 
			
		||||
        added_recipient, added_channels, added_mpims, dm_members, realm,
 | 
			
		||||
        realm['zerver_userprofile'], realm['zerver_realmemoji'], domain_name, output_dir)
 | 
			
		||||
 | 
			
		||||
    # Move zerver_reactions to realm.json file
 | 
			
		||||
    realm['zerver_reaction'] = reactions
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@ from typing import Any, Dict, Tuple, List, Optional
 | 
			
		||||
 | 
			
		||||
# stubs
 | 
			
		||||
ZerverFieldsT = Dict[str, Any]
 | 
			
		||||
AddedUsersT = Dict[str, int]
 | 
			
		||||
SlackToZulipUserIDT = Dict[str, int]
 | 
			
		||||
AddedChannelsT = Dict[str, Tuple[str, int]]
 | 
			
		||||
 | 
			
		||||
# Slack link can be in the format <http://www.foo.com|www.foo.com> and <http://foo.com/>
 | 
			
		||||
@@ -67,7 +67,8 @@ def get_user_full_name(user: ZerverFieldsT) -> str:
 | 
			
		||||
# Markdown mapping
 | 
			
		||||
def convert_to_zulip_markdown(text: str, users: List[ZerverFieldsT],
 | 
			
		||||
                              added_channels: AddedChannelsT,
 | 
			
		||||
                              added_users: AddedUsersT) -> Tuple[str, List[int], bool]:
 | 
			
		||||
                              slack_user_id_to_zulip_user_id: SlackToZulipUserIDT) -> \
 | 
			
		||||
        Tuple[str, List[int], bool]:
 | 
			
		||||
    mentioned_users_id = []
 | 
			
		||||
    text = convert_markdown_syntax(text, SLACK_BOLD_REGEX, "**")
 | 
			
		||||
    text = convert_markdown_syntax(text, SLACK_STRIKETHROUGH_REGEX, "~~")
 | 
			
		||||
@@ -92,8 +93,8 @@ def convert_to_zulip_markdown(text: str, users: List[ZerverFieldsT],
 | 
			
		||||
        # Check user mentions and change mention format from
 | 
			
		||||
        # '<@slack_id|short_name>' to '@**full_name**'
 | 
			
		||||
        if (re.findall(SLACK_USERMENTION_REGEX, tokens[iterator], re.VERBOSE)):
 | 
			
		||||
            tokens[iterator], user_id = get_user_mentions(tokens[iterator],
 | 
			
		||||
                                                          users, added_users)
 | 
			
		||||
            tokens[iterator], user_id = get_user_mentions(tokens[iterator], users,
 | 
			
		||||
                                                          slack_user_id_to_zulip_user_id)
 | 
			
		||||
            if user_id is not None:
 | 
			
		||||
                mentioned_users_id.append(user_id)
 | 
			
		||||
 | 
			
		||||
@@ -112,7 +113,7 @@ def convert_to_zulip_markdown(text: str, users: List[ZerverFieldsT],
 | 
			
		||||
    return text, mentioned_users_id, message_has_link
 | 
			
		||||
 | 
			
		||||
def get_user_mentions(token: str, users: List[ZerverFieldsT],
 | 
			
		||||
                      added_users: AddedUsersT) -> Tuple[str, Optional[int]]:
 | 
			
		||||
                      slack_user_id_to_zulip_user_id: SlackToZulipUserIDT) -> Tuple[str, Optional[int]]:
 | 
			
		||||
    slack_usermention_match = re.search(SLACK_USERMENTION_REGEX, token, re.VERBOSE)
 | 
			
		||||
    assert slack_usermention_match is not None
 | 
			
		||||
    short_name = slack_usermention_match.group(4)
 | 
			
		||||
@@ -121,7 +122,7 @@ def get_user_mentions(token: str, users: List[ZerverFieldsT],
 | 
			
		||||
        if (user['id'] == slack_id and user['name'] == short_name and short_name) or \
 | 
			
		||||
           (user['id'] == slack_id and short_name is None):
 | 
			
		||||
            full_name = get_user_full_name(user)
 | 
			
		||||
            user_id = added_users[slack_id]
 | 
			
		||||
            user_id = slack_user_id_to_zulip_user_id[slack_id]
 | 
			
		||||
            mention = "@**" + full_name + "**"
 | 
			
		||||
            token = re.sub(SLACK_USERMENTION_REGEX, mention, token, flags=re.VERBOSE)
 | 
			
		||||
            return token, user_id
 | 
			
		||||
 
 | 
			
		||||
@@ -237,11 +237,11 @@ class SlackImporter(ZulipTestCase):
 | 
			
		||||
        mock_get_data_file.return_value = user_data
 | 
			
		||||
        # As user with slack_id 'U0CBK5KAT' is the primary owner, that user should be imported first
 | 
			
		||||
        # and hence has zulip_id = 1
 | 
			
		||||
        test_added_users = {'U08RGD1RD': 1, 'U0CBK5KAT': 0, 'U09TYF5Sk': 2, 'UHSG7OPQN': 3}
 | 
			
		||||
        test_slack_user_id_to_zulip_user_id = {'U08RGD1RD': 1, 'U0CBK5KAT': 0, 'U09TYF5Sk': 2, 'UHSG7OPQN': 3}
 | 
			
		||||
        slack_data_dir = './random_path'
 | 
			
		||||
        timestamp = int(timezone_now().timestamp())
 | 
			
		||||
        mock_get_data_file.return_value = user_data
 | 
			
		||||
        zerver_userprofile, avatar_list, added_users, customprofilefield, \
 | 
			
		||||
        zerver_userprofile, avatar_list, slack_user_id_to_zulip_user_id, customprofilefield, \
 | 
			
		||||
            customprofilefield_value = users_to_zerver_userprofile(slack_data_dir, user_data, 1,
 | 
			
		||||
                                                                   timestamp, 'test_domain')
 | 
			
		||||
 | 
			
		||||
@@ -263,7 +263,7 @@ class SlackImporter(ZulipTestCase):
 | 
			
		||||
        self.assertEqual(customprofilefield_value[5]['value'], 'test_skype_name')
 | 
			
		||||
 | 
			
		||||
        # test that the primary owner should always be imported first
 | 
			
		||||
        self.assertDictEqual(added_users, test_added_users)
 | 
			
		||||
        self.assertDictEqual(slack_user_id_to_zulip_user_id, test_slack_user_id_to_zulip_user_id)
 | 
			
		||||
        self.assertEqual(len(avatar_list), 4)
 | 
			
		||||
 | 
			
		||||
        self.assertEqual(len(zerver_userprofile), 4)
 | 
			
		||||
@@ -277,13 +277,13 @@ class SlackImporter(ZulipTestCase):
 | 
			
		||||
        self.assertEqual(zerver_userprofile[0]['email'], 'jon@gmail.com')
 | 
			
		||||
        self.assertEqual(zerver_userprofile[0]['full_name'], 'John Doe')
 | 
			
		||||
 | 
			
		||||
        self.assertEqual(zerver_userprofile[1]['id'], test_added_users['U0CBK5KAT'])
 | 
			
		||||
        self.assertEqual(zerver_userprofile[1]['id'], test_slack_user_id_to_zulip_user_id['U0CBK5KAT'])
 | 
			
		||||
        self.assertEqual(zerver_userprofile[1]['is_realm_admin'], True)
 | 
			
		||||
        self.assertEqual(zerver_userprofile[1]['is_staff'], False)
 | 
			
		||||
        self.assertEqual(zerver_userprofile[1]['is_active'], True)
 | 
			
		||||
        self.assertEqual(zerver_userprofile[0]['is_mirror_dummy'], False)
 | 
			
		||||
 | 
			
		||||
        self.assertEqual(zerver_userprofile[2]['id'], test_added_users['U09TYF5Sk'])
 | 
			
		||||
        self.assertEqual(zerver_userprofile[2]['id'], test_slack_user_id_to_zulip_user_id['U09TYF5Sk'])
 | 
			
		||||
        self.assertEqual(zerver_userprofile[2]['is_bot'], True)
 | 
			
		||||
        self.assertEqual(zerver_userprofile[2]['is_active'], True)
 | 
			
		||||
        self.assertEqual(zerver_userprofile[2]['is_mirror_dummy'], False)
 | 
			
		||||
@@ -291,7 +291,7 @@ class SlackImporter(ZulipTestCase):
 | 
			
		||||
        self.assertEqual(zerver_userprofile[2]['bot_type'], 1)
 | 
			
		||||
        self.assertEqual(zerver_userprofile[2]['avatar_source'], 'U')
 | 
			
		||||
 | 
			
		||||
        self.assertEqual(zerver_userprofile[3]['id'], test_added_users['UHSG7OPQN'])
 | 
			
		||||
        self.assertEqual(zerver_userprofile[3]['id'], test_slack_user_id_to_zulip_user_id['UHSG7OPQN'])
 | 
			
		||||
        self.assertEqual(zerver_userprofile[3]['is_realm_admin'], False)
 | 
			
		||||
        self.assertEqual(zerver_userprofile[3]['is_staff'], False)
 | 
			
		||||
        self.assertEqual(zerver_userprofile[3]['is_active'], False)
 | 
			
		||||
@@ -331,32 +331,35 @@ class SlackImporter(ZulipTestCase):
 | 
			
		||||
 | 
			
		||||
    def test_build_subscription(self) -> None:
 | 
			
		||||
        channel_members = ["U061A1R2R", "U061A3E0G", "U061A5N1G", "U064KUGRJ"]
 | 
			
		||||
        added_users = {"U061A1R2R": 1, "U061A3E0G": 8, "U061A5N1G": 7, "U064KUGRJ": 5}
 | 
			
		||||
        slack_user_id_to_zulip_user_id = {"U061A1R2R": 1, "U061A3E0G": 8, "U061A5N1G": 7, "U064KUGRJ": 5}
 | 
			
		||||
        subscription_id_count = 0
 | 
			
		||||
        recipient_id = 12
 | 
			
		||||
        zerver_subscription = []  # type: List[Dict[str, Any]]
 | 
			
		||||
        final_subscription_id = get_subscription(channel_members, zerver_subscription,
 | 
			
		||||
                                                 recipient_id, added_users,
 | 
			
		||||
                                                 recipient_id, slack_user_id_to_zulip_user_id,
 | 
			
		||||
                                                 subscription_id_count)
 | 
			
		||||
        # sanity checks
 | 
			
		||||
        self.assertEqual(final_subscription_id, 4)
 | 
			
		||||
        self.assertEqual(zerver_subscription[0]['recipient'], 12)
 | 
			
		||||
        self.assertEqual(zerver_subscription[0]['id'], 0)
 | 
			
		||||
        self.assertEqual(zerver_subscription[0]['user_profile'], added_users[channel_members[0]])
 | 
			
		||||
        self.assertEqual(zerver_subscription[2]['user_profile'], added_users[channel_members[2]])
 | 
			
		||||
        self.assertEqual(zerver_subscription[0]['user_profile'],
 | 
			
		||||
                         slack_user_id_to_zulip_user_id[channel_members[0]])
 | 
			
		||||
        self.assertEqual(zerver_subscription[2]['user_profile'],
 | 
			
		||||
                         slack_user_id_to_zulip_user_id[channel_members[2]])
 | 
			
		||||
        self.assertEqual(zerver_subscription[3]['id'], 3)
 | 
			
		||||
        self.assertEqual(zerver_subscription[1]['recipient'],
 | 
			
		||||
                         zerver_subscription[3]['recipient'])
 | 
			
		||||
        self.assertEqual(zerver_subscription[1]['pin_to_top'], False)
 | 
			
		||||
 | 
			
		||||
    def test_channels_to_zerver_stream(self) -> None:
 | 
			
		||||
        added_users = {"U061A1R2R": 1, "U061A3E0G": 8, "U061A5N1G": 7, "U064KUGRJ": 5}
 | 
			
		||||
        slack_user_id_to_zulip_user_id = {"U061A1R2R": 1, "U061A3E0G": 8, "U061A5N1G": 7, "U064KUGRJ": 5}
 | 
			
		||||
        zerver_userprofile = [{'id': 1}, {'id': 8}, {'id': 7}, {'id': 5}]
 | 
			
		||||
        realm_id = 3
 | 
			
		||||
 | 
			
		||||
        realm, added_channels, added_mpims, dm_members, \
 | 
			
		||||
            added_recipient = channels_to_zerver_stream(self.fixture_file_name("", "slack_fixtures"), realm_id,
 | 
			
		||||
                                                        {"zerver_userpresence": []}, added_users, zerver_userprofile)
 | 
			
		||||
                                                        {"zerver_userpresence": []}, slack_user_id_to_zulip_user_id,
 | 
			
		||||
                                                        zerver_userprofile)
 | 
			
		||||
 | 
			
		||||
        test_added_channels = {'sharedchannel': ("C061A0HJG", 3), 'general': ("C061A0YJG", 1),
 | 
			
		||||
                               'general1': ("C061A0YJP", 2), 'random': ("C061A0WJG", 0)}
 | 
			
		||||
@@ -365,7 +368,8 @@ class SlackImporter(ZulipTestCase):
 | 
			
		||||
                            'mpdm-user4--user1--user5-1': ('G6N944JPL', 2)}
 | 
			
		||||
        test_dm_members = {'DJ47BL849': ('U061A1R2R', 'U061A5N1G'), 'DHX1UP7EG': ('U061A5N1G', 'U064KUGRJ'),
 | 
			
		||||
                           'DK8HSJDHS': ('U061A1R2R', 'U064KUGRJ'), 'DRS3PSLDK': ('U064KUGRJ', 'U064KUGRJ')}
 | 
			
		||||
        test_added_recipient_keys = set(added_users.keys()) | set(test_added_channels.keys()) | set(test_added_mpims.keys())
 | 
			
		||||
        test_added_recipient_keys = set(slack_user_id_to_zulip_user_id.keys()) | set(test_added_channels.keys()) \
 | 
			
		||||
            | set(test_added_mpims.keys())
 | 
			
		||||
 | 
			
		||||
        self.assertDictEqual(test_added_channels, added_channels)
 | 
			
		||||
        # zerver defaultstream already tested in helper functions
 | 
			
		||||
@@ -376,7 +380,7 @@ class SlackImporter(ZulipTestCase):
 | 
			
		||||
        self.assertDictEqual(test_dm_members, dm_members)
 | 
			
		||||
 | 
			
		||||
        # We can't do an assertDictEqual since during the construction of Personal
 | 
			
		||||
        # recipients, added_users are iterated in diffrent order in Python 3.5 and 3.6.
 | 
			
		||||
        # recipients, slack_user_id_to_zulip_user_id are iterated in diffrent order in Python 3.5 and 3.6.
 | 
			
		||||
        self.assertEqual(set(added_recipient.keys()), test_added_recipient_keys)
 | 
			
		||||
        self.assertEqual(set(added_recipient.values()), set(i for i in range(11)))
 | 
			
		||||
 | 
			
		||||
@@ -415,12 +419,14 @@ class SlackImporter(ZulipTestCase):
 | 
			
		||||
 | 
			
		||||
        realm_id = 1
 | 
			
		||||
        user_list = []  # type: List[Dict[str, Any]]
 | 
			
		||||
        realm, added_users, added_recipient, added_channels, added_mpims, dm_members, avatar_list, em = slack_workspace_to_realm(
 | 
			
		||||
            'testdomain', realm_id, user_list, 'test-realm', './random_path', {})
 | 
			
		||||
        realm, slack_user_id_to_zulip_user_id, added_recipient, \
 | 
			
		||||
            added_channels, added_mpims, dm_members, \
 | 
			
		||||
            avatar_list, em = slack_workspace_to_realm('testdomain', realm_id, user_list, 'test-realm',
 | 
			
		||||
                                                       './random_path', {})
 | 
			
		||||
        test_zerver_realmdomain = [{'realm': realm_id, 'allow_subdomains': False,
 | 
			
		||||
                                    'domain': 'testdomain', 'id': realm_id}]
 | 
			
		||||
        # Functioning already tests in helper functions
 | 
			
		||||
        self.assertEqual(added_users, {})
 | 
			
		||||
        self.assertEqual(slack_user_id_to_zulip_user_id, {})
 | 
			
		||||
        self.assertEqual(added_channels, {})
 | 
			
		||||
        self.assertEqual(added_mpims, {})
 | 
			
		||||
        self.assertEqual(added_recipient, {})
 | 
			
		||||
@@ -498,7 +504,7 @@ class SlackImporter(ZulipTestCase):
 | 
			
		||||
                     {"id": "U061A5N1G", "name": "jane doe", "deleted": False, "real_name": "Jane"},
 | 
			
		||||
                     {"id": "U061A1R2R", "name": "jon", "deleted": False, "real_name": "Jon"}]
 | 
			
		||||
 | 
			
		||||
        added_users = {"U066MTL5U": 5, "U061A5N1G": 24, "U061A1R2R": 43}
 | 
			
		||||
        slack_user_id_to_zulip_user_id = {"U066MTL5U": 5, "U061A5N1G": 24, "U061A1R2R": 43}
 | 
			
		||||
 | 
			
		||||
        reactions = [{"name": "grinning", "users": ["U061A5N1G"], "count": 1}]
 | 
			
		||||
 | 
			
		||||
@@ -543,7 +549,7 @@ class SlackImporter(ZulipTestCase):
 | 
			
		||||
 | 
			
		||||
        zerver_message, zerver_usermessage, attachment, uploads, reaction = \
 | 
			
		||||
            channel_message_to_zerver_message(
 | 
			
		||||
                1, user_data, added_users, added_recipient,
 | 
			
		||||
                1, user_data, slack_user_id_to_zulip_user_id, added_recipient,
 | 
			
		||||
                all_messages, [], subscriber_map,
 | 
			
		||||
                added_channels, dm_members, 'domain', set())
 | 
			
		||||
        # functioning already tested in helper function
 | 
			
		||||
@@ -726,9 +732,9 @@ class SlackImporter(ZulipTestCase):
 | 
			
		||||
        domain_name = 'example.com'
 | 
			
		||||
        realm_id = 5
 | 
			
		||||
        message_id = 99
 | 
			
		||||
        user = 'alice'
 | 
			
		||||
        slack_user_id = 'alice'
 | 
			
		||||
        users = [alice]
 | 
			
		||||
        added_users = {
 | 
			
		||||
        slack_user_id_to_zulip_user_id = {
 | 
			
		||||
            'alice': alice_id,
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -740,9 +746,9 @@ class SlackImporter(ZulipTestCase):
 | 
			
		||||
            domain_name=domain_name,
 | 
			
		||||
            realm_id=realm_id,
 | 
			
		||||
            message_id=message_id,
 | 
			
		||||
            user=user,
 | 
			
		||||
            slack_user_id=slack_user_id,
 | 
			
		||||
            users=users,
 | 
			
		||||
            added_users=added_users,
 | 
			
		||||
            slack_user_id_to_zulip_user_id=slack_user_id_to_zulip_user_id,
 | 
			
		||||
            zerver_attachment=zerver_attachment,
 | 
			
		||||
            uploads_list=uploads_list,
 | 
			
		||||
        )
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user