Merge pull request #12667 from edx/kkim/tz_pref_AS

Time Zone in Account Settings
This commit is contained in:
Kevin Kim
2016-06-28 13:10:10 -04:00
committed by GitHub
20 changed files with 227 additions and 77 deletions

View File

@@ -85,7 +85,6 @@ class UserReadOnlySerializer(serializers.Serializer):
user,
self.context.get('request')
),
"time_zone": None,
"language_proficiencies": LanguageProficiencySerializer(
profile.language_proficiencies.all(),
many=True

View File

@@ -8,6 +8,9 @@ from django.db.models.signals import post_delete, pre_save, post_save
from django.dispatch import receiver
from model_utils.models import TimeStampedModel
from pytz import common_timezones
from util.date_utils import get_formatted_time_zone
from util.model_utils import get_changed_fields_dict, emit_setting_changed_event
from xmodule_django.models import CourseKeyField
@@ -27,6 +30,10 @@ class UserPreference(models.Model):
key = models.CharField(max_length=255, db_index=True, validators=[RegexValidator(KEY_REGEX)])
value = models.TextField()
TIME_ZONE_CHOICES = [
(tz, get_formatted_time_zone(tz)) for tz in common_timezones
]
class Meta(object):
unique_together = ("user", "key")

View File

@@ -21,6 +21,8 @@ from ..helpers import intercept_errors
from ..models import UserOrgTag, UserPreference
from ..serializers import UserSerializer, RawUserPreferenceSerializer
from pytz import common_timezones_set
log = logging.getLogger(__name__)
@@ -392,6 +394,17 @@ def validate_user_preference_serializer(serializer, preference_key, preference_v
"user_message": user_message,
}
})
if preference_key == "time_zone" and preference_value not in common_timezones_set:
developer_message = ugettext_noop(u"Value '{preference_value}' not valid for preference '{preference_key}': Not in timezone set.") # pylint: disable=line-too-long
user_message = ugettext_noop(u"Value '{preference_value}' is not valid for user preference '{preference_key}'.")
raise PreferenceValidationError({
preference_key: {
"developer_message": developer_message.format(
preference_key=preference_key, preference_value=preference_value
),
"user_message": user_message.format(preference_key=preference_key, preference_value=preference_value)
}
})
def _create_preference_update_error(preference_key, preference_value, error):

View File

@@ -90,11 +90,13 @@ class TestPreferencesAPI(UserAPITestCase):
# Create some test preferences values.
set_user_preference(self.user, "dict_pref", {"int_key": 10})
set_user_preference(self.user, "string_pref", "value")
set_user_preference(self.user, "time_zone", "Asia/Tokyo")
# Log in the client and do the GET.
client = self.login_client(api_client, user)
response = self.send_get(client)
self.assertEqual({"dict_pref": "{'int_key': 10}", "string_pref": "value"}, response.data)
self.assertEqual({"dict_pref": "{'int_key': 10}", "string_pref": "value", "time_zone": "Asia/Tokyo"},
response.data)
@ddt.data(
("client", "user"),
@@ -178,6 +180,7 @@ class TestPreferencesAPI(UserAPITestCase):
set_user_preference(self.user, "dict_pref", {"int_key": 10})
set_user_preference(self.user, "string_pref", "value")
set_user_preference(self.user, "extra_pref", "extra_value")
set_user_preference(self.user, "time_zone", "Asia/Macau")
# Send the patch request
self.client.login(username=self.user.username, password=self.test_password)
@@ -187,6 +190,7 @@ class TestPreferencesAPI(UserAPITestCase):
"string_pref": "updated_value",
"new_pref": "new_value",
"extra_pref": None,
"time_zone": "Europe/London",
},
expected_status=204
)
@@ -197,6 +201,7 @@ class TestPreferencesAPI(UserAPITestCase):
"dict_pref": "{'int_key': 10}",
"string_pref": "updated_value",
"new_pref": "new_value",
"time_zone": "Europe/London",
}
self.assertEqual(expected_preferences, response.data)
@@ -208,6 +213,7 @@ class TestPreferencesAPI(UserAPITestCase):
set_user_preference(self.user, "dict_pref", {"int_key": 10})
set_user_preference(self.user, "string_pref", "value")
set_user_preference(self.user, "extra_pref", "extra_value")
set_user_preference(self.user, "time_zone", "Pacific/Midway")
# Send the patch request
self.client.login(username=self.user.username, password=self.test_password)
@@ -218,6 +224,7 @@ class TestPreferencesAPI(UserAPITestCase):
TOO_LONG_PREFERENCE_KEY: "new_value",
"new_pref": "new_value",
u"empty_pref_ȻħȺɍłɇs": "",
"time_zone": "Asia/Africa",
},
expected_status=400
)
@@ -238,6 +245,11 @@ class TestPreferencesAPI(UserAPITestCase):
"developer_message": u"Preference 'empty_pref_ȻħȺɍłɇs' cannot be set to an empty value.",
"user_message": u"Preference 'empty_pref_ȻħȺɍłɇs' cannot be set to an empty value.",
},
"time_zone": {
"developer_message": u"Value 'Asia/Africa' not valid for preference 'time_zone': Not in "
u"timezone set.",
"user_message": u"Value 'Asia/Africa' is not valid for user preference 'time_zone'."
},
}
)
@@ -247,6 +259,7 @@ class TestPreferencesAPI(UserAPITestCase):
u"dict_pref": u"{'int_key': 10}",
u"string_pref": u"value",
u"extra_pref": u"extra_value",
u"time_zone": u"Pacific/Midway",
}
self.assertEqual(expected_preferences, response.data)