diff --git a/confirmation/migrations/0003_emailchangeconfirmation.py b/confirmation/migrations/0003_emailchangeconfirmation.py new file mode 100644 index 00000000000000..cd7c126ab9d97f --- /dev/null +++ b/confirmation/migrations/0003_emailchangeconfirmation.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.4 on 2017-01-17 09:16 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('confirmation', '0002_realmcreationkey'), + ] + + operations = [ + migrations.CreateModel( + name='EmailChangeConfirmation', + fields=[ + ], + options={ + 'proxy': True, + }, + bases=('confirmation.confirmation',), + ), + ] diff --git a/confirmation/models.py b/confirmation/models.py index 1a304cae377cf7..781e8ab7220a79 100644 --- a/confirmation/models.py +++ b/confirmation/models.py @@ -19,7 +19,7 @@ from confirmation.util import get_status_field from zerver.lib.utils import generate_random_token -from zerver.models import PreregistrationUser +from zerver.models import PreregistrationUser, EmailChangeStatus from typing import Optional, Union, Any, Text B16_RE = re.compile('^[a-f0-9]{40}$') @@ -59,7 +59,7 @@ def generate_realm_creation_url(): class ConfirmationManager(models.Manager): def confirm(self, confirmation_key): - # type: (str) -> Union[bool, PreregistrationUser] + # type: (str) -> Union[bool, PreregistrationUser, EmailChangeStatus] if B16_RE.search(confirmation_key): try: confirmation = self.get(confirmation_key=confirmation_key) @@ -139,6 +139,19 @@ def send_confirmation(self, obj, email_address, additional_context=None, send_mail(subject, body, settings.DEFAULT_FROM_EMAIL, [email_address], html_message=html_content) return self.create(content_object=obj, date_sent=now(), confirmation_key=confirmation_key) +class EmailChangeConfirmationManager(ConfirmationManager): + def get_activation_url(self, key, host=None): + # type: (Text, Optional[str]) -> Text + if host is None: + host = settings.EXTERNAL_HOST + return u'%s%s%s' % (settings.EXTERNAL_URI_SCHEME, + host, + reverse('zerver.views.user_settings.confirm_email_change', + kwargs={'confirmation_key': key})) + + def get_link_validity_in_days(self): + # type: () -> int + return getattr(settings, 'EMAIL_CHANGE_CONFIRMATION_DAYS', 1) class Confirmation(models.Model): content_type = models.ForeignKey(ContentType) @@ -157,6 +170,12 @@ def __unicode__(self): # type: () -> Text return _('confirmation email for %s') % (self.content_object,) +class EmailChangeConfirmation(Confirmation): + class Meta(object): + proxy = True + + objects = EmailChangeConfirmationManager() + class RealmCreationKey(models.Model): creation_key = models.CharField(_('activation key'), max_length=40) date_created = models.DateTimeField(_('created'), default=now) diff --git a/static/js/settings.js b/static/js/settings.js index e91a073696b8ba..740c26d3587965 100644 --- a/static/js/settings.js +++ b/static/js/settings.js @@ -517,12 +517,44 @@ function _setup_page() { }); }); + $('#change_email_button').on('click', function (e) { + e.preventDefault(); + e.stopPropagation(); + $('#change_email_modal').modal('hide'); + + var data = {}; + data.email = $('.email_change_container').find("input[name='email']").val(); + + channel.patch({ + url: '/json/settings/change', + data: data, + success: function (data) { + if ('account.email' in data) { + settings_change_success(data['account.email']); + } else { + settings_change_error(i18n.t("Error changing settings: No new data supplied.")); + } + }, + error: function (xhr) { + settings_change_error("Error changing settings", xhr); + }, + }); + }); + $('#default_language').on('click', function (e) { e.preventDefault(); e.stopPropagation(); $('#default_language_modal').show().attr('aria-hidden', false); }); + $('#change_email').on('click', function (e) { + e.preventDefault(); + e.stopPropagation(); + $('#change_email_modal').modal('show'); + var email = $('#email_value').text(); + $('.email_change_container').find("input[name='email']").val(email); + }); + $("#user_deactivate_account_button").on('click', function (e) { e.preventDefault(); e.stopPropagation(); diff --git a/static/templates/settings/account-settings.handlebars b/static/templates/settings/account-settings.handlebars index da6abc9a4d07a2..493ba73a356cda 100644 --- a/static/templates/settings/account-settings.handlebars +++ b/static/templates/settings/account-settings.handlebars @@ -4,6 +4,31 @@ {{t "Your account" }}