signup: Create get_accounts_for_email function.

This commit is contained in:
Vishnu Ks
2018-06-19 08:55:56 +00:00
committed by Tim Abbott
parent 8e032376f9
commit 403f254557
5 changed files with 47 additions and 27 deletions

View File

@@ -102,15 +102,15 @@ Form is validated both client-side using jquery-validate (see signup.js) and ser
<label for="id_email" class="inline-block label-title">{{ _('Email') }}</label> <label for="id_email" class="inline-block label-title">{{ _('Email') }}</label>
</div> </div>
{% if membership_realms %} {% if accounts %}
<div class="input-box"> <div class="input-box">
<label for="source_realm" class="inline-block">{{ _('Import settings from an existing Zulip account') }}</label> <label for="source_realm" class="inline-block">{{ _('Import settings from an existing Zulip account') }}</label>
</div> </div>
<div id="source_realm_select_section" class="input-group m-10 inline-block"> <div id="source_realm_select_section" class="input-group m-10 inline-block">
<select class="select" name="source_realm" id="source_realm_select"> <select class="select" name="source_realm" id="source_realm_select">
<option value="on" {% if ("source_realm" in form.data and form.data["source_realm"] == "on") or "source_realm" not in form.data %} selected {% endif %}>None</option> <option value="on" {% if ("source_realm" in form.data and form.data["source_realm"] == "on") or "source_realm" not in form.data %} selected {% endif %}>None</option>
{% for membership_realm in membership_realms %} {% for account in accounts %}
<option value="{{ membership_realm.string_id }}" {% if "source_realm" in form.data and membership_realm.string_id == form.data["source_realm"] %} selected {% endif %}>{{ membership_realm.name }}</option> <option value="{{ account.string_id }}" data-full-name="{{account.full_name}}" data-avatar="{{account.avatar}}" {% if "source_realm" in form.data and account.string_id == form.data["source_realm"] %} selected {% endif %}>{{ account.realm_name }}</option>
{% endfor %} {% endfor %}
</select> </select>
</div> </div>

View File

@@ -2,10 +2,12 @@ from typing import Dict, List, Optional
from django.db.models.query import QuerySet from django.db.models.query import QuerySet
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from django.conf import settings
from zerver.lib.cache import generic_bulk_cached_fetch, user_profile_cache_key_id, \ from zerver.lib.cache import generic_bulk_cached_fetch, user_profile_cache_key_id, \
user_profile_by_id_cache_key user_profile_by_id_cache_key
from zerver.lib.request import JsonableError from zerver.lib.request import JsonableError
from zerver.lib.avatar import avatar_url
from zerver.models import UserProfile, Service, Realm, \ from zerver.models import UserProfile, Service, Realm, \
get_user_profile_by_id, query_for_ids, get_user_profile_by_id_in_realm get_user_profile_by_id, query_for_ids, get_user_profile_by_id_in_realm
@@ -164,3 +166,16 @@ def access_user_by_id(user_profile: UserProfile, user_id: int,
if not user_profile.can_admin_user(target): if not user_profile.can_admin_user(target):
raise JsonableError(_("Insufficient permission")) raise JsonableError(_("Insufficient permission"))
return target return target
def get_accounts_for_email(email: str) -> List[Dict[str, Optional[str]]]:
if settings.PRODUCTION: # nocoverage
return []
profiles = UserProfile.objects.select_related('realm').filter(email__iexact=email.strip(),
is_active=True,
is_bot=False,
realm__deactivated=False)
return [{"realm_name": profile.realm.name,
"string_id": profile.realm.string_id,
"full_name": profile.full_name,
"avatar": avatar_url(profile)}
for profile in profiles]

View File

@@ -1589,12 +1589,6 @@ def active_non_guest_user_ids(realm_id: int) -> List[int]:
).values_list('id', flat=True) ).values_list('id', flat=True)
return list(query) return list(query)
def get_membership_realms(email: str) -> List[Realm]:
if settings.PRODUCTION: # nocoverage
return []
profiles = UserProfile.objects.select_related('realm').filter(email__iexact=email.strip())
return [profile.realm for profile in profiles]
def get_source_profile(email: str, string_id: str) -> Optional[UserProfile]: def get_source_profile(email: str, string_id: str) -> Optional[UserProfile]:
realm = get_realm(string_id) realm = get_realm(string_id)

View File

@@ -20,8 +20,8 @@ from zerver.lib.test_runner import slow
from zerver.models import UserProfile, Recipient, \ from zerver.models import UserProfile, Recipient, \
Realm, RealmDomain, UserActivity, UserHotspot, \ Realm, RealmDomain, UserActivity, UserHotspot, \
get_user, get_realm, get_client, get_stream, get_stream_recipient, \ get_user, get_realm, get_client, get_stream, get_stream_recipient, \
get_membership_realms, get_source_profile, \ get_source_profile, Message, get_context_for_message, \
Message, get_context_for_message, ScheduledEmail, check_valid_user_ids ScheduledEmail, check_valid_user_ids
from zerver.lib.avatar import avatar_url from zerver.lib.avatar import avatar_url
from zerver.lib.email_mirror import create_missed_message_address from zerver.lib.email_mirror import create_missed_message_address
@@ -38,7 +38,8 @@ from zerver.lib.actions import (
from zerver.lib.create_user import copy_user_settings from zerver.lib.create_user import copy_user_settings
from zerver.lib.topic_mutes import add_topic_mute from zerver.lib.topic_mutes import add_topic_mute
from zerver.lib.stream_topic import StreamTopicTarget from zerver.lib.stream_topic import StreamTopicTarget
from zerver.lib.users import user_ids_to_users, access_user_by_id from zerver.lib.users import user_ids_to_users, access_user_by_id, \
get_accounts_for_email
from django.conf import settings from django.conf import settings
@@ -396,26 +397,35 @@ class UserProfileTest(ZulipTestCase):
self.assertEqual(result[cordelia].email, cordelia) self.assertEqual(result[cordelia].email, cordelia)
self.assertEqual(result[webhook_bot].email, webhook_bot) self.assertEqual(result[webhook_bot].email, webhook_bot)
def test_get_membership_realms(self) -> None: def test_get_accounts_for_email(self) -> None:
zulip_realm = get_realm("zulip") def check_account_present_in_accounts(user: UserProfile, accounts: List[Dict[str, Optional[str]]]) -> None:
for account in accounts:
realm = user.realm
if account["avatar"] == avatar_url(user) and account["full_name"] == user.full_name \
and account["realm_name"] == realm.name and account["string_id"] == realm.string_id:
return
raise AssertionError("Account not found")
lear_realm = get_realm("lear") lear_realm = get_realm("lear")
cordelia_in_zulip = self.example_user("cordelia")
cordelia_in_lear = get_user("cordelia@zulip.com", lear_realm)
email = "cordelia@zulip.com" email = "cordelia@zulip.com"
realms = get_membership_realms(email) accounts = get_accounts_for_email(email)
self.assert_length(realms, 2) self.assert_length(accounts, 2)
self.assertIn(zulip_realm, realms) check_account_present_in_accounts(cordelia_in_zulip, accounts)
self.assertIn(lear_realm, realms) check_account_present_in_accounts(cordelia_in_lear, accounts)
email = "CORDelia@zulip.com" email = "CORDelia@zulip.com"
realms = get_membership_realms(email) accounts = get_accounts_for_email(email)
self.assert_length(realms, 2) self.assert_length(accounts, 2)
self.assertIn(zulip_realm, realms) check_account_present_in_accounts(cordelia_in_zulip, accounts)
self.assertIn(lear_realm, realms) check_account_present_in_accounts(cordelia_in_lear, accounts)
email = "IAGO@ZULIP.COM" email = "IAGO@ZULIP.COM"
realms = get_membership_realms(email) accounts = get_accounts_for_email(email)
self.assert_length(realms, 1) self.assert_length(accounts, 1)
self.assertIn(zulip_realm, realms) check_account_present_in_accounts(self.example_user("iago"), accounts)
def test_get_source_profile(self) -> None: def test_get_source_profile(self) -> None:
iago = get_source_profile("iago@zulip.com", "zulip") iago = get_source_profile("iago@zulip.com", "zulip")

View File

@@ -15,7 +15,7 @@ from zerver.context_processors import get_realm_from_request
from zerver.models import UserProfile, Realm, Stream, MultiuseInvite, \ from zerver.models import UserProfile, Realm, Stream, MultiuseInvite, \
name_changes_disabled, email_to_username, email_allowed_for_realm, \ name_changes_disabled, email_to_username, email_allowed_for_realm, \
get_realm, get_user, get_default_stream_groups, DisposableEmailError, \ get_realm, get_user, get_default_stream_groups, DisposableEmailError, \
DomainNotAllowedForRealmError, get_membership_realms, get_source_profile DomainNotAllowedForRealmError, get_source_profile
from zerver.lib.send_email import send_email, FromAddress from zerver.lib.send_email import send_email, FromAddress
from zerver.lib.events import do_events_register from zerver.lib.events import do_events_register
from zerver.lib.actions import do_change_password, do_change_full_name, do_change_is_admin, \ from zerver.lib.actions import do_change_password, do_change_full_name, do_change_is_admin, \
@@ -32,6 +32,7 @@ from zerver.lib.onboarding import setup_initial_streams, \
from zerver.lib.response import json_success from zerver.lib.response import json_success
from zerver.lib.subdomains import get_subdomain, is_root_domain_available from zerver.lib.subdomains import get_subdomain, is_root_domain_available
from zerver.lib.timezone import get_all_timezones from zerver.lib.timezone import get_all_timezones
from zerver.lib.users import get_accounts_for_email
from zerver.views.auth import create_preregistration_user, \ from zerver.views.auth import create_preregistration_user, \
redirect_and_log_into_subdomain, \ redirect_and_log_into_subdomain, \
redirect_to_deactivation_notice redirect_to_deactivation_notice
@@ -320,7 +321,7 @@ def accounts_register(request: HttpRequest) -> HttpResponse:
'password_auth_enabled': password_auth_enabled(realm), 'password_auth_enabled': password_auth_enabled(realm),
'root_domain_available': is_root_domain_available(), 'root_domain_available': is_root_domain_available(),
'default_stream_groups': get_default_stream_groups(realm), 'default_stream_groups': get_default_stream_groups(realm),
'membership_realms': get_membership_realms(email), 'accounts': get_accounts_for_email(email),
'MAX_REALM_NAME_LENGTH': str(Realm.MAX_REALM_NAME_LENGTH), 'MAX_REALM_NAME_LENGTH': str(Realm.MAX_REALM_NAME_LENGTH),
'MAX_NAME_LENGTH': str(UserProfile.MAX_NAME_LENGTH), 'MAX_NAME_LENGTH': str(UserProfile.MAX_NAME_LENGTH),
'MAX_PASSWORD_LENGTH': str(form.MAX_PASSWORD_LENGTH), 'MAX_PASSWORD_LENGTH': str(form.MAX_PASSWORD_LENGTH),