mirror of
https://github.com/zulip/zulip.git
synced 2025-11-13 02:17:19 +00:00
marketing_emails: Ask for user's consent at sign-up.
This commit is contained in:
@@ -920,6 +920,11 @@ button#register_auth_button_gitlab {
|
|||||||
&.inline-block {
|
&.inline-block {
|
||||||
margin-top: -1px;
|
margin-top: -1px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.marketing_emails_checkbox {
|
||||||
|
text-indent: -24px;
|
||||||
|
margin-left: 24px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.radio {
|
&.radio {
|
||||||
|
|||||||
@@ -249,6 +249,14 @@ Form is validated both client-side using jquery-validate (see signup.js) and ser
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
<div class="input-group">
|
||||||
|
<label for="id_enable_marketing_emails" class="inline-block checkbox marketing_emails_checkbox">
|
||||||
|
<input id="id_enable_marketing_emails" type="checkbox" name="enable_marketing_emails"
|
||||||
|
checked="checked" />
|
||||||
|
<span></span>
|
||||||
|
{% trans %}Send me occasional marketing emails about Zulip (a few times a year).{% endtrans %}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
<div class="register-button-box">
|
<div class="register-button-box">
|
||||||
<button class="register-button" type="submit">
|
<button class="register-button" type="submit">
|
||||||
<span>{{ _('Sign up') }}</span>
|
<span>{{ _('Sign up') }}</span>
|
||||||
|
|||||||
@@ -116,6 +116,7 @@ class RegistrationForm(forms.Form):
|
|||||||
realm_subdomain = forms.CharField(max_length=Realm.MAX_REALM_SUBDOMAIN_LENGTH, required=False)
|
realm_subdomain = forms.CharField(max_length=Realm.MAX_REALM_SUBDOMAIN_LENGTH, required=False)
|
||||||
realm_type = forms.IntegerField(required=False)
|
realm_type = forms.IntegerField(required=False)
|
||||||
is_demo_organization = forms.BooleanField(required=False)
|
is_demo_organization = forms.BooleanField(required=False)
|
||||||
|
enable_marketing_emails = forms.BooleanField(required=False)
|
||||||
|
|
||||||
def __init__(self, *args: Any, **kwargs: Any) -> None:
|
def __init__(self, *args: Any, **kwargs: Any) -> None:
|
||||||
# Since the superclass doesn't except random extra kwargs, we
|
# Since the superclass doesn't except random extra kwargs, we
|
||||||
|
|||||||
@@ -648,6 +648,7 @@ def do_create_user(
|
|||||||
realm_creation: bool = False,
|
realm_creation: bool = False,
|
||||||
*,
|
*,
|
||||||
acting_user: Optional[UserProfile],
|
acting_user: Optional[UserProfile],
|
||||||
|
enable_marketing_emails: bool = True,
|
||||||
) -> UserProfile:
|
) -> UserProfile:
|
||||||
|
|
||||||
user_profile = create_user(
|
user_profile = create_user(
|
||||||
@@ -665,6 +666,7 @@ def do_create_user(
|
|||||||
default_events_register_stream=default_events_register_stream,
|
default_events_register_stream=default_events_register_stream,
|
||||||
default_all_public_streams=default_all_public_streams,
|
default_all_public_streams=default_all_public_streams,
|
||||||
source_profile=source_profile,
|
source_profile=source_profile,
|
||||||
|
enable_marketing_emails=enable_marketing_emails,
|
||||||
)
|
)
|
||||||
|
|
||||||
event_time = user_profile.date_joined
|
event_time = user_profile.date_joined
|
||||||
|
|||||||
@@ -128,6 +128,7 @@ def create_user(
|
|||||||
default_all_public_streams: Optional[bool] = None,
|
default_all_public_streams: Optional[bool] = None,
|
||||||
source_profile: Optional[UserProfile] = None,
|
source_profile: Optional[UserProfile] = None,
|
||||||
force_id: Optional[int] = None,
|
force_id: Optional[int] = None,
|
||||||
|
enable_marketing_emails: bool = True,
|
||||||
) -> UserProfile:
|
) -> UserProfile:
|
||||||
user_profile = create_user_profile(
|
user_profile = create_user_profile(
|
||||||
realm,
|
realm,
|
||||||
@@ -146,6 +147,7 @@ def create_user(
|
|||||||
user_profile.timezone = timezone
|
user_profile.timezone = timezone
|
||||||
user_profile.default_sending_stream = default_sending_stream
|
user_profile.default_sending_stream = default_sending_stream
|
||||||
user_profile.default_events_register_stream = default_events_register_stream
|
user_profile.default_events_register_stream = default_events_register_stream
|
||||||
|
user_profile.enable_marketing_emails = enable_marketing_emails
|
||||||
if role is not None:
|
if role is not None:
|
||||||
user_profile.role = role
|
user_profile.role = role
|
||||||
# Allow the ORM default to be used if not provided
|
# Allow the ORM default to be used if not provided
|
||||||
|
|||||||
@@ -627,6 +627,7 @@ Output:
|
|||||||
source_realm_id: str = "",
|
source_realm_id: str = "",
|
||||||
key: Optional[str] = None,
|
key: Optional[str] = None,
|
||||||
realm_type: Optional[int] = Realm.ORG_TYPES["business"]["id"],
|
realm_type: Optional[int] = Realm.ORG_TYPES["business"]["id"],
|
||||||
|
enable_marketing_emails: Optional[bool] = True,
|
||||||
**kwargs: Any,
|
**kwargs: Any,
|
||||||
) -> HttpResponse:
|
) -> HttpResponse:
|
||||||
"""
|
"""
|
||||||
@@ -650,6 +651,7 @@ Output:
|
|||||||
"from_confirmation": from_confirmation,
|
"from_confirmation": from_confirmation,
|
||||||
"default_stream_group": default_stream_groups,
|
"default_stream_group": default_stream_groups,
|
||||||
"source_realm_id": source_realm_id,
|
"source_realm_id": source_realm_id,
|
||||||
|
"enable_marketing_emails": enable_marketing_emails,
|
||||||
}
|
}
|
||||||
if password is not None:
|
if password is not None:
|
||||||
payload["password"] = password
|
payload["password"] = password
|
||||||
|
|||||||
@@ -3074,6 +3074,92 @@ class RealmCreationTest(ZulipTestCase):
|
|||||||
self.assertEqual(realm.name, realm_name)
|
self.assertEqual(realm.name, realm_name)
|
||||||
self.assertEqual(realm.subdomain, string_id)
|
self.assertEqual(realm.subdomain, string_id)
|
||||||
|
|
||||||
|
@override_settings(OPEN_REALM_CREATION=True)
|
||||||
|
def test_create_realm_with_marketing_emails_enabled(self) -> None:
|
||||||
|
password = "test"
|
||||||
|
string_id = "zuliptest"
|
||||||
|
email = "user1@test.com"
|
||||||
|
realm_name = "Test"
|
||||||
|
|
||||||
|
# Make sure the realm does not exist
|
||||||
|
with self.assertRaises(Realm.DoesNotExist):
|
||||||
|
get_realm(string_id)
|
||||||
|
|
||||||
|
# Create new realm with the email
|
||||||
|
result = self.client_post("/new/", {"email": email})
|
||||||
|
self.assertEqual(result.status_code, 302)
|
||||||
|
self.assertTrue(result["Location"].endswith(f"/accounts/new/send_confirm/{email}"))
|
||||||
|
result = self.client_get(result["Location"])
|
||||||
|
self.assert_in_response("Check your email so we can get started.", result)
|
||||||
|
|
||||||
|
# Visit the confirmation link.
|
||||||
|
confirmation_url = self.get_confirmation_url_from_outbox(email)
|
||||||
|
result = self.client_get(confirmation_url)
|
||||||
|
self.assertEqual(result.status_code, 200)
|
||||||
|
|
||||||
|
result = self.submit_reg_form_for_user(
|
||||||
|
email,
|
||||||
|
password,
|
||||||
|
realm_subdomain=string_id,
|
||||||
|
realm_name=realm_name,
|
||||||
|
enable_marketing_emails=True,
|
||||||
|
)
|
||||||
|
self.assertEqual(result.status_code, 302)
|
||||||
|
|
||||||
|
result = self.client_get(result.url, subdomain=string_id)
|
||||||
|
self.assertEqual(result.status_code, 302)
|
||||||
|
self.assertEqual(result.url, "http://zuliptest.testserver")
|
||||||
|
|
||||||
|
# Make sure the realm is created
|
||||||
|
realm = get_realm(string_id)
|
||||||
|
self.assertEqual(realm.string_id, string_id)
|
||||||
|
user = get_user(email, realm)
|
||||||
|
self.assertEqual(user.realm, realm)
|
||||||
|
self.assertTrue(user.enable_marketing_emails)
|
||||||
|
|
||||||
|
@override_settings(OPEN_REALM_CREATION=True)
|
||||||
|
def test_create_realm_with_marketing_emails_disabled(self) -> None:
|
||||||
|
password = "test"
|
||||||
|
string_id = "zuliptest"
|
||||||
|
email = "user1@test.com"
|
||||||
|
realm_name = "Test"
|
||||||
|
|
||||||
|
# Make sure the realm does not exist
|
||||||
|
with self.assertRaises(Realm.DoesNotExist):
|
||||||
|
get_realm(string_id)
|
||||||
|
|
||||||
|
# Create new realm with the email
|
||||||
|
result = self.client_post("/new/", {"email": email})
|
||||||
|
self.assertEqual(result.status_code, 302)
|
||||||
|
self.assertTrue(result["Location"].endswith(f"/accounts/new/send_confirm/{email}"))
|
||||||
|
result = self.client_get(result["Location"])
|
||||||
|
self.assert_in_response("Check your email so we can get started.", result)
|
||||||
|
|
||||||
|
# Visit the confirmation link.
|
||||||
|
confirmation_url = self.get_confirmation_url_from_outbox(email)
|
||||||
|
result = self.client_get(confirmation_url)
|
||||||
|
self.assertEqual(result.status_code, 200)
|
||||||
|
|
||||||
|
result = self.submit_reg_form_for_user(
|
||||||
|
email,
|
||||||
|
password,
|
||||||
|
realm_subdomain=string_id,
|
||||||
|
realm_name=realm_name,
|
||||||
|
enable_marketing_emails=False,
|
||||||
|
)
|
||||||
|
self.assertEqual(result.status_code, 302)
|
||||||
|
|
||||||
|
result = self.client_get(result.url, subdomain=string_id)
|
||||||
|
self.assertEqual(result.status_code, 302)
|
||||||
|
self.assertEqual(result.url, "http://zuliptest.testserver")
|
||||||
|
|
||||||
|
# Make sure the realm is created
|
||||||
|
realm = get_realm(string_id)
|
||||||
|
self.assertEqual(realm.string_id, string_id)
|
||||||
|
user = get_user(email, realm)
|
||||||
|
self.assertEqual(user.realm, realm)
|
||||||
|
self.assertFalse(user.enable_marketing_emails)
|
||||||
|
|
||||||
@override_settings(OPEN_REALM_CREATION=True, FREE_TRIAL_DAYS=30)
|
@override_settings(OPEN_REALM_CREATION=True, FREE_TRIAL_DAYS=30)
|
||||||
def test_create_realm_during_free_trial(self) -> None:
|
def test_create_realm_during_free_trial(self) -> None:
|
||||||
password = "test"
|
password = "test"
|
||||||
|
|||||||
@@ -332,6 +332,7 @@ def accounts_register(
|
|||||||
assert realm is not None
|
assert realm is not None
|
||||||
|
|
||||||
full_name = form.cleaned_data["full_name"]
|
full_name = form.cleaned_data["full_name"]
|
||||||
|
enable_marketing_emails = form.cleaned_data["enable_marketing_emails"]
|
||||||
default_stream_group_names = request.POST.getlist("default_stream_group")
|
default_stream_group_names = request.POST.getlist("default_stream_group")
|
||||||
default_stream_groups = lookup_default_stream_groups(default_stream_group_names, realm)
|
default_stream_groups = lookup_default_stream_groups(default_stream_group_names, realm)
|
||||||
|
|
||||||
@@ -437,6 +438,7 @@ def accounts_register(
|
|||||||
source_profile=source_profile,
|
source_profile=source_profile,
|
||||||
realm_creation=realm_creation,
|
realm_creation=realm_creation,
|
||||||
acting_user=None,
|
acting_user=None,
|
||||||
|
enable_marketing_emails=enable_marketing_emails,
|
||||||
)
|
)
|
||||||
|
|
||||||
if realm_creation:
|
if realm_creation:
|
||||||
|
|||||||
Reference in New Issue
Block a user