Merge pull request #12667 from edx/kkim/tz_pref_AS
Time Zone in Account Settings
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user