diff --git a/lms/djangoapps/student_profile/__init__.py b/lms/djangoapps/student_profile/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lms/djangoapps/student_profile/test/__init__.py b/lms/djangoapps/student_profile/test/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lms/djangoapps/student_profile/test/test_views.py b/lms/djangoapps/student_profile/test/test_views.py deleted file mode 100644 index 6785796ded..0000000000 --- a/lms/djangoapps/student_profile/test/test_views.py +++ /dev/null @@ -1,196 +0,0 @@ -# -*- coding: utf-8 -*- -""" Tests for student profile views. """ - -from urllib import urlencode -import json - -from mock import patch -import ddt -from django.test import TestCase -from django.conf import settings -from django.core.urlresolvers import reverse - -from util.testing import UrlResetMixin -from openedx.core.djangoapps.user_api.api import account as account_api -from openedx.core.djangoapps.user_api.api import profile as profile_api -from lang_pref import LANGUAGE_KEY, api as language_api - - -@ddt.ddt -class StudentProfileViewTest(UrlResetMixin, TestCase): - """ Tests for the student profile views. """ - - USERNAME = u'heisenberg' - PASSWORD = u'ḅḷüëṡḳÿ' - EMAIL = u'walt@savewalterwhite.com' - FULL_NAME = u'𝖂𝖆𝖑𝖙𝖊𝖗 𝖂𝖍𝖎𝖙𝖊' - - TEST_LANGUAGE = language_api.Language('eo', u'Dummy language') - - INVALID_LANGUAGE_CODES = [ - '', - 'foo', - 'en@pirate', - ] - - @patch.dict(settings.FEATURES, {'ENABLE_NEW_DASHBOARD': True}) - def setUp(self): - super(StudentProfileViewTest, self).setUp("student_profile.urls") - - # Create/activate a new account - activation_key = account_api.create_account(self.USERNAME, self.PASSWORD, self.EMAIL) - account_api.activate_account(activation_key) - - # Login - result = self.client.login(username=self.USERNAME, password=self.PASSWORD) - self.assertTrue(result) - - def test_index(self): - response = self.client.get(reverse('profile_index')) - self.assertContains(response, "Student Profile") - self.assertContains(response, "Connected Accounts") - - def test_name_change(self): - # Verify that the name on the account is blank - profile_info = profile_api.profile_info(self.USERNAME) - self.assertEqual(profile_info['full_name'], '') - - response = self._change_name(self.FULL_NAME) - self.assertEqual(response.status_code, 204) - - # Verify that the name on the account has been changed - profile_info = profile_api.profile_info(self.USERNAME) - self.assertEqual(profile_info['full_name'], self.FULL_NAME) - - def test_name_change_invalid(self): - # Name cannot be an empty string - response = self._change_name('') - self.assertEqual(response.status_code, 400) - - def test_name_change_missing_params(self): - response = self._change_name(None) - self.assertEqual(response.status_code, 400) - - @patch('student_profile.views.profile_api.update_profile') - def test_name_change_internal_error(self, mock_update_profile): - # This can't happen if the user is logged in, but test it anyway - mock_update_profile.side_effect = profile_api.ProfileUserNotFound - response = self._change_name(self.FULL_NAME) - self.assertEqual(response.status_code, 500) - - @patch('student_profile.views.language_api.preferred_language') - @patch('student_profile.views.language_api.released_languages') - def test_get_released_languages(self, mock_released_languages, mock_preferred_language): - mock_released_languages.return_value = [self.TEST_LANGUAGE] - mock_preferred_language.return_value = self.TEST_LANGUAGE - - response = self.client.get(reverse('language_info')) - self.assertEqual( - json.loads(response.content), - { - 'preferredLanguage': {'code': self.TEST_LANGUAGE.code, 'name': self.TEST_LANGUAGE.name}, - 'languages': [{'code': self.TEST_LANGUAGE.code, 'name': self.TEST_LANGUAGE.name}] - } - ) - - @patch('student_profile.views.language_api.released_languages') - def test_language_change(self, mock_released_languages): - mock_released_languages.return_value = [self.TEST_LANGUAGE] - - # Set the dummy language as the user's preferred language - response = self._change_preferences(language=self.TEST_LANGUAGE.code) - self.assertEqual(response.status_code, 204) - - # Verify that the dummy language is now the user's preferred language - preferences = profile_api.preference_info(self.USERNAME) - self.assertEqual(preferences[LANGUAGE_KEY], self.TEST_LANGUAGE.code) - - # Verify that the page reloads in the dummy language - response = self.client.get(reverse('profile_index')) - self.assertContains(response, u"Stüdént Pröfïlé") - - @ddt.data(*INVALID_LANGUAGE_CODES) - def test_change_to_invalid_or_unreleased_language(self, language_code): - response = self._change_preferences(language=language_code) - self.assertEqual(response.status_code, 400) - - def test_change_to_missing_language(self): - response = self._change_preferences(language=None) - self.assertEqual(response.status_code, 400) - - @patch('student_profile.views.profile_api.update_preferences') - @patch('student_profile.views.language_api.released_languages') - def test_language_change_missing_profile(self, mock_released_languages, mock_update_preferences): - # This can't happen if the user is logged in, but test it anyway - mock_released_languages.return_value = [self.TEST_LANGUAGE] - mock_update_preferences.side_effect = profile_api.ProfileUserNotFound - - response = self._change_preferences(language=self.TEST_LANGUAGE.code) - self.assertEqual(response.status_code, 500) - - @ddt.data( - ('get', 'profile_index'), - ('put', 'profile_index'), - ('put', 'preference_handler'), - ('get', 'language_info'), - ) - @ddt.unpack - def test_require_login(self, method, url_name): - # Access the page while logged out - self.client.logout() - url = reverse(url_name) - 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', 'put'], 'profile_index'), - (['put'], 'preference_handler'), - (['get'], 'language_info'), - ) - @ddt.unpack - def test_require_http_method(self, correct_methods, url_name): - wrong_methods = {'get', 'put', 'post', 'head', 'options', 'delete'} - set(correct_methods) - url = reverse(url_name) - - for method in wrong_methods: - response = getattr(self.client, method)(url) - self.assertEqual(response.status_code, 405) - - def _change_name(self, new_name): - """Request a name change. - - Returns: - HttpResponse - - """ - data = {} - if new_name is not None: - # We can't pass a Unicode object to urlencode, so we encode the Unicode object - data['fullName'] = new_name.encode('utf-8') - - return self.client.put( - path=reverse('profile_index'), - data=urlencode(data), - content_type='application/x-www-form-urlencoded' - ) - - def _change_preferences(self, **preferences): - """Request a change to the user's preferences. - - Returns: - HttpResponse - - """ - data = {} - for key, value in preferences.iteritems(): - if value is not None: - data[key] = value - - return self.client.put( - path=reverse('preference_handler'), - data=urlencode(data), - content_type='application/x-www-form-urlencoded' - ) diff --git a/lms/djangoapps/student_profile/urls.py b/lms/djangoapps/student_profile/urls.py deleted file mode 100644 index 48d20711d9..0000000000 --- a/lms/djangoapps/student_profile/urls.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.conf.urls import patterns, url -from django.conf import settings - - -urlpatterns = [] - - -if settings.FEATURES.get('ENABLE_NEW_DASHBOARD'): - urlpatterns = patterns( - 'student_profile.views', - url(r'^$', 'index', name='profile_index'), - url(r'^preferences$', 'preference_handler', name='preference_handler'), - url(r'^preferences/languages$', 'language_info', name='language_info'), - ) diff --git a/lms/djangoapps/student_profile/views.py b/lms/djangoapps/student_profile/views.py deleted file mode 100644 index 51fac70c3e..0000000000 --- a/lms/djangoapps/student_profile/views.py +++ /dev/null @@ -1,182 +0,0 @@ -""" Views for a student's profile information. """ - -import json - -from django.http import ( - QueryDict, HttpResponse, - HttpResponseBadRequest, HttpResponseServerError -) -from django.conf import settings -from django.views.decorators.http import require_http_methods -from django_future.csrf import ensure_csrf_cookie -from django.contrib.auth.decorators import login_required -from edxmako.shortcuts import render_to_response -from openedx.core.djangoapps.user_api.api import profile as profile_api -from lang_pref import LANGUAGE_KEY, api as language_api -import third_party_auth - - -@login_required -def index(request): - """View or modify the student's profile. - - GET: Retrieve the user's profile information. - PUT: Update the user's profile information. Currently the only accept param is "fullName". - - Args: - request (HttpRequest) - - Returns: - HttpResponse: 200 if successful on GET - HttpResponse: 204 if successful on PUT - HttpResponse: 302 if not logged in (redirect to login page) - HttpResponse: 400 if the updated information is invalid - HttpResponse: 405 if using an unsupported HTTP method - HttpResponse: 500 if an unexpected error occurs. - - """ - if request.method == "GET": - return _get_profile(request) - elif request.method == "PUT": - return _update_profile(request) - else: - return HttpResponse(status=405) - - -def _get_profile(request): - """Retrieve the user's profile information, including an HTML form - that students can use to update the information. - - Args: - request (HttpRequest) - - Returns: - HttpResponse - - """ - user = request.user - - context = { - 'disable_courseware_js': True - } - - if third_party_auth.is_enabled(): - context['provider_user_states'] = third_party_auth.pipeline.get_provider_user_states(user) - - return render_to_response('student_profile/index.html', context) - - -@ensure_csrf_cookie -def _update_profile(request): - """Update a user's profile information. - - Args: - request (HttpRequest) - - Returns: - HttpResponse - - """ - put = QueryDict(request.body) - - username = request.user.username - new_name = put.get('fullName') - - if new_name is None: - return HttpResponseBadRequest("Missing param 'fullName'") - - try: - profile_api.update_profile(username, full_name=new_name) - except profile_api.ProfileInvalidField: - return HttpResponseBadRequest() - except profile_api.ProfileUserNotFound: - return HttpResponseServerError() - - # A 204 is intended to allow input for actions to take place - # without causing a change to the user agent's active document view. - return HttpResponse(status=204) - - -@login_required -@require_http_methods(['GET']) -def language_info(request): - """Retrieve information about languages. - - Gets the user's preferred language and the list of released - languages, encoding the information as JSON. - - Args: - request (HttpRequest) - - Returns: - HttpResponse: 200 if successful on GET - HttpResponse: 302 if not logged in (redirect to login page) - HttpResponse: 405 if using an unsupported HTTP method - HttpResponse: 500 if an unexpected error occurs - - Example: - - GET /profile/preferences/languages - - """ - user = request.user - - preferred_language_code = profile_api.preference_info(user.username).get(LANGUAGE_KEY) - preferred_language = language_api.preferred_language(preferred_language_code) - response_data = {'preferredLanguage': {'code': preferred_language.code, 'name': preferred_language.name}} - - languages = language_api.released_languages() - response_data['languages'] = [{'code': language.code, 'name': language.name} for language in languages] - - return HttpResponse(json.dumps(response_data), content_type='application/json') - - -@login_required -@require_http_methods(['PUT']) -@ensure_csrf_cookie -def preference_handler(request): - """Change the user's preferences. - - At the moment, the only supported preference is the user's - language choice. - - Args: - request (HttpRequest) - - Returns: - HttpResponse: 204 if successful - HttpResponse: 302 if not logged in (redirect to login page) - HttpResponse: 400 if no language is provided, or an unreleased - language is provided - HttpResponse: 405 if using an unsupported HTTP method - HttpResponse: 500 if an unexpected error occurs. - - Example: - - PUT /profile/preferences - - """ - put = QueryDict(request.body) - - username = request.user.username - new_language = put.get('language') - - if new_language is None: - return HttpResponseBadRequest("Missing param 'language'") - - # Check that the provided language code corresponds to a released language - released_languages = language_api.released_languages() - if new_language in [language.code for language in released_languages]: - try: - profile_api.update_preferences(username, **{LANGUAGE_KEY: new_language}) - request.session['django_language'] = new_language - except profile_api.ProfileUserNotFound: - return HttpResponseServerError() - else: - return HttpResponseBadRequest( - "Provided language code corresponds to an unreleased language" - ) - - # A 204 is intended to allow input for actions to take place - # without causing a change to the user agent's active document view. - return HttpResponse(status=204) diff --git a/lms/urls.py b/lms/urls.py index 6a41de2399..a3b604d756 100644 --- a/lms/urls.py +++ b/lms/urls.py @@ -396,7 +396,6 @@ if settings.COURSEWARE_ENABLED: # Student account and profile url(r'^account/', include('student_account.urls')), - url(r'^profile/', include('student_profile.urls')), # Student Notes url(r'^courses/{}/edxnotes'.format(settings.COURSE_ID_PATTERN),