diff --git a/common/test/acceptance/pages/lms/learner_profile.py b/common/test/acceptance/pages/lms/learner_profile.py index c32847ee52..ad211c405c 100644 --- a/common/test/acceptance/pages/lms/learner_profile.py +++ b/common/test/acceptance/pages/lms/learner_profile.py @@ -63,7 +63,7 @@ class LearnerProfilePage(FieldsMixin, PageObject): Arguments: privacy (str): 'all_users' or 'private' """ - self.wait_for_element_visibility('select#u-field-select-account_privacy', 'Privacy dropdown is visiblie') + self.wait_for_element_visibility('select#u-field-select-account_privacy', 'Privacy dropdown is visible') if privacy != self.privacy: self.q(css=PROFILE_VISIBILITY_SELECTOR.format(privacy)).first.click() diff --git a/common/test/acceptance/tests/lms/test_learner_profile.py b/common/test/acceptance/tests/lms/test_learner_profile.py index 43be7ef37a..7bcad79586 100644 --- a/common/test/acceptance/tests/lms/test_learner_profile.py +++ b/common/test/acceptance/tests/lms/test_learner_profile.py @@ -111,6 +111,19 @@ class OwnLearnerProfilePageTest(LearnerProfileTestMixin, WebAppTest): self.assertEqual(profile_page.age_limit_message_present, message is not None) self.assertIn(message, profile_page.profile_forced_private_message) + def test_profile_defaults_to_public(self): + """ + Scenario: Verify that a new user's profile defaults to public. + + Given that I am a new user. + When I go to my profile page. + Then I see that the profile visibility is set to public. + """ + username, user_id = self.log_in_as_unique_user() + profile_page = self.visit_profile_page(username) + self.assertTrue(profile_page.privacy_field_visible) + self.assertEquals(profile_page.privacy, self.PRIVACY_PUBLIC) + def assert_default_image_has_public_access(self, profile_page): """ Assert that profile image has public access. @@ -514,6 +527,27 @@ class DifferentUserLearnerProfilePageTest(LearnerProfileTestMixin, WebAppTest): self.assertEqual(profile_page.visible_fields, self.PRIVATE_PROFILE_FIELDS) self.verify_profile_page_view_event(different_user_id, visibility=self.PRIVACY_PRIVATE) + def test_different_user_under_age(self): + """ + Scenario: Verify that desired fields are shown when looking at a different user's private profile. + + Given that I am a registered user. + And I visit an under age user's profile page. + Then I shouldn't see the profile visibility selector dropdown. + Then I see some of the profile fields are shown. + """ + under_age_birth_year = datetime.now().year - 10 + different_username, different_user_id = self._initialize_different_user( + privacy=self.PRIVACY_PUBLIC, + birth_year=under_age_birth_year + ) + self.log_in_as_unique_user() + profile_page = self.visit_profile_page(different_username) + + self.assertFalse(profile_page.privacy_field_visible) + self.assertEqual(profile_page.visible_fields, self.PRIVATE_PROFILE_FIELDS) + self.verify_profile_page_view_event(different_user_id, visibility=self.PRIVACY_PRIVATE) + def test_different_user_public_profile(self): """ Scenario: Verify that desired fields are shown when looking at a different user's public profile. @@ -534,7 +568,7 @@ class DifferentUserLearnerProfilePageTest(LearnerProfileTestMixin, WebAppTest): self.assertEqual(profile_page.editable_fields, []) self.verify_profile_page_view_event(different_user_id, visibility=self.PRIVACY_PUBLIC) - def _initialize_different_user(self, privacy=None): + def _initialize_different_user(self, privacy=None, birth_year=None): """ Initialize the profile page for a different test user """ @@ -545,6 +579,10 @@ class DifferentUserLearnerProfilePageTest(LearnerProfileTestMixin, WebAppTest): privacy = self.PRIVACY_PUBLIC self.visit_profile_page(username, privacy=privacy) + # Set the user's year of birth + if birth_year: + self.set_birth_year(birth_year) + # Log the user out LogoutPage(self.browser).visit() diff --git a/lms/djangoapps/student_profile/views.py b/lms/djangoapps/student_profile/views.py index a47cab8ace..7ac0b09491 100644 --- a/lms/djangoapps/student_profile/views.py +++ b/lms/djangoapps/student_profile/views.py @@ -69,6 +69,7 @@ def learner_profile_context(logged_in_username, profile_username, user_is_staff) 'data': { 'profile_user_id': profile_user.id, 'default_public_account_fields': settings.ACCOUNT_VISIBILITY_CONFIGURATION['public_fields'], + 'default_visibility': settings.ACCOUNT_VISIBILITY_CONFIGURATION['default_visibility'], 'accounts_api_url': reverse("accounts_api", kwargs={'username': profile_username}), 'preferences_api_url': reverse('preferences_api', kwargs={'username': profile_username}), 'profile_image_upload_url': reverse('profile_image_upload', kwargs={'username': profile_username}), diff --git a/lms/static/js/spec/student_account/account_settings_factory_spec.js b/lms/static/js/spec/student_account/account_settings_factory_spec.js index 9f2d8008e7..6442e400f6 100644 --- a/lms/static/js/spec/student_account/account_settings_factory_spec.js +++ b/lms/static/js/spec/student_account/account_settings_factory_spec.js @@ -13,19 +13,19 @@ define(['backbone', 'jquery', 'underscore', 'js/common_helpers/ajax_helpers', 'j var FIELDS_DATA = { 'country': { - 'options': Helpers.FIELD_OPTIONS, + 'options': Helpers.FIELD_OPTIONS }, 'gender': { - 'options': Helpers.FIELD_OPTIONS, + 'options': Helpers.FIELD_OPTIONS }, 'language': { - 'options': Helpers.FIELD_OPTIONS, + 'options': Helpers.FIELD_OPTIONS }, 'level_of_education': { - 'options': Helpers.FIELD_OPTIONS, + 'options': Helpers.FIELD_OPTIONS }, 'password': { - 'url': '/password_reset', + 'url': '/password_reset' }, 'year_of_birth': { - 'options': Helpers.FIELD_OPTIONS, + 'options': Helpers.FIELD_OPTIONS }, 'preferred_language': { - 'options': Helpers.FIELD_OPTIONS, + 'options': Helpers.FIELD_OPTIONS } }; @@ -98,7 +98,7 @@ define(['backbone', 'jquery', 'underscore', 'js/common_helpers/ajax_helpers', 'j expect(request.method).toBe('GET'); expect(request.url).toBe(Helpers.USER_ACCOUNTS_API_URL); - AjaxHelpers.respondWithJson(requests, Helpers.USER_ACCOUNTS_DATA); + AjaxHelpers.respondWithJson(requests, Helpers.createAccountSettingsData()); Helpers.expectLoadingIndicatorIsVisible(accountSettingsView, true); Helpers.expectLoadingErrorIsVisible(accountSettingsView, false); Helpers.expectSettingsSectionsButNotFieldsToBeRendered(accountSettingsView); @@ -126,8 +126,8 @@ define(['backbone', 'jquery', 'underscore', 'js/common_helpers/ajax_helpers', 'j Helpers.expectLoadingErrorIsVisible(accountSettingsView, false); Helpers.expectSettingsSectionsButNotFieldsToBeRendered(accountSettingsView); - AjaxHelpers.respondWithJson(requests, Helpers.USER_ACCOUNTS_DATA); - AjaxHelpers.respondWithJson(requests, Helpers.USER_PREFERENCES_DATA); + AjaxHelpers.respondWithJson(requests, Helpers.createAccountSettingsData()); + AjaxHelpers.respondWithJson(requests, Helpers.createUserPreferencesData()); Helpers.expectLoadingIndicatorIsVisible(accountSettingsView, false); Helpers.expectLoadingErrorIsVisible(accountSettingsView, false); @@ -143,8 +143,8 @@ define(['backbone', 'jquery', 'underscore', 'js/common_helpers/ajax_helpers', 'j ); var accountSettingsView = context.accountSettingsView; - AjaxHelpers.respondWithJson(requests, Helpers.USER_ACCOUNTS_DATA); - AjaxHelpers.respondWithJson(requests, Helpers.USER_PREFERENCES_DATA); + AjaxHelpers.respondWithJson(requests, Helpers.createAccountSettingsData()); + AjaxHelpers.respondWithJson(requests, Helpers.createUserPreferencesData()); var sectionsData = accountSettingsView.options.sectionsData; diff --git a/lms/static/js/spec/student_account/account_settings_view_spec.js b/lms/static/js/spec/student_account/account_settings_view_spec.js index 9ce90987b2..c8d0aaa5ff 100644 --- a/lms/static/js/spec/student_account/account_settings_view_spec.js +++ b/lms/static/js/spec/student_account/account_settings_view_spec.js @@ -13,7 +13,7 @@ define(['backbone', 'jquery', 'underscore', 'js/common_helpers/ajax_helpers', 'j var createAccountSettingsView = function () { var model = new UserAccountModel(); - model.set(Helpers.USER_ACCOUNTS_DATA); + model.set(Helpers.createAccountSettingsData()); var sectionsData = [ { diff --git a/lms/static/js/spec/student_account/helpers.js b/lms/static/js/spec/student_account/helpers.js index 3ca13867e2..8d0266e515 100644 --- a/lms/static/js/spec/student_account/helpers.js +++ b/lms/static/js/spec/student_account/helpers.js @@ -11,25 +11,33 @@ define(['underscore'], function(_) { has_image: true }; - var USER_ACCOUNTS_DATA = { + var DEFAULT_ACCOUNT_SETTINGS_DATA = { username: 'student', name: 'Student', email: 'student@edx.org', - level_of_education: '0', - gender: '0', - year_of_birth: '0', - country: '0', - language: '0', + level_of_education: '', + gender: '', + year_of_birth: '3', // Note: test birth year range is a string from 0-3 + requires_parental_consent: false, + country: '', + language: '', bio: "About the student", language_proficiencies: [{code: '1'}], - requires_parental_consent: true, profile_image: PROFILE_IMAGE }; - var USER_PREFERENCES_DATA = { + var createAccountSettingsData = function(options) { + return _.extend(_.extend({}, DEFAULT_ACCOUNT_SETTINGS_DATA), options); + }; + + var DEFAULT_USER_PREFERENCES_DATA = { 'pref-lang': '2' }; + var createUserPreferencesData = function(options) { + return _.extend(_.extend({}, DEFAULT_USER_PREFERENCES_DATA), options); + }; + var FIELD_OPTIONS = [ ['0', 'Option 0'], ['1', 'Option 1'], @@ -63,7 +71,6 @@ define(['underscore'], function(_) { expect(fieldTitle).toBe(view.options.title); if ('fieldValue' in view) { - expect(view.model.get(view.options.valueAttribute)).toBeTruthy(); expect(view.fieldValue()).toBe(view.modelValue()); } else if (view.fieldType === 'link') { expect($(element).find('a').length).toBe(1); @@ -107,8 +114,8 @@ define(['underscore'], function(_) { IMAGE_MAX_BYTES: IMAGE_MAX_BYTES, IMAGE_MIN_BYTES: IMAGE_MIN_BYTES, PROFILE_IMAGE: PROFILE_IMAGE, - USER_ACCOUNTS_DATA: USER_ACCOUNTS_DATA, - USER_PREFERENCES_DATA: USER_PREFERENCES_DATA, + createAccountSettingsData: createAccountSettingsData, + createUserPreferencesData: createUserPreferencesData, FIELD_OPTIONS: FIELD_OPTIONS, expectLoadingIndicatorIsVisible: expectLoadingIndicatorIsVisible, expectLoadingErrorIsVisible: expectLoadingErrorIsVisible, diff --git a/lms/static/js/spec/student_account/register_spec.js b/lms/static/js/spec/student_account/register_spec.js index eed77a687d..7b1708bf6b 100644 --- a/lms/static/js/spec/student_account/register_spec.js +++ b/lms/static/js/spec/student_account/register_spec.js @@ -99,7 +99,7 @@ define([ {value: "", name: "--"}, {value: "p", name: "Doctorate"}, {value: "m", name: "Master's or professional degree"}, - {value: "b", name: "Bachelor's degree"}, + {value: "b", name: "Bachelor's degree"} ], required: false, instructions: 'Select your education level.', @@ -115,7 +115,7 @@ define([ {value: "", name: "--"}, {value: "m", name: "Male"}, {value: "f", name: "Female"}, - {value: "o", name: "Other"}, + {value: "o", name: "Other"} ], required: false, instructions: 'Select your gender.', @@ -131,7 +131,7 @@ define([ {value: "", name: "--"}, {value: 1900, name: "1900"}, {value: 1950, name: "1950"}, - {value: 2014, name: "2014"}, + {value: 2014, name: "2014"} ], required: false, instructions: 'Select your year of birth.', diff --git a/lms/static/js/spec/student_profile/helpers.js b/lms/static/js/spec/student_profile/helpers.js index b5c2602d99..594d9520f2 100644 --- a/lms/static/js/spec/student_profile/helpers.js +++ b/lms/static/js/spec/student_profile/helpers.js @@ -10,8 +10,6 @@ define(['underscore'], function(_) { } if ('fieldValue' in view || 'imageUrl' in view) { - expect(view.model.get(view.options.valueAttribute)).toBeTruthy(); - if ('imageUrl' in view) { expect($($element.find('.image-frame')[0]).attr('src')).toBe(view.imageUrl()); } else if (view.fieldValue()) { @@ -111,6 +109,5 @@ define(['underscore'], function(_) { expectLimitedProfileSectionsAndFieldsToBeRendered: expectLimitedProfileSectionsAndFieldsToBeRendered, expectProfileSectionsAndFieldsToBeRendered: expectProfileSectionsAndFieldsToBeRendered, expectProfileSectionsNotToBeRendered: expectProfileSectionsNotToBeRendered - }; }); diff --git a/lms/static/js/spec/student_profile/learner_profile_factory_spec.js b/lms/static/js/spec/student_profile/learner_profile_factory_spec.js index e797243b26..7d3bd8e1bc 100644 --- a/lms/static/js/spec/student_profile/learner_profile_factory_spec.js +++ b/lms/static/js/spec/student_profile/learner_profile_factory_spec.js @@ -28,7 +28,7 @@ define(['backbone', 'jquery', 'underscore', 'js/common_helpers/ajax_helpers', 'j }); var createProfilePage = function(ownProfile) { - return LearnerProfilePage({ + return new LearnerProfilePage({ 'accounts_api_url': Helpers.USER_ACCOUNTS_API_URL, 'preferences_api_url': Helpers.USER_PREFERENCES_API_URL, 'own_profile': ownProfile, @@ -39,7 +39,8 @@ define(['backbone', 'jquery', 'underscore', 'js/common_helpers/ajax_helpers', 'j 'profile_image_max_bytes': Helpers.IMAGE_MAX_BYTES, 'profile_image_min_bytes': Helpers.IMAGE_MIN_BYTES, 'profile_image_upload_url': Helpers.IMAGE_UPLOAD_API_URL, - 'profile_image_remove_url': Helpers.IMAGE_REMOVE_API_URL + 'profile_image_remove_url': Helpers.IMAGE_REMOVE_API_URL, + 'default_visibility': 'all_users' }); }; @@ -72,7 +73,7 @@ define(['backbone', 'jquery', 'underscore', 'js/common_helpers/ajax_helpers', 'j expect(userAccountRequest.method).toBe('GET'); expect(userAccountRequest.url).toBe(Helpers.USER_ACCOUNTS_API_URL); - AjaxHelpers.respondWithJson(requests, Helpers.USER_ACCOUNTS_DATA); + AjaxHelpers.respondWithJson(requests, Helpers.createAccountSettingsData()); Helpers.expectLoadingIndicatorIsVisible(learnerProfileView, true); Helpers.expectLoadingErrorIsVisible(learnerProfileView, false); LearnerProfileHelpers.expectProfileSectionsNotToBeRendered(learnerProfileView); @@ -87,20 +88,6 @@ define(['backbone', 'jquery', 'underscore', 'js/common_helpers/ajax_helpers', 'j LearnerProfileHelpers.expectProfileSectionsNotToBeRendered(learnerProfileView); }); - it("renders the limited profile after models are successfully fetched", function() { - - requests = AjaxHelpers.requests(this); - - var context = createProfilePage(true), - learnerProfileView = context.learnerProfileView; - - AjaxHelpers.respondWithJson(requests, Helpers.USER_ACCOUNTS_DATA); - AjaxHelpers.respondWithJson(requests, Helpers.USER_PREFERENCES_DATA); - - Helpers.expectLoadingErrorIsVisible(learnerProfileView, false); - LearnerProfileHelpers.expectLimitedProfileSectionsAndFieldsToBeRendered(learnerProfileView); - }); - it("renders the full profile after models are successfully fetched", function() { requests = AjaxHelpers.requests(this); @@ -108,12 +95,8 @@ define(['backbone', 'jquery', 'underscore', 'js/common_helpers/ajax_helpers', 'j var context = createProfilePage(true), learnerProfileView = context.learnerProfileView; - var accountSettingsData = Helpers.USER_ACCOUNTS_DATA; - accountSettingsData.year_of_birth = 1989; - accountSettingsData.requires_parental_consent = false; - - AjaxHelpers.respondWithJson(requests, accountSettingsData); - AjaxHelpers.respondWithJson(requests, Helpers.USER_PREFERENCES_DATA); + AjaxHelpers.respondWithJson(requests, Helpers.createAccountSettingsData()); + AjaxHelpers.respondWithJson(requests, Helpers.createUserPreferencesData()); // sets the profile for full view. context.accountPreferencesModel.set({account_privacy: 'all_users'}); @@ -127,8 +110,11 @@ define(['backbone', 'jquery', 'underscore', 'js/common_helpers/ajax_helpers', 'j var context = createProfilePage(true), learnerProfileView = context.learnerProfileView; - AjaxHelpers.respondWithJson(requests, Helpers.USER_ACCOUNTS_DATA); - AjaxHelpers.respondWithJson(requests, Helpers.USER_PREFERENCES_DATA); + AjaxHelpers.respondWithJson(requests, Helpers.createAccountSettingsData({ + year_of_birth: '', + requires_parental_consent: true + })); + AjaxHelpers.respondWithJson(requests, Helpers.createUserPreferencesData()); LearnerProfileHelpers.expectLimitedProfileSectionsAndFieldsToBeRendered(learnerProfileView); }); @@ -140,11 +126,11 @@ define(['backbone', 'jquery', 'underscore', 'js/common_helpers/ajax_helpers', 'j var context = createProfilePage(true), learnerProfileView = context.learnerProfileView; - var accountSettingsData = Helpers.USER_ACCOUNTS_DATA; - accountSettingsData.requires_parental_consent = true; - - AjaxHelpers.respondWithJson(requests, accountSettingsData); - AjaxHelpers.respondWithJson(requests, Helpers.USER_PREFERENCES_DATA); + AjaxHelpers.respondWithJson(requests, Helpers.createAccountSettingsData({ + year_of_birth: new Date().getFullYear() - 10, + requires_parental_consent: true + })); + AjaxHelpers.respondWithJson(requests, Helpers.createUserPreferencesData()); LearnerProfileHelpers.expectLimitedProfileSectionsAndFieldsToBeRendered(learnerProfileView); }); diff --git a/lms/static/js/spec/student_profile/learner_profile_view_spec.js b/lms/static/js/spec/student_profile/learner_profile_view_spec.js index ddf0ebac87..2ee04608ee 100644 --- a/lms/static/js/spec/student_profile/learner_profile_view_spec.js +++ b/lms/static/js/spec/student_profile/learner_profile_view_spec.js @@ -19,10 +19,7 @@ define(['backbone', 'jquery', 'underscore', 'js/common_helpers/ajax_helpers', 'j var createLearnerProfileView = function (ownProfile, accountPrivacy, profileIsPublic) { var accountSettingsModel = new UserAccountModel(); - var accountSettingsData = Helpers.USER_ACCOUNTS_DATA; - accountSettingsData.year_of_birth = 1989; - accountSettingsData.requires_parental_consent = false; - accountSettingsModel.set(accountSettingsData); + accountSettingsModel.set(Helpers.createAccountSettingsData()); accountSettingsModel.set({'profile_is_public': profileIsPublic}); accountSettingsModel.set({'profile_image': Helpers.PROFILE_IMAGE}); @@ -76,7 +73,7 @@ define(['backbone', 'jquery', 'underscore', 'js/common_helpers/ajax_helpers', 'j editable: editable, showMessages: false, iconName: 'fa-map-marker', - placeholderValue: 'Add country', + placeholderValue: '', valueAttribute: "country", options: Helpers.FIELD_OPTIONS, helpMessage: '' diff --git a/lms/static/js/student_profile/views/learner_profile_factory.js b/lms/static/js/student_profile/views/learner_profile_factory.js index 408d532512..4b88bc7672 100644 --- a/lms/static/js/student_profile/views/learner_profile_factory.js +++ b/lms/static/js/student_profile/views/learner_profile_factory.js @@ -15,8 +15,13 @@ return function (options) { var learnerProfileElement = $('.wrapper-profile'); - - var accountPreferencesModel = new AccountPreferencesModel(); + var defaultVisibility = options.default_visibility; + var AccountPreferencesModelWithDefaults = AccountPreferencesModel.extend({ + defaults: { + account_privacy: defaultVisibility + } + }); + var accountPreferencesModel = new AccountPreferencesModelWithDefaults(); accountPreferencesModel.url = options.preferences_api_url; var accountSettingsModel = new AccountSettingsModel({ @@ -70,7 +75,7 @@ editable: editable, showMessages: false, iconName: 'fa-map-marker', - placeholderValue: gettext('Add country'), + placeholderValue: '', valueAttribute: "country", options: options.country_options, helpMessage: '' @@ -143,7 +148,12 @@ // Fetch the preferences model if the user has access if (options.has_preferences_access) { accountPreferencesModel.fetch({ - success: showLearnerProfileView, + success: function() { + if (accountSettingsModel.get('requires_parental_consent')) { + accountPreferencesModel.set('account_privacy', 'private'); + } + showLearnerProfileView(); + }, error: showLoadingError }); }