mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	slack importer: Add helper functions to build user uploads object.
This commit is contained in:
		@@ -9,6 +9,7 @@ import re
 | 
			
		||||
import logging
 | 
			
		||||
import random
 | 
			
		||||
import requests
 | 
			
		||||
import random
 | 
			
		||||
 | 
			
		||||
from django.conf import settings
 | 
			
		||||
from django.db import connection
 | 
			
		||||
@@ -21,6 +22,7 @@ from zerver.lib.slack_message_conversion import convert_to_zulip_markdown, \
 | 
			
		||||
    get_user_full_name
 | 
			
		||||
from zerver.lib.avatar_hash import user_avatar_path_from_ids
 | 
			
		||||
from zerver.lib.actions import STREAM_ASSIGNMENT_COLORS as stream_colors
 | 
			
		||||
from zerver.lib.upload import random_name, sanitize_name
 | 
			
		||||
 | 
			
		||||
# stubs
 | 
			
		||||
ZerverFieldsT = Dict[str, Any]
 | 
			
		||||
@@ -472,7 +474,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) -> ZerverFieldsT:
 | 
			
		||||
                                     realm: ZerverFieldsT, domain_name: str) -> ZerverFieldsT:
 | 
			
		||||
    """
 | 
			
		||||
    Returns:
 | 
			
		||||
    1. message.json, Converted messages
 | 
			
		||||
@@ -499,7 +501,7 @@ def convert_slack_workspace_messages(slack_data_dir: str, users: List[ZerverFiel
 | 
			
		||||
    id_list = [message_id_list, usermessage_id_list]
 | 
			
		||||
    zerver_message, zerver_usermessage = channel_message_to_zerver_message(
 | 
			
		||||
        realm_id, users, added_users, added_recipient, all_messages,
 | 
			
		||||
        realm['zerver_subscription'], id_list)
 | 
			
		||||
        realm['zerver_subscription'], domain_name, id_list)
 | 
			
		||||
 | 
			
		||||
    logging.info('######### IMPORTING MESSAGES FINISHED #########\n')
 | 
			
		||||
 | 
			
		||||
@@ -551,6 +553,7 @@ def channel_message_to_zerver_message(realm_id: int, users: List[ZerverFieldsT],
 | 
			
		||||
                                      added_recipient: AddedRecipientsT,
 | 
			
		||||
                                      all_messages: List[ZerverFieldsT],
 | 
			
		||||
                                      zerver_subscription: List[ZerverFieldsT],
 | 
			
		||||
                                      domain_name: str,
 | 
			
		||||
                                      ids: List[Any]) -> Tuple[List[ZerverFieldsT],
 | 
			
		||||
                                                               List[ZerverFieldsT]]:
 | 
			
		||||
    """
 | 
			
		||||
@@ -562,6 +565,7 @@ def channel_message_to_zerver_message(realm_id: int, users: List[ZerverFieldsT],
 | 
			
		||||
    message_id_list, usermessage_id_list = ids
 | 
			
		||||
    zerver_message = []
 | 
			
		||||
    zerver_usermessage = []  # type: List[ZerverFieldsT]
 | 
			
		||||
    uploads_list = []  # type: List[ZerverFieldsT]
 | 
			
		||||
 | 
			
		||||
    for message in all_messages:
 | 
			
		||||
        user = get_message_sending_user(message)
 | 
			
		||||
@@ -570,7 +574,7 @@ def channel_message_to_zerver_message(realm_id: int, users: List[ZerverFieldsT],
 | 
			
		||||
            # These are Sometimes produced by slack
 | 
			
		||||
            continue
 | 
			
		||||
 | 
			
		||||
        has_attachment = False
 | 
			
		||||
        has_attachment = has_image = False
 | 
			
		||||
        content, mentioned_users_id, has_link = convert_to_zulip_markdown(message['text'],
 | 
			
		||||
                                                                          users,
 | 
			
		||||
                                                                          added_users)
 | 
			
		||||
@@ -580,13 +584,29 @@ def channel_message_to_zerver_message(realm_id: int, users: List[ZerverFieldsT],
 | 
			
		||||
            if subtype in ["channel_join", "channel_leave", "channel_name"]:
 | 
			
		||||
                continue
 | 
			
		||||
 | 
			
		||||
            # For attachments
 | 
			
		||||
            elif subtype == "file_share":
 | 
			
		||||
                fileinfo = message['file']
 | 
			
		||||
 | 
			
		||||
                has_attachment = has_link = True
 | 
			
		||||
                has_image = True if 'image' in fileinfo['mimetype'] else False
 | 
			
		||||
 | 
			
		||||
                file_user = [iterate_user for iterate_user in users if message['user'] == user]
 | 
			
		||||
                file_user_email = get_user_email(file_user[0], domain_name)
 | 
			
		||||
 | 
			
		||||
                s3_path, content = get_attachment_path_and_content(fileinfo, realm_id)
 | 
			
		||||
 | 
			
		||||
                # construct attachments
 | 
			
		||||
                build_uploads(added_users[user], realm_id, file_user_email, fileinfo, s3_path,
 | 
			
		||||
                              uploads_list)
 | 
			
		||||
 | 
			
		||||
        recipient_id = added_recipient[message['channel_name']]
 | 
			
		||||
        message_id = message_id_list[message_id_count]
 | 
			
		||||
        # construct message
 | 
			
		||||
        zulip_message = dict(
 | 
			
		||||
            sending_client=1,
 | 
			
		||||
            rendered_content_version=1,  # This is Zulip-specific
 | 
			
		||||
            has_image=message.get('has_image', False),
 | 
			
		||||
            has_image=has_image,
 | 
			
		||||
            subject='imported from slack',  # This is Zulip-specific
 | 
			
		||||
            pub_date=float(message['ts']),
 | 
			
		||||
            id=message_id,
 | 
			
		||||
@@ -609,6 +629,41 @@ def channel_message_to_zerver_message(realm_id: int, users: List[ZerverFieldsT],
 | 
			
		||||
        message_id_count += 1
 | 
			
		||||
    return zerver_message, zerver_usermessage
 | 
			
		||||
 | 
			
		||||
def get_attachment_path_and_content(fileinfo: ZerverFieldsT, realm_id: int) -> Tuple[str,
 | 
			
		||||
                                                                                     str]:
 | 
			
		||||
    # Should be kept in sync with its equivalent in zerver/lib/uploads in the function
 | 
			
		||||
    # 'upload_message_image'
 | 
			
		||||
    s3_path = "/".join([
 | 
			
		||||
        str(realm_id),
 | 
			
		||||
        format(random.randint(0, 255), 'x'),
 | 
			
		||||
        random_name(18),
 | 
			
		||||
        sanitize_name(fileinfo['name'])
 | 
			
		||||
    ])
 | 
			
		||||
    attachment_path = ('/user_uploads/%s' % (s3_path))
 | 
			
		||||
 | 
			
		||||
    # change the default upload message: 'uploaded this file: <file_name>' in Slack
 | 
			
		||||
    # to '<file_comment> <file_name>'
 | 
			
		||||
    if fileinfo['comments_count'] != 0:
 | 
			
		||||
        file_comment = fileinfo['initial_comment'].get("comment", '')
 | 
			
		||||
    else:
 | 
			
		||||
        file_comment = ''
 | 
			
		||||
    content = '%s [%s](%s)' % (file_comment, fileinfo['name'], attachment_path)
 | 
			
		||||
 | 
			
		||||
    return s3_path, content
 | 
			
		||||
 | 
			
		||||
def build_uploads(user_id: int, realm_id: int, email: str, fileinfo: ZerverFieldsT, s3_path: str,
 | 
			
		||||
                  uploads_list: List[ZerverFieldsT]) -> None:
 | 
			
		||||
    upload = dict(
 | 
			
		||||
        path=fileinfo['url_private'],  # Save slack's url here, which is used later while processing
 | 
			
		||||
        realm_id=realm_id,
 | 
			
		||||
        content_type=None,
 | 
			
		||||
        user_profile_id=user_id,
 | 
			
		||||
        last_modified=fileinfo['timestamp'],
 | 
			
		||||
        user_profile_email=email,
 | 
			
		||||
        s3_path=s3_path,
 | 
			
		||||
        size=fileinfo['size'])
 | 
			
		||||
    uploads_list.append(upload)
 | 
			
		||||
 | 
			
		||||
def get_message_sending_user(message: ZerverFieldsT) -> str:
 | 
			
		||||
    try:
 | 
			
		||||
        user = message.get('user', message['file']['user'])
 | 
			
		||||
@@ -664,7 +719,7 @@ def do_convert_data(slack_zip_file: str, realm_subdomain: str, output_dir: str,
 | 
			
		||||
 | 
			
		||||
    message_json = convert_slack_workspace_messages(slack_data_dir, user_list, realm_id,
 | 
			
		||||
                                                    added_users, added_recipient, added_channels,
 | 
			
		||||
                                                    realm)
 | 
			
		||||
                                                    realm, domain_name)
 | 
			
		||||
 | 
			
		||||
    avatar_folder = os.path.join(output_dir, 'avatars')
 | 
			
		||||
    avatar_realm_folder = os.path.join(avatar_folder, str(realm_id))
 | 
			
		||||
 
 | 
			
		||||
@@ -435,7 +435,8 @@ class SlackImporter(ZulipTestCase):
 | 
			
		||||
        zerver_message, zerver_usermessage = channel_message_to_zerver_message(1, user_data, added_users,
 | 
			
		||||
                                                                               added_recipient,
 | 
			
		||||
                                                                               all_messages,
 | 
			
		||||
                                                                               zerver_subscription, ids)
 | 
			
		||||
                                                                               zerver_subscription,
 | 
			
		||||
                                                                               'domain', ids)
 | 
			
		||||
        # functioning already tested in helper function
 | 
			
		||||
        self.assertEqual(zerver_usermessage, [])
 | 
			
		||||
        # subtype: channel_join is filtered
 | 
			
		||||
@@ -456,7 +457,7 @@ class SlackImporter(ZulipTestCase):
 | 
			
		||||
        self.assertEqual(zerver_message[4]['id'], 7)
 | 
			
		||||
 | 
			
		||||
        self.assertIsNone(zerver_message[3]['rendered_content'])
 | 
			
		||||
        self.assertEqual(zerver_message[0]['has_image'], all_messages[1]['has_image'])
 | 
			
		||||
        self.assertEqual(zerver_message[0]['has_image'], False)
 | 
			
		||||
        self.assertEqual(zerver_message[0]['pub_date'], float(all_messages[1]['ts']))
 | 
			
		||||
        self.assertEqual(zerver_message[2]['rendered_content_version'], 1)
 | 
			
		||||
 | 
			
		||||
@@ -481,7 +482,7 @@ class SlackImporter(ZulipTestCase):
 | 
			
		||||
        mock_message.side_effect = [[zerver_message, zerver_usermessage]]
 | 
			
		||||
        message_json = convert_slack_workspace_messages('./random_path', user_list, 2, {},
 | 
			
		||||
                                                        {}, added_channels,
 | 
			
		||||
                                                        realm)
 | 
			
		||||
                                                        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