def process_mpims(mpims: List[Dict[str, Any]]) -> None: nonlocal huddle_id_count nonlocal recipient_id_count nonlocal subscription_id_count for mpim in mpims: huddle = build_huddle(huddle_id_count) realm["zerver_huddle"].append(huddle) added_mpims[mpim['name']] = (mpim['id'], huddle_id_count) recipient = build_recipient(huddle_id_count, recipient_id_count, Recipient.HUDDLE) realm["zerver_recipient"].append(recipient) slack_recipient_name_to_zulip_recipient_id[ mpim['name']] = recipient_id_count subscription_id_count = get_subscription( mpim['members'], realm["zerver_subscription"], recipient_id_count, slack_user_id_to_zulip_user_id, subscription_id_count) huddle_id_count += 1 recipient_id_count += 1 logging.info(u"{} -> created".format(mpim['name']))
def build_recipient_and_subscription( zerver_userprofile: List[ZerverFieldsT], zerver_stream: List[ZerverFieldsT] ) -> Tuple[List[ZerverFieldsT], List[ZerverFieldsT]]: """ Assumes that there is at least one stream with 'stream_id' = 0, and that this stream is the only defaultstream, with 'defaultstream_id' = 0 Returns: 1. zerver_recipient, which is a list of mapped recipient 2. zerver_subscription, which is a list of mapped subscription """ zerver_recipient = [] zerver_subscription = [] recipient_id = subscription_id = 0 # For streams # Initial recipients correspond to initial streams # We enumerate all streams, and build a recipient for each # Hence 'recipient_id'=n corresponds to 'stream_id'=n for stream in zerver_stream: zerver_recipient.append( build_recipient(recipient_id, recipient_id, Recipient.STREAM)) recipient_id += 1 # For users for user in zerver_userprofile: zerver_recipient.append( build_recipient(user['id'], recipient_id, Recipient.PERSONAL)) zerver_subscription.append( build_subscription(recipient_id, user['id'], subscription_id)) recipient_id += 1 subscription_id += 1 # As suggested in #14830, we subscribe every user to every stream. # We rely on the above invariant: 'recipient_id'=n corresponds to 'stream_id'=n # # TODO: For multi-stream imports, subscribe users to streams # based either on Gitter API data or who sent messages where. for user in zerver_userprofile: for stream in zerver_stream: zerver_subscription.append( build_subscription(stream['id'], user['id'], subscription_id)) subscription_id += 1 return zerver_recipient, zerver_subscription
def process_channels(channels: List[Dict[str, Any]], invite_only: bool = False) -> None: nonlocal stream_id_count nonlocal recipient_id_count nonlocal defaultstream_id nonlocal subscription_id_count for channel in channels: # slack_channel_id = channel['id'] # map Slack's topic and purpose content into Zulip's stream description. # WARN This mapping is lossy since the topic.creator, topic.last_set, # purpose.creator, purpose.last_set fields are not preserved. description = channel["purpose"]["value"] stream_id = stream_id_count recipient_id = recipient_id_count # construct the stream object and append it to zerver_stream stream = build_stream(float(channel["created"]), realm_id, channel["name"], description, stream_id, channel["is_archived"], invite_only) zerver_stream.append(stream) # construct defaultstream object # slack has the default channel 'general' and 'random' # where every user is subscribed default_channels = ['general', 'random'] # Slack specific if channel['name'] in default_channels: defaultstream = build_defaultstream(realm_id, stream_id, defaultstream_id) zerver_defaultstream.append(defaultstream) defaultstream_id += 1 added_channels[stream['name']] = (channel['id'], stream_id) recipient = build_recipient(stream_id, recipient_id, Recipient.STREAM) zerver_recipient.append(recipient) added_recipient[stream['name']] = recipient_id # TODO add recipients for private message and huddles # construct the subscription object and append it to zerver_subscription subscription_id_count = get_subscription(channel['members'], zerver_subscription, recipient_id, added_users, subscription_id_count) # TODO add zerver_subscription which correspond to # huddles type recipient # For huddles: # sub['recipient']=recipient['id'] where recipient['type_id']=added_users[member] stream_id_count += 1 recipient_id_count += 1 logging.info(u"{} -> created".format(channel['name']))
def build_recipient_and_subscription( zerver_userprofile: List[ZerverFieldsT], zerver_stream: List[ZerverFieldsT] ) -> Tuple[List[ZerverFieldsT], List[ZerverFieldsT]]: """ Returns: 1. zerver_recipient, which is a list of mapped recipient 2. zerver_subscription, which is a list of mapped subscription """ zerver_recipient = [] zerver_subscription = [] recipient_id = subscription_id = 0 # For stream # We have only one recipient, because we have only one stream # Hence 'recipient_id'=0 corresponds to 'stream_id'=0 recipient = build_recipient(0, recipient_id, Recipient.STREAM) zerver_recipient.append(recipient) for user in zerver_userprofile: subscription = build_subscription(recipient_id, user['id'], subscription_id) zerver_subscription.append(subscription) subscription_id += 1 recipient_id += 1 # For users for user in zerver_userprofile: recipient = build_recipient(user['id'], recipient_id, Recipient.PERSONAL) subscription = build_subscription(recipient_id, user['id'], subscription_id) zerver_recipient.append(recipient) zerver_subscription.append(subscription) recipient_id += 1 subscription_id += 1 return zerver_recipient, zerver_subscription
def build_recipient_and_subscription( zerver_userprofile: List[ZerverFieldsT], zerver_stream: List[ZerverFieldsT]) -> Tuple[List[ZerverFieldsT], List[ZerverFieldsT]]: """ Returns: 1. zerver_recipient, which is a list of mapped recipient 2. zerver_subscription, which is a list of mapped subscription """ zerver_recipient = [] zerver_subscription = [] recipient_id = subscription_id = 0 # For stream # We have only one recipient, because we have only one stream # Hence 'recipient_id'=0 corresponds to 'stream_id'=0 recipient = build_recipient(0, recipient_id, Recipient.STREAM) zerver_recipient.append(recipient) for user in zerver_userprofile: subscription = build_subscription(recipient_id, user['id'], subscription_id) zerver_subscription.append(subscription) subscription_id += 1 recipient_id += 1 # For users for user in zerver_userprofile: recipient = build_recipient(user['id'], recipient_id, Recipient.PERSONAL) subscription = build_subscription(recipient_id, user['id'], subscription_id) zerver_recipient.append(recipient) zerver_subscription.append(subscription) recipient_id += 1 subscription_id += 1 return zerver_recipient, zerver_subscription
def process_channels(channels: List[Dict[str, Any]], invite_only: bool = False) -> None: nonlocal stream_id_count nonlocal recipient_id_count nonlocal defaultstream_id nonlocal subscription_id_count for channel in channels: # map Slack's topic and purpose content into Zulip's stream description. # WARN This mapping is lossy since the topic.creator, topic.last_set, # purpose.creator, purpose.last_set fields are not preserved. description = channel["purpose"]["value"] stream_id = stream_id_count recipient_id = recipient_id_count stream = build_stream( float(channel["created"]), realm_id, channel["name"], description, stream_id, channel["is_archived"], invite_only, ) realm["zerver_stream"].append(stream) slack_default_channels = ["general", "random"] if channel["name"] in slack_default_channels and not stream["deactivated"]: defaultstream = build_defaultstream(realm_id, stream_id, defaultstream_id) realm["zerver_defaultstream"].append(defaultstream) defaultstream_id += 1 added_channels[stream["name"]] = (channel["id"], stream_id) recipient = build_recipient(stream_id, recipient_id, Recipient.STREAM) realm["zerver_recipient"].append(recipient) slack_recipient_name_to_zulip_recipient_id[stream["name"]] = recipient_id subscription_id_count = get_subscription( channel["members"], realm["zerver_subscription"], recipient_id, slack_user_id_to_zulip_user_id, subscription_id_count, ) stream_id_count += 1 recipient_id_count += 1 logging.info("%s -> created", channel["name"])
def test_build_pm_recipient_sub_from_user(self) -> None: zulip_user_id = 3 recipient_id = 5 subscription_id = 7 sub = build_subscription(recipient_id, zulip_user_id, subscription_id) recipient = build_recipient(zulip_user_id, recipient_id, Recipient.PERSONAL) self.assertEqual(recipient['id'], sub['recipient']) self.assertEqual(recipient['type_id'], sub['user_profile']) self.assertEqual(recipient['type'], Recipient.PERSONAL) self.assertEqual(recipient['type_id'], 3) self.assertEqual(sub['recipient'], 5) self.assertEqual(sub['id'], 7) self.assertEqual(sub['active'], True)
def test_build_pm_recipient_sub_from_user(self) -> None: zulip_user_id = 3 recipient_id = 5 subscription_id = 7 sub = build_subscription(recipient_id, zulip_user_id, subscription_id) recipient = build_recipient(zulip_user_id, recipient_id, Recipient.PERSONAL) self.assertEqual(recipient["id"], sub["recipient"]) self.assertEqual(recipient["type_id"], sub["user_profile"]) self.assertEqual(recipient["type"], Recipient.PERSONAL) self.assertEqual(recipient["type_id"], 3) self.assertEqual(sub["recipient"], 5) self.assertEqual(sub["id"], 7) self.assertEqual(sub["active"], True)
def test_build_pm_recipient_sub_from_user(self) -> None: zulip_user_id = 3 recipient_id = 5 subscription_id = 7 sub = build_subscription(recipient_id, zulip_user_id, subscription_id) recipient = build_recipient(zulip_user_id, recipient_id, Recipient.PERSONAL) self.assertEqual(recipient['id'], sub['recipient']) self.assertEqual(recipient['type_id'], sub['user_profile']) self.assertEqual(recipient['type'], Recipient.PERSONAL) self.assertEqual(recipient['type_id'], 3) self.assertEqual(sub['recipient'], 5) self.assertEqual(sub['id'], 7) self.assertEqual(sub['active'], True)
def process_mpims(mpims: List[Dict[str, Any]]) -> None: nonlocal huddle_id_count nonlocal recipient_id_count nonlocal subscription_id_count for mpim in mpims: huddle = build_huddle(huddle_id_count) zerver_huddle.append(huddle) added_mpims[mpim['name']] = (mpim['id'], huddle_id_count) recipient = build_recipient(huddle_id_count, recipient_id_count, Recipient.HUDDLE) zerver_recipient.append(recipient) added_recipient[mpim['name']] = recipient_id_count subscription_id_count = get_subscription(mpim['members'], zerver_subscription, recipient_id_count, added_users, subscription_id_count) huddle_id_count += 1 recipient_id_count += 1 logging.info(u"{} -> created".format(mpim['name']))
def channels_to_zerver_stream(slack_data_dir: str, realm_id: int, added_users: AddedUsersT, zerver_userprofile: List[ZerverFieldsT]) -> Tuple[List[ZerverFieldsT], List[ZerverFieldsT], AddedChannelsT, List[ZerverFieldsT], List[ZerverFieldsT], AddedRecipientsT]: """ Returns: 1. zerver_defaultstream, which is a list of the default streams 2. zerver_stream, while is a list of all streams 3. added_channels, which is a dictionary to map from channel name to channel id, zulip stream_id 4. zerver_subscription, which is a list of the subscriptions 5. zerver_recipient, which is a list of the recipients 6. added_recipient, which is a dictionary to map from channel name to zulip recipient_id """ logging.info('######### IMPORTING CHANNELS STARTED #########\n') channels = get_data_file(slack_data_dir + '/channels.json') added_channels = {} added_recipient = {} zerver_stream = [] zerver_subscription = [] # type: List[ZerverFieldsT] zerver_recipient = [] zerver_defaultstream = [] stream_id_count = subscription_id_count = recipient_id_count = defaultstream_id = 0 for channel in channels: # slack_channel_id = channel['id'] # map Slack's topic and purpose content into Zulip's stream description. # WARN This mapping is lossy since the topic.creator, topic.last_set, # purpose.creator, purpose.last_set fields are not preserved. description = channel["purpose"]["value"] stream_id = stream_id_count recipient_id = recipient_id_count # construct the stream object and append it to zerver_stream stream = build_stream(float(channel["created"]), realm_id, channel["name"], description, stream_id, channel["is_archived"]) zerver_stream.append(stream) # construct defaultstream object # slack has the default channel 'general' and 'random' # where every user is subscribed default_channels = ['general', 'random'] # Slack specific if channel['name'] in default_channels: defaultstream = build_defaultstream(realm_id, stream_id, defaultstream_id) zerver_defaultstream.append(defaultstream) defaultstream_id += 1 added_channels[stream['name']] = (channel['id'], stream_id) recipient = build_recipient(stream_id, recipient_id, Recipient.STREAM) zerver_recipient.append(recipient) added_recipient[stream['name']] = recipient_id # TODO add recipients for private message and huddles # construct the subscription object and append it to zerver_subscription subscription_id_count = get_subscription(channel['members'], zerver_subscription, recipient_id, added_users, subscription_id_count) # TODO add zerver_subscription which correspond to # huddles type recipient # For huddles: # sub['recipient']=recipient['id'] where recipient['type_id']=added_users[member] stream_id_count += 1 recipient_id_count += 1 logging.info(u"{} -> created".format(channel['name'])) # TODO map Slack's pins to Zulip's stars # There is the security model that Slack's pins are known to the team owner # as evident from where it is stored at (channels) # "pins": [ # { # "id": "1444755381.000003", # "type": "C", # "user": "******", # "owner": "U061A5N1G", # "created": "1444755463" # } # ], for user in zerver_userprofile: # this maps the recipients and subscriptions # related to private messages recipient = build_recipient(user['id'], recipient_id_count, Recipient.PERSONAL) sub = build_subscription(recipient_id_count, user['id'], subscription_id_count) zerver_recipient.append(recipient) zerver_subscription.append(sub) subscription_id_count += 1 recipient_id_count += 1 logging.info('######### IMPORTING STREAMS FINISHED #########\n') return zerver_defaultstream, zerver_stream, added_channels, zerver_subscription, \ zerver_recipient, added_recipient
def channels_to_zerver_stream(slack_data_dir: str, realm_id: int, added_users: AddedUsersT, zerver_userprofile: List[ZerverFieldsT]) -> Tuple[List[ZerverFieldsT], List[ZerverFieldsT], AddedChannelsT, List[ZerverFieldsT], List[ZerverFieldsT], AddedRecipientsT]: """ Returns: 1. zerver_defaultstream, which is a list of the default streams 2. zerver_stream, while is a list of all streams 3. added_channels, which is a dictionary to map from channel name to channel id, zulip stream_id 4. zerver_subscription, which is a list of the subscriptions 5. zerver_recipient, which is a list of the recipients 6. added_recipient, which is a dictionary to map from channel name to zulip recipient_id """ logging.info('######### IMPORTING CHANNELS STARTED #########\n') channels = get_data_file(slack_data_dir + '/channels.json') added_channels = {} added_recipient = {} zerver_stream = [] zerver_subscription = [] # type: List[ZerverFieldsT] zerver_recipient = [] zerver_defaultstream = [] stream_id_count = subscription_id_count = recipient_id_count = defaultstream_id = 0 for channel in channels: # slack_channel_id = channel['id'] # map Slack's topic and purpose content into Zulip's stream description. # WARN This mapping is lossy since the topic.creator, topic.last_set, # purpose.creator, purpose.last_set fields are not preserved. description = channel["purpose"]["value"] stream_id = stream_id_count recipient_id = recipient_id_count # construct the stream object and append it to zerver_stream stream = build_stream(float(channel["created"]), realm_id, channel["name"], description, stream_id, channel["is_archived"]) zerver_stream.append(stream) # construct defaultstream object # slack has the default channel 'general' and 'random' # where every user is subscribed default_channels = ['general', 'random'] # Slack specific if channel['name'] in default_channels: defaultstream = build_defaultstream(realm_id, stream_id, defaultstream_id) zerver_defaultstream.append(defaultstream) defaultstream_id += 1 added_channels[stream['name']] = (channel['id'], stream_id) recipient = build_recipient(stream_id, recipient_id, Recipient.STREAM) zerver_recipient.append(recipient) added_recipient[stream['name']] = recipient_id # TODO add recipients for private message and huddles # construct the subscription object and append it to zerver_subscription subscription_id_count = get_subscription(channel['members'], zerver_subscription, recipient_id, added_users, subscription_id_count) # TODO add zerver_subscription which correspond to # huddles type recipient # For huddles: # sub['recipient']=recipient['id'] where recipient['type_id']=added_users[member] stream_id_count += 1 recipient_id_count += 1 logging.info(u"{} -> created".format(channel['name'])) # TODO map Slack's pins to Zulip's stars # There is the security model that Slack's pins are known to the team owner # as evident from where it is stored at (channels) # "pins": [ # { # "id": "1444755381.000003", # "type": "C", # "user": "******", # "owner": "U061A5N1G", # "created": "1444755463" # } # ], for user in zerver_userprofile: # this maps the recipients and subscriptions # related to private messages recipient = build_recipient(user['id'], recipient_id_count, Recipient.PERSONAL) sub = build_subscription(recipient_id_count, user['id'], subscription_id_count) zerver_recipient.append(recipient) zerver_subscription.append(sub) subscription_id_count += 1 recipient_id_count += 1 logging.info('######### IMPORTING STREAMS FINISHED #########\n') return zerver_defaultstream, zerver_stream, added_channels, zerver_subscription, \ zerver_recipient, added_recipient
def channels_to_zerver_stream(slack_data_dir: str, realm_id: int, realm: Dict[str, Any], slack_user_id_to_zulip_user_id: SlackToZulipUserIDT, zerver_userprofile: List[ZerverFieldsT]) \ -> Tuple[Dict[str, List[ZerverFieldsT]], AddedChannelsT, AddedMPIMsT, DMMembersT, SlackToZulipRecipientT]: """ Returns: 1. realm, Converted Realm data 2. added_channels, which is a dictionary to map from channel name to channel id, zulip stream_id 3. added_mpims, which is a dictionary to map from MPIM(multiparty IM) name to MPIM id, zulip huddle_id 4. dm_members, which is a dictionary to map from DM id to tuple of DM participants. 5. slack_recipient_name_to_zulip_recipient_id, which is a dictionary to map from slack recipient name(channel names, mpim names, usernames etc) to zulip recipient_id """ logging.info('######### IMPORTING CHANNELS STARTED #########\n') added_channels = {} added_mpims = {} dm_members = {} slack_recipient_name_to_zulip_recipient_id = {} realm["zerver_stream"] = [] realm["zerver_huddle"] = [] realm["zerver_subscription"] = [] realm["zerver_recipient"] = [] realm["zerver_defaultstream"] = [] subscription_id_count = recipient_id_count = 0 stream_id_count = defaultstream_id = 0 huddle_id_count = 0 def process_channels(channels: List[Dict[str, Any]], invite_only: bool = False) -> None: nonlocal stream_id_count nonlocal recipient_id_count nonlocal defaultstream_id nonlocal subscription_id_count for channel in channels: # map Slack's topic and purpose content into Zulip's stream description. # WARN This mapping is lossy since the topic.creator, topic.last_set, # purpose.creator, purpose.last_set fields are not preserved. description = channel["purpose"]["value"] stream_id = stream_id_count recipient_id = recipient_id_count stream = build_stream(float(channel["created"]), realm_id, channel["name"], description, stream_id, channel["is_archived"], invite_only) realm["zerver_stream"].append(stream) slack_default_channels = ['general', 'random'] if channel['name'] in slack_default_channels: defaultstream = build_defaultstream(realm_id, stream_id, defaultstream_id) realm["zerver_defaultstream"].append(defaultstream) defaultstream_id += 1 added_channels[stream['name']] = (channel['id'], stream_id) recipient = build_recipient(stream_id, recipient_id, Recipient.STREAM) realm["zerver_recipient"].append(recipient) slack_recipient_name_to_zulip_recipient_id[ stream['name']] = recipient_id subscription_id_count = get_subscription( channel['members'], realm["zerver_subscription"], recipient_id, slack_user_id_to_zulip_user_id, subscription_id_count) stream_id_count += 1 recipient_id_count += 1 logging.info(u"{} -> created".format(channel['name'])) # TODO map Slack's pins to Zulip's stars # There is the security model that Slack's pins are known to the team owner # as evident from where it is stored at (channels) # "pins": [ # { # "id": "1444755381.000003", # "type": "C", # "user": "******", # "owner": "U061A5N1G", # "created": "1444755463" # } # ], public_channels = get_data_file(slack_data_dir + '/channels.json') process_channels(public_channels) try: private_channels = get_data_file(slack_data_dir + '/groups.json') except FileNotFoundError: private_channels = [] process_channels(private_channels, True) # mpim is the Slack equivalent of huddle. def process_mpims(mpims: List[Dict[str, Any]]) -> None: nonlocal huddle_id_count nonlocal recipient_id_count nonlocal subscription_id_count for mpim in mpims: huddle = build_huddle(huddle_id_count) realm["zerver_huddle"].append(huddle) added_mpims[mpim['name']] = (mpim['id'], huddle_id_count) recipient = build_recipient(huddle_id_count, recipient_id_count, Recipient.HUDDLE) realm["zerver_recipient"].append(recipient) slack_recipient_name_to_zulip_recipient_id[ mpim['name']] = recipient_id_count subscription_id_count = get_subscription( mpim['members'], realm["zerver_subscription"], recipient_id_count, slack_user_id_to_zulip_user_id, subscription_id_count) huddle_id_count += 1 recipient_id_count += 1 logging.info(u"{} -> created".format(mpim['name'])) try: mpims = get_data_file(slack_data_dir + '/mpims.json') except FileNotFoundError: mpims = [] process_mpims(mpims) 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) slack_recipient_name_to_zulip_recipient_id[ slack_user_id] = recipient_id_count sub = build_subscription(recipient_id_count, zulip_user_id, subscription_id_count) realm["zerver_recipient"].append(recipient) realm["zerver_subscription"].append(sub) recipient_id_count += 1 subscription_id_count += 1 def process_dms(dms: List[Dict[str, Any]]) -> None: for dm in dms: user_a = dm["members"][0] user_b = dm["members"][1] dm_members[dm["id"]] = (user_a, user_b) try: dms = get_data_file(slack_data_dir + '/dms.json') except FileNotFoundError: dms = [] process_dms(dms) logging.info('######### IMPORTING STREAMS FINISHED #########\n') return realm, added_channels, added_mpims, dm_members, slack_recipient_name_to_zulip_recipient_id
def channels_to_zerver_stream(slack_data_dir: str, realm_id: int, added_users: AddedUsersT, zerver_userprofile: List[ZerverFieldsT]) -> Tuple[List[ZerverFieldsT], List[ZerverFieldsT], List[ZerverFieldsT], AddedChannelsT, AddedMPIMsT, List[ZerverFieldsT], List[ZerverFieldsT], AddedRecipientsT]: """ Returns: 1. zerver_defaultstream, which is a list of the default streams 2. zerver_stream, while is a list of all streams 3. zerver_huddle, while is a list of all huddles 3. added_channels, which is a dictionary to map from channel name to channel id, zulip stream_id 4. added_mpims, which is a dictionary to map from MPIM(multiparty IM) name to MPIM id, zulip huddle_id 5. zerver_subscription, which is a list of the subscriptions 6. zerver_recipient, which is a list of the recipients 7. added_recipient, which is a dictionary to map from channel name to zulip recipient_id """ logging.info('######### IMPORTING CHANNELS STARTED #########\n') added_channels = {} added_mpims = {} added_recipient = {} zerver_stream = [] zerver_huddle = [] zerver_subscription = [] # type: List[ZerverFieldsT] zerver_recipient = [] zerver_defaultstream = [] subscription_id_count = recipient_id_count = 0 stream_id_count = defaultstream_id = 0 huddle_id_count = 0 def process_channels(channels: List[Dict[str, Any]], invite_only: bool=False) -> None: nonlocal stream_id_count nonlocal recipient_id_count nonlocal defaultstream_id nonlocal subscription_id_count for channel in channels: # slack_channel_id = channel['id'] # map Slack's topic and purpose content into Zulip's stream description. # WARN This mapping is lossy since the topic.creator, topic.last_set, # purpose.creator, purpose.last_set fields are not preserved. description = channel["purpose"]["value"] stream_id = stream_id_count recipient_id = recipient_id_count # construct the stream object and append it to zerver_stream stream = build_stream(float(channel["created"]), realm_id, channel["name"], description, stream_id, channel["is_archived"], invite_only) zerver_stream.append(stream) # construct defaultstream object # slack has the default channel 'general' and 'random' # where every user is subscribed default_channels = ['general', 'random'] # Slack specific if channel['name'] in default_channels: defaultstream = build_defaultstream(realm_id, stream_id, defaultstream_id) zerver_defaultstream.append(defaultstream) defaultstream_id += 1 added_channels[stream['name']] = (channel['id'], stream_id) recipient = build_recipient(stream_id, recipient_id, Recipient.STREAM) zerver_recipient.append(recipient) added_recipient[stream['name']] = recipient_id # TODO add recipients for private message and huddles # construct the subscription object and append it to zerver_subscription subscription_id_count = get_subscription(channel['members'], zerver_subscription, recipient_id, added_users, subscription_id_count) # TODO add zerver_subscription which correspond to # huddles type recipient # For huddles: # sub['recipient']=recipient['id'] where recipient['type_id']=added_users[member] stream_id_count += 1 recipient_id_count += 1 logging.info(u"{} -> created".format(channel['name'])) # TODO map Slack's pins to Zulip's stars # There is the security model that Slack's pins are known to the team owner # as evident from where it is stored at (channels) # "pins": [ # { # "id": "1444755381.000003", # "type": "C", # "user": "******", # "owner": "U061A5N1G", # "created": "1444755463" # } # ], public_channels = get_data_file(slack_data_dir + '/channels.json') process_channels(public_channels) try: private_channels = get_data_file(slack_data_dir + '/groups.json') except FileNotFoundError: private_channels = [] process_channels(private_channels, True) # mpim is the Slack equivalent of huddle. def process_mpims(mpims: List[Dict[str, Any]]) -> None: nonlocal huddle_id_count nonlocal recipient_id_count nonlocal subscription_id_count for mpim in mpims: huddle = build_huddle(huddle_id_count) zerver_huddle.append(huddle) added_mpims[mpim['name']] = (mpim['id'], huddle_id_count) recipient = build_recipient(huddle_id_count, recipient_id_count, Recipient.HUDDLE) zerver_recipient.append(recipient) added_recipient[mpim['name']] = recipient_id_count subscription_id_count = get_subscription(mpim['members'], zerver_subscription, recipient_id_count, added_users, subscription_id_count) huddle_id_count += 1 recipient_id_count += 1 logging.info(u"{} -> created".format(mpim['name'])) try: mpims = get_data_file(slack_data_dir + '/mpims.json') except FileNotFoundError: mpims = [] process_mpims(mpims) for user in zerver_userprofile: # this maps the recipients and subscriptions # related to private messages recipient = build_recipient(user['id'], recipient_id_count, Recipient.PERSONAL) sub = build_subscription(recipient_id_count, user['id'], subscription_id_count) zerver_recipient.append(recipient) zerver_subscription.append(sub) subscription_id_count += 1 recipient_id_count += 1 logging.info('######### IMPORTING STREAMS FINISHED #########\n') return zerver_defaultstream, zerver_stream, zerver_huddle, added_channels, added_mpims, \ zerver_subscription, zerver_recipient, added_recipient