import: Merge duplicate slack email addresses.

It is possible to have multiple users with the same email address --
for instance, when two users are guests in shared channels via two
different other Slack instances.

Combine those Slack user-ids into one Zulip user, by their user-id;
otherwise, we run into problems during import due to duplicate keys.

(cherry picked from commit 937e41bac8)
This commit is contained in:
Alex Vandiver 2024-01-17 20:15:40 +00:00 committed by Tim Abbott
parent 4d465cb698
commit eac2fe6b81
1 changed files with 16 additions and 0 deletions

View File

@ -277,6 +277,7 @@ def users_to_zerver_userprofile(
primary_owner_id = user_id_count
user_id_count += 1
found_emails: Dict[str, int] = {}
for user in users:
slack_user_id = user["id"]
@ -286,6 +287,12 @@ def users_to_zerver_userprofile(
user_id = user_id_count
email = get_user_email(user, domain_name)
if email.lower() in found_emails:
slack_user_id_to_zulip_user_id[slack_user_id] = found_emails[email.lower()]
logging.info("%s: %s MERGED", slack_user_id, email)
continue
found_emails[email.lower()] = user_id
# ref: https://zulip.com/help/change-your-profile-picture
avatar_url = build_avatar_url(
slack_user_id, user["team_id"], user["profile"]["avatar_hash"]
@ -625,9 +632,18 @@ def channels_to_zerver_stream(
mpims = []
process_mpims(mpims)
# This may have duplicated zulip user_ids, since we merge multiple
# Slack same-email shared-channel users into one Zulip dummy user
zulip_user_to_recipient: Dict[int, int] = {}
for slack_user_id, zulip_user_id in slack_user_id_to_zulip_user_id.items():
if zulip_user_id in zulip_user_to_recipient:
slack_recipient_name_to_zulip_recipient_id[slack_user_id] = zulip_user_to_recipient[
zulip_user_id
]
continue
recipient = build_recipient(zulip_user_id, recipient_id_count, Recipient.PERSONAL)
slack_recipient_name_to_zulip_recipient_id[slack_user_id] = recipient_id_count
zulip_user_to_recipient[zulip_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)