Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Set default dashboard for users and fix a bug in preferences for default dashboard. #3781

Merged
merged 9 commits into from Aug 22, 2017
6 changes: 6 additions & 0 deletions core/controllers/profile.py
Expand Up @@ -281,6 +281,7 @@ def post(self):
"""Handles POST requests."""
username = self.payload.get('username')
agreed_to_terms = self.payload.get('agreed_to_terms')
default_dashboard = self.payload.get('default_dashboard')
can_receive_email_updates = self.payload.get(
'can_receive_email_updates')

Expand Down Expand Up @@ -318,6 +319,11 @@ def post(self):

user_services.generate_initial_profile_picture(self.user_id)

if not has_ever_registered:
# Set the default dashboard for new users.
user_services.update_user_default_dashboard(
self.user_id, default_dashboard)

self.render_json({})


Expand Down
41 changes: 41 additions & 0 deletions core/controllers/profile_test.py
Expand Up @@ -14,6 +14,8 @@

"""Tests for the profile page."""

from constants import constants

from core.domain import exp_services
from core.domain import rights_manager
from core.domain import subscription_services
Expand Down Expand Up @@ -113,6 +115,45 @@ def test_username_is_handled_correctly(self):

self.logout()

def test_default_dashboard_for_new_users(self):
self.login(self.EDITOR_EMAIL)
response = self.testapp.get(feconf.SIGNUP_URL)
csrf_token = self.get_csrf_token_from_response(response)

# This user should have the creator dashboard as default.
self.post_json(
feconf.SIGNUP_DATA_URL,
{'agreed_to_terms': True, 'username': 'creatoruser',
'default_dashboard': constants.DASHBOARD_TYPE_CREATOR,
'can_receive_email_updates': None},
csrf_token)

user_id = user_services.get_user_id_from_username('creatoruser')
user_settings = user_services.get_user_settings(user_id)
self.assertEqual(
user_settings.default_dashboard, constants.DASHBOARD_TYPE_CREATOR)

self.logout()

self.login(self.VIEWER_EMAIL)
response = self.testapp.get(feconf.SIGNUP_URL)
csrf_token = self.get_csrf_token_from_response(response)

# This user should have the learner dashboard as default.
self.post_json(
feconf.SIGNUP_DATA_URL,
{'agreed_to_terms': True, 'username': 'learneruser',
'default_dashboard': constants.DASHBOARD_TYPE_LEARNER,
'can_receive_email_updates': None},
csrf_token)

user_id = user_services.get_user_id_from_username('learneruser')
user_settings = user_services.get_user_settings(user_id)
self.assertEqual(
user_settings.default_dashboard, constants.DASHBOARD_TYPE_LEARNER)

self.logout()


class UsernameCheckHandlerTests(test_utils.GenericTestBase):

Expand Down
6 changes: 5 additions & 1 deletion core/storage/user/gae_models.py
Expand Up @@ -58,7 +58,11 @@ class UserSettingsModel(base_models.BaseModel):
profile_picture_data_url = ndb.TextProperty(default=None, indexed=False)
# The preferred dashboard of the user.
default_dashboard = ndb.StringProperty(
default=constants.DASHBOARD_TYPE_LEARNER, indexed=False)
default=constants.DASHBOARD_TYPE_LEARNER,
indexed=False,
choices=[
constants.DASHBOARD_TYPE_LEARNER,
constants.DASHBOARD_TYPE_CREATOR])
# User specified biography (to be shown on their profile page).
user_bio = ndb.TextProperty(indexed=False)
# Subject interests specified by the user.
Expand Down
4 changes: 2 additions & 2 deletions core/templates/dev/head/pages/preferences/preferences.html
Expand Up @@ -72,13 +72,13 @@
<div class="col-lg-10 col-md-10 col-sm-10">
<div class="checkbox" style="padding-top: 0;">
<label>
<input type="radio" ng-model="defaultDashboard" value="DASHBOARD_TYPE_CREATOR" ng-change="saveDefaultDashboard(defaultDashboard)">
<input type="radio" ng-model="defaultDashboard" value="<[DASHBOARD_TYPE_CREATOR]>" ng-change="saveDefaultDashboard(defaultDashboard)">
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Optional: would ng-value be better? I'm not sure.

Also, is this actually an error in production -- i.e. is a hotfix needed?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we also have e2e tests to verify that the default dashboard is changed when the preferences are changed?

<span translate="I18N_TOPNAV_CREATOR_DASHBOARD"></span>
</label>
</div>
<div class="checkbox" style="padding-top: 0;">
<label>
<input type="radio" ng-model="defaultDashboard" value="DASHBOARD_TYPE_LEARNER" ng-change="saveDefaultDashboard(defaultDashboard)">
<input type="radio" ng-model="defaultDashboard" value="<[DASHBOARD_TYPE_LEARNER]>" ng-change="saveDefaultDashboard(defaultDashboard)">
<span translate="I18N_TOPNAV_LEARNER_DASHBOARD"></span>
</label>
</div>
Expand Down
17 changes: 17 additions & 0 deletions core/templates/dev/head/pages/signup/Signup.js
Expand Up @@ -124,6 +124,23 @@ oppia.controller('Signup', [
agreed_to_terms: agreedToTerms,
can_receive_email_updates: null
};

var defaultDashboard = constants.DASHBOARD_TYPE_LEARNER;
var returnUrl = window.decodeURIComponent(
urlService.getUrlParams().return_url);

if (returnUrl.indexOf('creator_dashboard') !== -1) {
defaultDashboard = constants.DASHBOARD_TYPE_CREATOR;
} else {
defaultDashboard = constants.DASHBOARD_TYPE_LEARNER;
}

var requestParams = {
agreed_to_terms: agreedToTerms,
can_receive_email_updates: null,
default_dashboard: defaultDashboard
};

if (!$scope.hasUsername) {
requestParams.username = username;
}
Expand Down