Delete ENABLE_NEW_DASHBOARD code.
This commit is contained in:
@@ -112,7 +112,6 @@ AUTH_EMAIL_OPT_IN_KEY = 'email_opt_in'
|
|||||||
|
|
||||||
AUTH_ENTRY_DASHBOARD = 'dashboard'
|
AUTH_ENTRY_DASHBOARD = 'dashboard'
|
||||||
AUTH_ENTRY_LOGIN = 'login'
|
AUTH_ENTRY_LOGIN = 'login'
|
||||||
AUTH_ENTRY_PROFILE = 'profile'
|
|
||||||
AUTH_ENTRY_REGISTER = 'register'
|
AUTH_ENTRY_REGISTER = 'register'
|
||||||
|
|
||||||
# This is left-over from an A/B test
|
# This is left-over from an A/B test
|
||||||
@@ -143,16 +142,11 @@ AUTH_DISPATCH_URLS = {
|
|||||||
AUTH_ENTRY_LOGIN_2: '/account/login/',
|
AUTH_ENTRY_LOGIN_2: '/account/login/',
|
||||||
AUTH_ENTRY_REGISTER_2: '/account/register/',
|
AUTH_ENTRY_REGISTER_2: '/account/register/',
|
||||||
|
|
||||||
# If linking/unlinking an account from the new student profile
|
|
||||||
# page, redirect to the profile page. Only used if
|
|
||||||
# `FEATURES['ENABLE_NEW_DASHBOARD']` is true.
|
|
||||||
AUTH_ENTRY_PROFILE: '/profile/',
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_AUTH_ENTRY_CHOICES = frozenset([
|
_AUTH_ENTRY_CHOICES = frozenset([
|
||||||
AUTH_ENTRY_DASHBOARD,
|
AUTH_ENTRY_DASHBOARD,
|
||||||
AUTH_ENTRY_LOGIN,
|
AUTH_ENTRY_LOGIN,
|
||||||
AUTH_ENTRY_PROFILE,
|
|
||||||
AUTH_ENTRY_REGISTER,
|
AUTH_ENTRY_REGISTER,
|
||||||
|
|
||||||
# This is left-over from an A/B test
|
# This is left-over from an A/B test
|
||||||
@@ -452,8 +446,6 @@ def parse_query_params(strategy, response, *args, **kwargs):
|
|||||||
'is_login': auth_entry in [AUTH_ENTRY_LOGIN, AUTH_ENTRY_LOGIN_2],
|
'is_login': auth_entry in [AUTH_ENTRY_LOGIN, AUTH_ENTRY_LOGIN_2],
|
||||||
# Whether the auth pipeline entered from /register.
|
# Whether the auth pipeline entered from /register.
|
||||||
'is_register': auth_entry in [AUTH_ENTRY_REGISTER, AUTH_ENTRY_REGISTER_2],
|
'is_register': auth_entry in [AUTH_ENTRY_REGISTER, AUTH_ENTRY_REGISTER_2],
|
||||||
# Whether the auth pipeline entered from /profile.
|
|
||||||
'is_profile': auth_entry == AUTH_ENTRY_PROFILE,
|
|
||||||
# Whether the auth pipeline entered from an API
|
# Whether the auth pipeline entered from an API
|
||||||
'is_api': auth_entry == AUTH_ENTRY_API,
|
'is_api': auth_entry == AUTH_ENTRY_API,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,8 +51,6 @@ _MIDDLEWARE_CLASSES = (
|
|||||||
'third_party_auth.middleware.ExceptionMiddleware',
|
'third_party_auth.middleware.ExceptionMiddleware',
|
||||||
)
|
)
|
||||||
_SOCIAL_AUTH_LOGIN_REDIRECT_URL = '/dashboard'
|
_SOCIAL_AUTH_LOGIN_REDIRECT_URL = '/dashboard'
|
||||||
_SOCIAL_AUTH_NEW_ASSOCIATION_REDIRECT_URL = '/profile'
|
|
||||||
_SOCIAL_AUTH_DISCONNECT_REDIRECT_URL = '/profile'
|
|
||||||
|
|
||||||
|
|
||||||
def _merge_auth_info(django_settings, auth_info):
|
def _merge_auth_info(django_settings, auth_info):
|
||||||
@@ -97,11 +95,6 @@ def _set_global_settings(django_settings):
|
|||||||
# Where to send the user once social authentication is successful.
|
# Where to send the user once social authentication is successful.
|
||||||
django_settings.SOCIAL_AUTH_LOGIN_REDIRECT_URL = _SOCIAL_AUTH_LOGIN_REDIRECT_URL
|
django_settings.SOCIAL_AUTH_LOGIN_REDIRECT_URL = _SOCIAL_AUTH_LOGIN_REDIRECT_URL
|
||||||
|
|
||||||
# Change redirects to the profile page if we enable the new dashboard.
|
|
||||||
if django_settings.FEATURES.get('ENABLE_NEW_DASHBOARD', ''):
|
|
||||||
django_settings.SOCIAL_AUTH_NEW_ASSOCIATION_REDIRECT_URL = _SOCIAL_AUTH_NEW_ASSOCIATION_REDIRECT_URL
|
|
||||||
django_settings.SOCIAL_AUTH_DISCONNECT_REDIRECT_URL = _SOCIAL_AUTH_DISCONNECT_REDIRECT_URL
|
|
||||||
|
|
||||||
# Inject our customized auth pipeline. All auth backends must work with
|
# Inject our customized auth pipeline. All auth backends must work with
|
||||||
# this pipeline.
|
# this pipeline.
|
||||||
django_settings.SOCIAL_AUTH_PIPELINE = (
|
django_settings.SOCIAL_AUTH_PIPELINE = (
|
||||||
|
|||||||
@@ -59,7 +59,6 @@ class StudentAccountUpdateTest(UrlResetMixin, TestCase):
|
|||||||
|
|
||||||
INVALID_KEY = u"123abc"
|
INVALID_KEY = u"123abc"
|
||||||
|
|
||||||
@mock.patch.dict(settings.FEATURES, {'ENABLE_NEW_DASHBOARD': True})
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(StudentAccountUpdateTest, self).setUp("student_account.urls")
|
super(StudentAccountUpdateTest, self).setUp("student_account.urls")
|
||||||
|
|
||||||
@@ -71,141 +70,6 @@ class StudentAccountUpdateTest(UrlResetMixin, TestCase):
|
|||||||
result = self.client.login(username=self.USERNAME, password=self.OLD_PASSWORD)
|
result = self.client.login(username=self.USERNAME, password=self.OLD_PASSWORD)
|
||||||
self.assertTrue(result)
|
self.assertTrue(result)
|
||||||
|
|
||||||
def test_index(self):
|
|
||||||
response = self.client.get(reverse('account_index'))
|
|
||||||
self.assertContains(response, "Student Account")
|
|
||||||
|
|
||||||
def test_change_email(self):
|
|
||||||
response = self._change_email(self.NEW_EMAIL, self.OLD_PASSWORD)
|
|
||||||
self.assertEquals(response.status_code, 200)
|
|
||||||
|
|
||||||
# Verify that the email associated with the account remains unchanged
|
|
||||||
profile_info = profile_api.profile_info(self.USERNAME)
|
|
||||||
self.assertEquals(profile_info['email'], self.OLD_EMAIL)
|
|
||||||
|
|
||||||
# Check that an email was sent with the activation key
|
|
||||||
self.assertEqual(len(mail.outbox), 1)
|
|
||||||
self._assert_email(
|
|
||||||
mail.outbox[0],
|
|
||||||
[self.NEW_EMAIL],
|
|
||||||
u"Email Change Request",
|
|
||||||
u"There was recently a request to change the email address"
|
|
||||||
)
|
|
||||||
|
|
||||||
# Retrieve the activation key from the email
|
|
||||||
email_body = mail.outbox[0].body
|
|
||||||
result = re.search('/email/confirmation/([^ \n]+)', email_body)
|
|
||||||
self.assertIsNot(result, None)
|
|
||||||
activation_key = result.group(1)
|
|
||||||
|
|
||||||
# Attempt to activate the email
|
|
||||||
response = self.client.get(reverse('email_change_confirm', kwargs={'key': activation_key}))
|
|
||||||
self.assertEqual(response.status_code, 200)
|
|
||||||
|
|
||||||
# Verify that the email was changed
|
|
||||||
profile_info = profile_api.profile_info(self.USERNAME)
|
|
||||||
self.assertEquals(profile_info['email'], self.NEW_EMAIL)
|
|
||||||
|
|
||||||
# Verify that notification emails were sent
|
|
||||||
self.assertEqual(len(mail.outbox), 2)
|
|
||||||
self._assert_email(
|
|
||||||
mail.outbox[1],
|
|
||||||
[self.OLD_EMAIL, self.NEW_EMAIL],
|
|
||||||
u"Email Change Successful",
|
|
||||||
u"You successfully changed the email address"
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_email_change_wrong_password(self):
|
|
||||||
response = self._change_email(self.NEW_EMAIL, "wrong password")
|
|
||||||
self.assertEqual(response.status_code, 401)
|
|
||||||
|
|
||||||
def test_email_change_request_no_user(self):
|
|
||||||
# Patch account API to raise an internal error when an email change is requested
|
|
||||||
with mock.patch('student_account.views.account_api.request_email_change') as mock_call:
|
|
||||||
mock_call.side_effect = account_api.AccountUserNotFound
|
|
||||||
response = self._change_email(self.NEW_EMAIL, self.OLD_PASSWORD)
|
|
||||||
|
|
||||||
self.assertEquals(response.status_code, 400)
|
|
||||||
|
|
||||||
def test_email_change_request_email_taken_by_active_account(self):
|
|
||||||
# Create/activate a second user with the new email
|
|
||||||
activation_key = account_api.create_account(self.ALTERNATE_USERNAME, self.OLD_PASSWORD, self.NEW_EMAIL)
|
|
||||||
account_api.activate_account(activation_key)
|
|
||||||
|
|
||||||
# Request to change the original user's email to the email now used by the second user
|
|
||||||
response = self._change_email(self.NEW_EMAIL, self.OLD_PASSWORD)
|
|
||||||
self.assertEquals(response.status_code, 409)
|
|
||||||
|
|
||||||
def test_email_change_request_email_taken_by_inactive_account(self):
|
|
||||||
# Create a second user with the new email, but don't active them
|
|
||||||
account_api.create_account(self.ALTERNATE_USERNAME, self.OLD_PASSWORD, self.NEW_EMAIL)
|
|
||||||
|
|
||||||
# Request to change the original user's email to the email used by the inactive user
|
|
||||||
response = self._change_email(self.NEW_EMAIL, self.OLD_PASSWORD)
|
|
||||||
self.assertEquals(response.status_code, 200)
|
|
||||||
|
|
||||||
@ddt.data(*INVALID_EMAILS)
|
|
||||||
def test_email_change_request_email_invalid(self, invalid_email):
|
|
||||||
# Request to change the user's email to an invalid address
|
|
||||||
response = self._change_email(invalid_email, self.OLD_PASSWORD)
|
|
||||||
self.assertEquals(response.status_code, 400)
|
|
||||||
|
|
||||||
def test_email_change_confirmation(self):
|
|
||||||
# Get an email change activation key
|
|
||||||
activation_key = account_api.request_email_change(self.USERNAME, self.NEW_EMAIL, self.OLD_PASSWORD)
|
|
||||||
|
|
||||||
# Follow the link sent in the confirmation email
|
|
||||||
response = self.client.get(reverse('email_change_confirm', kwargs={'key': activation_key}))
|
|
||||||
self.assertContains(response, "Email change successful")
|
|
||||||
|
|
||||||
# Verify that the email associated with the account has changed
|
|
||||||
profile_info = profile_api.profile_info(self.USERNAME)
|
|
||||||
self.assertEquals(profile_info['email'], self.NEW_EMAIL)
|
|
||||||
|
|
||||||
def test_email_change_confirmation_invalid_key(self):
|
|
||||||
# Visit the confirmation page with an invalid key
|
|
||||||
response = self.client.get(reverse('email_change_confirm', kwargs={'key': self.INVALID_KEY}))
|
|
||||||
self.assertContains(response, "Something went wrong")
|
|
||||||
|
|
||||||
# Verify that the email associated with the account has not changed
|
|
||||||
profile_info = profile_api.profile_info(self.USERNAME)
|
|
||||||
self.assertEquals(profile_info['email'], self.OLD_EMAIL)
|
|
||||||
|
|
||||||
def test_email_change_confirmation_email_already_exists(self):
|
|
||||||
# Get an email change activation key
|
|
||||||
email_activation_key = account_api.request_email_change(self.USERNAME, self.NEW_EMAIL, self.OLD_PASSWORD)
|
|
||||||
|
|
||||||
# Create/activate a second user with the new email
|
|
||||||
account_activation_key = account_api.create_account(self.ALTERNATE_USERNAME, self.OLD_PASSWORD, self.NEW_EMAIL)
|
|
||||||
account_api.activate_account(account_activation_key)
|
|
||||||
|
|
||||||
# Follow the link sent to the original user
|
|
||||||
response = self.client.get(reverse('email_change_confirm', kwargs={'key': email_activation_key}))
|
|
||||||
self.assertContains(response, "address you wanted to use is already used")
|
|
||||||
|
|
||||||
# Verify that the email associated with the original account has not changed
|
|
||||||
profile_info = profile_api.profile_info(self.USERNAME)
|
|
||||||
self.assertEquals(profile_info['email'], self.OLD_EMAIL)
|
|
||||||
|
|
||||||
def test_email_change_confirmation_internal_error(self):
|
|
||||||
# Get an email change activation key
|
|
||||||
activation_key = account_api.request_email_change(self.USERNAME, self.NEW_EMAIL, self.OLD_PASSWORD)
|
|
||||||
|
|
||||||
# Patch account API to return an internal error
|
|
||||||
with mock.patch('student_account.views.account_api.confirm_email_change') as mock_call:
|
|
||||||
mock_call.side_effect = account_api.AccountInternalError
|
|
||||||
response = self.client.get(reverse('email_change_confirm', kwargs={'key': activation_key}))
|
|
||||||
|
|
||||||
self.assertContains(response, "Something went wrong")
|
|
||||||
|
|
||||||
def test_email_change_request_missing_email_param(self):
|
|
||||||
response = self._change_email(None, self.OLD_PASSWORD)
|
|
||||||
self.assertEqual(response.status_code, 400)
|
|
||||||
|
|
||||||
def test_email_change_request_missing_password_param(self):
|
|
||||||
response = self._change_email(self.OLD_EMAIL, None)
|
|
||||||
self.assertEqual(response.status_code, 400)
|
|
||||||
|
|
||||||
@skipUnless(settings.ROOT_URLCONF == 'lms.urls', 'Test only valid in LMS')
|
@skipUnless(settings.ROOT_URLCONF == 'lms.urls', 'Test only valid in LMS')
|
||||||
def test_password_change(self):
|
def test_password_change(self):
|
||||||
# Request a password change while logged in, simulating
|
# Request a password change while logged in, simulating
|
||||||
@@ -316,25 +180,6 @@ class StudentAccountUpdateTest(UrlResetMixin, TestCase):
|
|||||||
self.assertEqual(response.status_code, 403)
|
self.assertEqual(response.status_code, 403)
|
||||||
|
|
||||||
@ddt.data(
|
@ddt.data(
|
||||||
('get', 'account_index', []),
|
|
||||||
('post', 'email_change_request', []),
|
|
||||||
('get', 'email_change_confirm', [123])
|
|
||||||
)
|
|
||||||
@ddt.unpack
|
|
||||||
def test_require_login(self, method, url_name, args):
|
|
||||||
# Access the page while logged out
|
|
||||||
self.client.logout()
|
|
||||||
url = reverse(url_name, args=args)
|
|
||||||
response = getattr(self.client, method)(url, follow=True)
|
|
||||||
|
|
||||||
# Should have been redirected to the login page
|
|
||||||
self.assertEqual(len(response.redirect_chain), 1)
|
|
||||||
self.assertIn('accounts/login?next=', response.redirect_chain[0][0])
|
|
||||||
|
|
||||||
@ddt.data(
|
|
||||||
('get', 'account_index', []),
|
|
||||||
('post', 'email_change_request', []),
|
|
||||||
('get', 'email_change_confirm', [123]),
|
|
||||||
('post', 'password_change_request', []),
|
('post', 'password_change_request', []),
|
||||||
)
|
)
|
||||||
@ddt.unpack
|
@ddt.unpack
|
||||||
@@ -346,24 +191,6 @@ class StudentAccountUpdateTest(UrlResetMixin, TestCase):
|
|||||||
response = getattr(self.client, method)(url)
|
response = getattr(self.client, method)(url)
|
||||||
self.assertEqual(response.status_code, 405)
|
self.assertEqual(response.status_code, 405)
|
||||||
|
|
||||||
def _assert_email(self, email, expected_to, expected_subject, expected_body):
|
|
||||||
"""Check whether an email has the correct properties. """
|
|
||||||
self.assertEqual(email.to, expected_to)
|
|
||||||
self.assertIn(expected_subject, email.subject)
|
|
||||||
self.assertIn(expected_body, email.body)
|
|
||||||
|
|
||||||
def _change_email(self, new_email, password):
|
|
||||||
"""Request to change the user's email. """
|
|
||||||
data = {}
|
|
||||||
|
|
||||||
if new_email is not None:
|
|
||||||
data['email'] = new_email
|
|
||||||
if password is not None:
|
|
||||||
# We can't pass a Unicode object to urlencode, so we encode the Unicode object
|
|
||||||
data['password'] = password.encode('utf-8')
|
|
||||||
|
|
||||||
return self.client.post(path=reverse('email_change_request'), data=data)
|
|
||||||
|
|
||||||
def _change_password(self, email=None):
|
def _change_password(self, email=None):
|
||||||
"""Request to change the user's password. """
|
"""Request to change the user's password. """
|
||||||
data = {}
|
data = {}
|
||||||
|
|||||||
@@ -11,11 +11,3 @@ if settings.FEATURES.get('ENABLE_COMBINED_LOGIN_REGISTRATION'):
|
|||||||
url(r'^register/$', 'login_and_registration_form', {'initial_mode': 'register'}, name='account_register'),
|
url(r'^register/$', 'login_and_registration_form', {'initial_mode': 'register'}, name='account_register'),
|
||||||
url(r'^password$', 'password_change_request_handler', name='password_change_request'),
|
url(r'^password$', 'password_change_request_handler', name='password_change_request'),
|
||||||
)
|
)
|
||||||
|
|
||||||
if settings.FEATURES.get('ENABLE_NEW_DASHBOARD'):
|
|
||||||
urlpatterns += patterns(
|
|
||||||
'student_account.views',
|
|
||||||
url(r'^$', 'index', name='account_index'),
|
|
||||||
url(r'^email$', 'email_change_request_handler', name='email_change_request'),
|
|
||||||
url(r'^email/confirmation/(?P<key>[^/]*)$', 'email_change_confirmation_handler', name='email_change_confirm'),
|
|
||||||
)
|
|
||||||
|
|||||||
@@ -42,31 +42,6 @@ from student_account.helpers import auth_pipeline_urls
|
|||||||
AUDIT_LOG = logging.getLogger("audit")
|
AUDIT_LOG = logging.getLogger("audit")
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
|
||||||
@require_http_methods(['GET'])
|
|
||||||
def index(request):
|
|
||||||
"""Render the account info page.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
request (HttpRequest)
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
HttpResponse: 200 if the index page was sent successfully
|
|
||||||
HttpResponse: 302 if not logged in (redirect to login page)
|
|
||||||
HttpResponse: 405 if using an unsupported HTTP method
|
|
||||||
|
|
||||||
Example usage:
|
|
||||||
|
|
||||||
GET /account
|
|
||||||
|
|
||||||
"""
|
|
||||||
return render_to_response(
|
|
||||||
'student_account/index.html', {
|
|
||||||
'disable_courseware_js': True,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@require_http_methods(['GET'])
|
@require_http_methods(['GET'])
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
def login_and_registration_form(request, initial_mode="login"):
|
def login_and_registration_form(request, initial_mode="login"):
|
||||||
@@ -124,145 +99,6 @@ def login_and_registration_form(request, initial_mode="login"):
|
|||||||
return render_to_response('student_account/login_and_register.html', context)
|
return render_to_response('student_account/login_and_register.html', context)
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
|
||||||
@require_http_methods(['POST'])
|
|
||||||
@ensure_csrf_cookie
|
|
||||||
def email_change_request_handler(request):
|
|
||||||
"""Handle a request to change the user's email address.
|
|
||||||
|
|
||||||
Sends an email to the newly specified address containing a link
|
|
||||||
to a confirmation page.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
request (HttpRequest)
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
HttpResponse: 200 if the confirmation email was sent successfully
|
|
||||||
HttpResponse: 302 if not logged in (redirect to login page)
|
|
||||||
HttpResponse: 400 if the format of the new email is incorrect, or if
|
|
||||||
an email change is requested for a user which does not exist
|
|
||||||
HttpResponse: 401 if the provided password (in the form) is incorrect
|
|
||||||
HttpResponse: 405 if using an unsupported HTTP method
|
|
||||||
HttpResponse: 409 if the provided email is already in use
|
|
||||||
|
|
||||||
Example usage:
|
|
||||||
|
|
||||||
POST /account/email
|
|
||||||
|
|
||||||
"""
|
|
||||||
username = request.user.username
|
|
||||||
password = request.POST.get('password')
|
|
||||||
new_email = request.POST.get('email')
|
|
||||||
|
|
||||||
if new_email is None:
|
|
||||||
return HttpResponseBadRequest("Missing param 'email'")
|
|
||||||
if password is None:
|
|
||||||
return HttpResponseBadRequest("Missing param 'password'")
|
|
||||||
|
|
||||||
old_email = profile_api.profile_info(username)['email']
|
|
||||||
|
|
||||||
try:
|
|
||||||
key = account_api.request_email_change(username, new_email, password)
|
|
||||||
except (account_api.AccountEmailInvalid, account_api.AccountUserNotFound):
|
|
||||||
return HttpResponseBadRequest()
|
|
||||||
except account_api.AccountEmailAlreadyExists:
|
|
||||||
return HttpResponse(status=409)
|
|
||||||
except account_api.AccountNotAuthorized:
|
|
||||||
return HttpResponse(status=401)
|
|
||||||
|
|
||||||
context = {
|
|
||||||
'key': key,
|
|
||||||
'old_email': old_email,
|
|
||||||
'new_email': new_email,
|
|
||||||
}
|
|
||||||
|
|
||||||
subject = render_to_string('student_account/emails/email_change_request/subject_line.txt', context)
|
|
||||||
subject = ''.join(subject.splitlines())
|
|
||||||
message = render_to_string('student_account/emails/email_change_request/message_body.txt', context)
|
|
||||||
|
|
||||||
from_address = microsite.get_value(
|
|
||||||
'email_from_address',
|
|
||||||
settings.DEFAULT_FROM_EMAIL
|
|
||||||
)
|
|
||||||
|
|
||||||
# Send a confirmation email to the new address containing the activation key
|
|
||||||
send_mail(subject, message, from_address, [new_email])
|
|
||||||
|
|
||||||
return HttpResponse(status=200)
|
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
|
||||||
@require_http_methods(['GET'])
|
|
||||||
def email_change_confirmation_handler(request, key):
|
|
||||||
"""Complete a change of the user's email address.
|
|
||||||
|
|
||||||
This is called when the activation link included in the confirmation
|
|
||||||
email is clicked.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
request (HttpRequest)
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
HttpResponse: 200 if the email change is successful, the activation key
|
|
||||||
is invalid, the new email is already in use, or the
|
|
||||||
user to which the email change will be applied does
|
|
||||||
not exist
|
|
||||||
HttpResponse: 302 if not logged in (redirect to login page)
|
|
||||||
HttpResponse: 405 if using an unsupported HTTP method
|
|
||||||
|
|
||||||
Example usage:
|
|
||||||
|
|
||||||
GET /account/email/confirmation/{key}
|
|
||||||
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
old_email, new_email = account_api.confirm_email_change(key)
|
|
||||||
except account_api.AccountNotAuthorized:
|
|
||||||
return render_to_response(
|
|
||||||
'student_account/email_change_failed.html', {
|
|
||||||
'disable_courseware_js': True,
|
|
||||||
'error': 'key_invalid',
|
|
||||||
}
|
|
||||||
)
|
|
||||||
except account_api.AccountEmailAlreadyExists:
|
|
||||||
return render_to_response(
|
|
||||||
'student_account/email_change_failed.html', {
|
|
||||||
'disable_courseware_js': True,
|
|
||||||
'error': 'email_used',
|
|
||||||
}
|
|
||||||
)
|
|
||||||
except account_api.AccountInternalError:
|
|
||||||
return render_to_response(
|
|
||||||
'student_account/email_change_failed.html', {
|
|
||||||
'disable_courseware_js': True,
|
|
||||||
'error': 'internal',
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
context = {
|
|
||||||
'old_email': old_email,
|
|
||||||
'new_email': new_email,
|
|
||||||
}
|
|
||||||
|
|
||||||
subject = render_to_string('student_account/emails/email_change_confirmation/subject_line.txt', context)
|
|
||||||
subject = ''.join(subject.splitlines())
|
|
||||||
message = render_to_string('student_account/emails/email_change_confirmation/message_body.txt', context)
|
|
||||||
|
|
||||||
from_address = microsite.get_value(
|
|
||||||
'email_from_address',
|
|
||||||
settings.DEFAULT_FROM_EMAIL
|
|
||||||
)
|
|
||||||
|
|
||||||
# Notify both old and new emails of the change
|
|
||||||
send_mail(subject, message, from_address, [old_email, new_email])
|
|
||||||
|
|
||||||
return render_to_response(
|
|
||||||
'student_account/email_change_successful.html', {
|
|
||||||
'disable_courseware_js': True,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@require_http_methods(['POST'])
|
@require_http_methods(['POST'])
|
||||||
def password_change_request_handler(request):
|
def password_change_request_handler(request):
|
||||||
"""Handle password change requests originating from the account page.
|
"""Handle password change requests originating from the account page.
|
||||||
|
|||||||
@@ -313,9 +313,6 @@ FEATURES = {
|
|||||||
# ENABLE_OAUTH2_PROVIDER to True
|
# ENABLE_OAUTH2_PROVIDER to True
|
||||||
'ENABLE_MOBILE_REST_API': False,
|
'ENABLE_MOBILE_REST_API': False,
|
||||||
|
|
||||||
# Enable the new dashboard, account, and profile pages
|
|
||||||
'ENABLE_NEW_DASHBOARD': False,
|
|
||||||
|
|
||||||
# Enable the combined login/registration form
|
# Enable the combined login/registration form
|
||||||
'ENABLE_COMBINED_LOGIN_REGISTRATION': False,
|
'ENABLE_COMBINED_LOGIN_REGISTRATION': False,
|
||||||
|
|
||||||
|
|||||||
@@ -1,30 +0,0 @@
|
|||||||
<%! from django.utils.translation import ugettext as _ %>
|
|
||||||
<%! from django.core.urlresolvers import reverse %>
|
|
||||||
<%inherit file="../main.html" />
|
|
||||||
|
|
||||||
<section class="container activation">
|
|
||||||
<section class="message">
|
|
||||||
<h1 class="invalid">${_("Email change failed.")}</h1>
|
|
||||||
<hr class="horizontal-divider">
|
|
||||||
|
|
||||||
<p>
|
|
||||||
% if error is 'key_invalid' or error is 'internal':
|
|
||||||
${_("Something went wrong. Please contact {support} for help.").format(
|
|
||||||
support="<a href='mailto:{support_email}'>{support_email}</a>".format(
|
|
||||||
support_email=settings.TECH_SUPPORT_EMAIL
|
|
||||||
)
|
|
||||||
)}
|
|
||||||
% elif error is 'email_used':
|
|
||||||
${_("The email address you wanted to use is already used by another "
|
|
||||||
"{platform_name} account.").format(platform_name=settings.PLATFORM_NAME)}
|
|
||||||
% endif
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
${_("You can try again from the {link_start}account settings{link_end} page.").format(
|
|
||||||
link_start="<a href='{url}'>".format(url=reverse('account_index')),
|
|
||||||
link_end="</a>"
|
|
||||||
)}
|
|
||||||
</p>
|
|
||||||
</section>
|
|
||||||
</section>
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
<%! from django.utils.translation import ugettext as _ %>
|
|
||||||
<%! from django.core.urlresolvers import reverse %>
|
|
||||||
<%inherit file="../main.html" />
|
|
||||||
|
|
||||||
<section class="container activation">
|
|
||||||
<section class="message">
|
|
||||||
<h1 class="valid">${_("Email change successful!")}</h1>
|
|
||||||
<hr class="horizontal-divider">
|
|
||||||
|
|
||||||
<p>
|
|
||||||
${_("You should see your new email address listed on the "
|
|
||||||
"{link_start}account settings{link_end} page.").format(
|
|
||||||
link_start="<a href='{url}'>".format(url=reverse('account_index')),
|
|
||||||
link_end="</a>",
|
|
||||||
)}
|
|
||||||
</p>
|
|
||||||
</section>
|
|
||||||
</section>
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
<%! from django.utils.translation import ugettext as _ %>
|
|
||||||
|
|
||||||
## TODO: Get sign-off from Product on new copy, and think about
|
|
||||||
## turning this into a large, multi-line message for i18n purposes.
|
|
||||||
## Greeting
|
|
||||||
${_("Hi there,")}
|
|
||||||
|
|
||||||
## Preamble
|
|
||||||
${_("You successfully changed the email address associated with your "
|
|
||||||
"{platform_name} account from {old_email} to {new_email}.").format(
|
|
||||||
platform_name=settings.PLATFORM_NAME,
|
|
||||||
old_email=old_email,
|
|
||||||
new_email=new_email
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
## Translators: This is the signature of an email. "\n" is a newline character,
|
|
||||||
## and should be placed between the closing word and the signing team's name.
|
|
||||||
${_("Thanks,\n - The {platform_name} Team").format(
|
|
||||||
platform_name=settings.PLATFORM_NAME,
|
|
||||||
)}
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
<%! from django.utils.translation import ugettext as _ %>
|
|
||||||
|
|
||||||
${_("{platform_name} Email Change Successful").format(platform_name=settings.PLATFORM_NAME)}
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
<%! from django.utils.translation import ugettext as _ %>
|
|
||||||
|
|
||||||
## TODO: Get sign-off from Product on new copy, and think about
|
|
||||||
## turning this into a large, multi-line message for i18n purposes.
|
|
||||||
## Greeting
|
|
||||||
${_("Hi there,")}
|
|
||||||
|
|
||||||
## Preamble
|
|
||||||
${_("There was recently a request to change the email address associated "
|
|
||||||
"with your {platform_name} account from {old_email} to {new_email}. "
|
|
||||||
"If you requested this change, please confirm your new email address "
|
|
||||||
"by following the link below:").format(
|
|
||||||
platform_name=settings.PLATFORM_NAME,
|
|
||||||
old_email=old_email,
|
|
||||||
new_email=new_email
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
## Confirmation link
|
|
||||||
% if is_secure:
|
|
||||||
https://${site}/account/email/confirmation/${key}
|
|
||||||
% else:
|
|
||||||
http://${site}/account/email/confirmation/${key}
|
|
||||||
% endif
|
|
||||||
|
|
||||||
## Closing
|
|
||||||
${_("If you don't want to change the email address associated with your "
|
|
||||||
"account, ignore this message.")}
|
|
||||||
|
|
||||||
## Translators: This is the signature of an email. "\n" is a newline character,
|
|
||||||
## and should be placed between the closing word and the signing team's name.
|
|
||||||
${_("Thanks,\n - The {platform_name} Team").format(
|
|
||||||
platform_name=settings.PLATFORM_NAME,
|
|
||||||
)}
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
<%! from django.utils.translation import ugettext as _ %>
|
|
||||||
|
|
||||||
${_("{platform_name} Email Change Request").format(platform_name=settings.PLATFORM_NAME)}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
<%! from django.utils.translation import ugettext as _ %>
|
|
||||||
<%namespace name='static' file='/static_content.html'/>
|
|
||||||
|
|
||||||
<%inherit file="../main.html" />
|
|
||||||
|
|
||||||
<%block name="pagetitle">${_("Student Account")}</%block>
|
|
||||||
|
|
||||||
<%block name="js_extra">
|
|
||||||
<script type="text/javascript" src="${static.url('js/vendor/underscore-min.js')}"></script>
|
|
||||||
<script type="text/javascript" src="${static.url('js/vendor/backbone-min.js')}"></script>
|
|
||||||
<%static:js group='student_account'/>
|
|
||||||
</%block>
|
|
||||||
|
|
||||||
<%block name="header_extras">
|
|
||||||
% for template_name in ["account"]:
|
|
||||||
<script type="text/template" id="${template_name}-tpl">
|
|
||||||
<%static:include path="student_account/${template_name}.underscore" />
|
|
||||||
</script>
|
|
||||||
% endfor
|
|
||||||
</%block>
|
|
||||||
|
|
||||||
<h1>Student Account</h1>
|
|
||||||
|
|
||||||
<p>This is a placeholder for the student's account page.</p>
|
|
||||||
|
|
||||||
<div id="account-container"></div>
|
|
||||||
Reference in New Issue
Block a user