diff --git a/common/test/acceptance/tests/lms/test_lms_dashboard.py b/common/test/acceptance/tests/lms/test_lms_dashboard.py
index b600dcfe68..276cbf4340 100644
--- a/common/test/acceptance/tests/lms/test_lms_dashboard.py
+++ b/common/test/acceptance/tests/lms/test_lms_dashboard.py
@@ -10,8 +10,8 @@ from common.test.acceptance.fixtures.course import CourseFixture
from common.test.acceptance.pages.lms.auto_auth import AutoAuthPage
from common.test.acceptance.pages.lms.dashboard import DashboardPage
-DEFAULT_SHORT_DATE_FORMAT = '{dt:%b} {dt.day}, {dt.year}'
-TEST_DATE_FORMAT = '{dt:%b} {dt.day}, {dt.year} {dt.hour}:{dt.minute:02}'
+DEFAULT_SHORT_DATE_FORMAT = "%b %d, %Y"
+DEFAULT_DAY_AND_TIME_FORMAT = "%A at %-I%P"
class BaseLmsDashboardTest(UniqueCourseTest):
@@ -193,7 +193,7 @@ class LmsDashboardPageTest(BaseLmsDashboardTest):
})
self.course_fixture.configure_course()
- end_date = DEFAULT_SHORT_DATE_FORMAT.format(dt=course_end_date)
+ end_date = course_end_date.strftime(DEFAULT_SHORT_DATE_FORMAT)
expected_course_date = "Ended - {end_date}".format(end_date=end_date)
# reload the page for changes to course date changes to appear in dashboard
@@ -226,7 +226,7 @@ class LmsDashboardPageTest(BaseLmsDashboardTest):
})
self.course_fixture.configure_course()
- start_date = DEFAULT_SHORT_DATE_FORMAT.format(dt=course_start_date)
+ start_date = course_start_date.strftime(DEFAULT_SHORT_DATE_FORMAT)
expected_course_date = "Started - {start_date}".format(start_date=start_date)
# reload the page for changes to course date changes to appear in dashboard
@@ -259,7 +259,7 @@ class LmsDashboardPageTest(BaseLmsDashboardTest):
})
self.course_fixture.configure_course()
- start_date = DEFAULT_SHORT_DATE_FORMAT.format(dt=course_start_date)
+ start_date = course_start_date.strftime(DEFAULT_SHORT_DATE_FORMAT)
expected_course_date = "Starts - {start_date}".format(start_date=start_date)
# reload the page for changes to course date changes to appear in dashboard
@@ -293,8 +293,8 @@ class LmsDashboardPageTest(BaseLmsDashboardTest):
})
self.course_fixture.configure_course()
- start_date = TEST_DATE_FORMAT.format(dt=course_start_date)
- expected_course_date = "Starts - {start_date} GMT".format(start_date=start_date)
+ start_date = course_start_date.strftime(DEFAULT_DAY_AND_TIME_FORMAT)
+ expected_course_date = "Starts - {start_date} UTC".format(start_date=start_date)
# reload the page for changes to course date changes to appear in dashboard
self.dashboard_page.visit()
diff --git a/lms/djangoapps/ccx/tests/test_field_override_performance.py b/lms/djangoapps/ccx/tests/test_field_override_performance.py
index 6d7e8ddb91..1a8fc76fe3 100644
--- a/lms/djangoapps/ccx/tests/test_field_override_performance.py
+++ b/lms/djangoapps/ccx/tests/test_field_override_performance.py
@@ -229,18 +229,18 @@ class TestFieldOverrideMongoPerformance(FieldOverridePerformanceTestCase):
# # of sql queries to default,
# # of mongo queries,
# )
- ('no_overrides', 1, True, False): (21, 6),
- ('no_overrides', 2, True, False): (21, 6),
- ('no_overrides', 3, True, False): (21, 6),
- ('ccx', 1, True, False): (21, 6),
- ('ccx', 2, True, False): (21, 6),
- ('ccx', 3, True, False): (21, 6),
- ('no_overrides', 1, False, False): (21, 6),
- ('no_overrides', 2, False, False): (21, 6),
- ('no_overrides', 3, False, False): (21, 6),
- ('ccx', 1, False, False): (21, 6),
- ('ccx', 2, False, False): (21, 6),
- ('ccx', 3, False, False): (21, 6),
+ ('no_overrides', 1, True, False): (18, 6),
+ ('no_overrides', 2, True, False): (18, 6),
+ ('no_overrides', 3, True, False): (18, 6),
+ ('ccx', 1, True, False): (18, 6),
+ ('ccx', 2, True, False): (18, 6),
+ ('ccx', 3, True, False): (18, 6),
+ ('no_overrides', 1, False, False): (18, 6),
+ ('no_overrides', 2, False, False): (18, 6),
+ ('no_overrides', 3, False, False): (18, 6),
+ ('ccx', 1, False, False): (18, 6),
+ ('ccx', 2, False, False): (18, 6),
+ ('ccx', 3, False, False): (18, 6),
}
@@ -252,19 +252,19 @@ class TestFieldOverrideSplitPerformance(FieldOverridePerformanceTestCase):
__test__ = True
TEST_DATA = {
- ('no_overrides', 1, True, False): (21, 3),
- ('no_overrides', 2, True, False): (21, 3),
- ('no_overrides', 3, True, False): (21, 3),
- ('ccx', 1, True, False): (21, 3),
- ('ccx', 2, True, False): (21, 3),
- ('ccx', 3, True, False): (21, 3),
- ('ccx', 1, True, True): (22, 3),
- ('ccx', 2, True, True): (22, 3),
- ('ccx', 3, True, True): (22, 3),
- ('no_overrides', 1, False, False): (21, 3),
- ('no_overrides', 2, False, False): (21, 3),
- ('no_overrides', 3, False, False): (21, 3),
- ('ccx', 1, False, False): (21, 3),
- ('ccx', 2, False, False): (21, 3),
- ('ccx', 3, False, False): (21, 3),
+ ('no_overrides', 1, True, False): (18, 3),
+ ('no_overrides', 2, True, False): (18, 3),
+ ('no_overrides', 3, True, False): (18, 3),
+ ('ccx', 1, True, False): (18, 3),
+ ('ccx', 2, True, False): (18, 3),
+ ('ccx', 3, True, False): (18, 3),
+ ('ccx', 1, True, True): (19, 3),
+ ('ccx', 2, True, True): (19, 3),
+ ('ccx', 3, True, True): (19, 3),
+ ('no_overrides', 1, False, False): (18, 3),
+ ('no_overrides', 2, False, False): (18, 3),
+ ('no_overrides', 3, False, False): (18, 3),
+ ('ccx', 1, False, False): (18, 3),
+ ('ccx', 2, False, False): (18, 3),
+ ('ccx', 3, False, False): (18, 3),
}
diff --git a/lms/djangoapps/courseware/context_processor.py b/lms/djangoapps/courseware/context_processor.py
deleted file mode 100644
index 07f98191a0..0000000000
--- a/lms/djangoapps/courseware/context_processor.py
+++ /dev/null
@@ -1,46 +0,0 @@
-"""
-This is the courseware context_processor module.
-
-This is meant to simplify the process of sending user preferences (espec. time_zone and pref-lang)
-to the templates without having to append every view file.
-
-"""
-from openedx.core.djangoapps.user_api.errors import UserNotFound, UserAPIInternalError
-from openedx.core.djangoapps.user_api.preferences.api import get_user_preferences
-import request_cache
-
-RETRIEVABLE_PREFERENCES = {
- 'user_timezone': 'time_zone',
- 'user_language': 'pref-lang'
-}
-CACHE_NAME = "context_processor.user_timezone_preferences"
-
-
-def user_timezone_locale_prefs(request):
- """
- Checks if request has an authenticated user.
- If so, sends set (or none if unset) time_zone and language prefs.
-
- This interacts with the DateUtils to either display preferred or attempt to determine
- system/browser set time_zones and languages
-
- """
- cached_value = request_cache.get_cache(CACHE_NAME)
- if not cached_value:
- user_prefs = {
- 'user_timezone': None,
- 'user_language': None,
- }
- if hasattr(request, 'user') and request.user.is_authenticated():
- try:
- user_preferences = get_user_preferences(request.user)
- except (UserNotFound, UserAPIInternalError):
- cached_value.update(user_prefs)
- else:
- user_prefs = {
- key: user_preferences.get(pref_name, None)
- for key, pref_name in RETRIEVABLE_PREFERENCES.iteritems()
- }
-
- cached_value.update(user_prefs)
- return cached_value
diff --git a/lms/djangoapps/courseware/date_summary.py b/lms/djangoapps/courseware/date_summary.py
index e6aaf5524f..abda7d96af 100644
--- a/lms/djangoapps/courseware/date_summary.py
+++ b/lms/djangoapps/courseware/date_summary.py
@@ -4,7 +4,6 @@ page. Each block gives information about a particular
course-run-specific date which will be displayed to the user.
"""
from datetime import datetime
-from pytz import timezone, utc
from babel.dates import format_timedelta
from django.core.urlresolvers import reverse
@@ -13,12 +12,13 @@ from django.utils.translation import ugettext_lazy
from django.utils.translation import to_locale, get_language
from edxmako.shortcuts import render_to_string
from lazy import lazy
+from pytz import utc
from course_modes.models import CourseMode
from lms.djangoapps.commerce.utils import EcommerceService
from lms.djangoapps.verify_student.models import VerificationDeadline, SoftwareSecurePhotoVerification
+from openedx.core.lib.time_zone_utils import get_time_zone_abbr, get_user_time_zone
from student.models import CourseEnrollment
-from openedx.core.lib.time_zone_utils import get_time_zone_abbr
class DateSummary(object):
@@ -67,12 +67,8 @@ class DateSummary(object):
@property
def time_zone(self):
- """
- The time zone in which to display -- defaults to UTC
- """
- return timezone(
- self.user.preferences.model.get_value(self.user, "time_zone", "UTC")
- )
+ """The time zone to display in"""
+ return get_user_time_zone(self.user)
def __init__(self, course, user):
self.course = course
diff --git a/lms/djangoapps/courseware/tests/test_context_processor.py b/lms/djangoapps/courseware/tests/test_context_processor.py
deleted file mode 100644
index 73b86a36f7..0000000000
--- a/lms/djangoapps/courseware/tests/test_context_processor.py
+++ /dev/null
@@ -1,43 +0,0 @@
-"""
-Unit tests for courseware context_processor
-"""
-from django.contrib.auth.models import AnonymousUser
-from mock import Mock
-
-from student.tests.factories import UserFactory
-from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
-from openedx.core.djangoapps.user_api.preferences.api import set_user_preference
-
-from courseware.context_processor import user_timezone_locale_prefs
-
-
-class UserPrefContextProcessorUnitTest(ModuleStoreTestCase):
- """
- Unit test for courseware context_processor
- """
- def setUp(self):
- super(UserPrefContextProcessorUnitTest, self).setUp()
-
- self.user = UserFactory.create()
- self.request = Mock()
- self.request.user = self.user
-
- def test_anonymous_user(self):
- self.request.user = AnonymousUser()
- context = user_timezone_locale_prefs(self.request)
- self.assertIsNone(context['user_timezone'])
- self.assertIsNone(context['user_language'])
-
- def test_no_timezone_preference(self):
- set_user_preference(self.user, 'pref-lang', 'en')
- context = user_timezone_locale_prefs(self.request)
- self.assertIsNone(context['user_timezone'])
- self.assertIsNotNone(context['user_language'])
- self.assertEqual(context['user_language'], 'en')
-
- def test_no_language_preference(self):
- set_user_preference(self.user, 'time_zone', 'Asia/Tokyo')
- context = user_timezone_locale_prefs(self.request)
- self.assertIsNone(context['user_language'])
- self.assertIsNotNone(context['user_timezone'])
- self.assertEqual(context['user_timezone'], 'Asia/Tokyo')
diff --git a/lms/djangoapps/courseware/tests/test_course_info.py b/lms/djangoapps/courseware/tests/test_course_info.py
index ccef2c7a1e..5d9f3702ef 100644
--- a/lms/djangoapps/courseware/tests/test_course_info.py
+++ b/lms/djangoapps/courseware/tests/test_course_info.py
@@ -316,7 +316,7 @@ class SelfPacedCourseInfoTestCase(LoginEnrollmentTestCase, SharedModuleStoreTest
self.assertEqual(resp.status_code, 200)
def test_num_queries_instructor_paced(self):
- self.fetch_course_info_with_queries(self.instructor_paced_course, 21, 4)
+ self.fetch_course_info_with_queries(self.instructor_paced_course, 18, 4)
def test_num_queries_self_paced(self):
- self.fetch_course_info_with_queries(self.self_paced_course, 21, 4)
+ self.fetch_course_info_with_queries(self.self_paced_course, 18, 4)
diff --git a/lms/djangoapps/courseware/tests/test_credit_requirements.py b/lms/djangoapps/courseware/tests/test_credit_requirements.py
index 6412c13fe7..fb3d241ad9 100644
--- a/lms/djangoapps/courseware/tests/test_credit_requirements.py
+++ b/lms/djangoapps/courseware/tests/test_credit_requirements.py
@@ -14,6 +14,7 @@ from django.core.urlresolvers import reverse
from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase
from xmodule.modulestore.tests.factories import CourseFactory
from student.tests.factories import UserFactory, CourseEnrollmentFactory
+from util.date_utils import get_time_display, DEFAULT_SHORT_DATE_FORMAT
from course_modes.models import CourseMode
from openedx.core.djangoapps.credit import api as credit_api
@@ -121,8 +122,7 @@ class ProgressPageCreditRequirementsTest(SharedModuleStoreTestCase):
response,
"{}, you have met the requirements for credit in this course.".format(self.USER_FULL_NAME)
)
- self.assertContains(response, "Completed by {date}")
- self.assertContains(response, datetime.datetime.now(UTC).strftime('%Y-%m-%d %H'))
+ self.assertContains(response, "Completed by {date}".format(date=self._now_formatted_date()))
self.assertNotContains(response, "95%")
def test_credit_requirements_not_eligible(self):
@@ -172,3 +172,11 @@ class ProgressPageCreditRequirementsTest(SharedModuleStoreTestCase):
"""Load the progress page for the course the user is enrolled in. """
url = reverse("progress", kwargs={"course_id": unicode(self.course.id)})
return self.client.get(url)
+
+ def _now_formatted_date(self):
+ """Retrieve the formatted current date. """
+ return get_time_display(
+ datetime.datetime.now(UTC),
+ DEFAULT_SHORT_DATE_FORMAT,
+ settings.TIME_ZONE
+ )
diff --git a/lms/djangoapps/courseware/tests/test_views.py b/lms/djangoapps/courseware/tests/test_views.py
index 53f3ca0ce5..af31a7c724 100644
--- a/lms/djangoapps/courseware/tests/test_views.py
+++ b/lms/djangoapps/courseware/tests/test_views.py
@@ -209,7 +209,6 @@ class ViewsTestCase(ModuleStoreTestCase):
parent_location=self.chapter.location,
due=datetime(2013, 9, 18, 11, 30, 00),
display_name='Sequential 1',
- format='Homework'
)
self.vertical = ItemFactory.create(
category='vertical',
@@ -908,22 +907,33 @@ class ViewsTestCase(ModuleStoreTestCase):
self.assertEqual(response.status_code, 200)
def test_accordion(self):
- """
- This needs a response_context, which is not included in the render_accordion's main method
- returning a render_to_string, so we will render via the courseware URL in order to include
- the needed context
- """
- course_id = quote(unicode(self.course.id).encode("utf-8"))
- response = self.client.get(
- reverse('courseware', args=[unicode(course_id)]),
- follow=True
+ request = RequestFactory().get('foo')
+ request.user = self.user
+ table_of_contents = toc_for_course(
+ request.user,
+ request,
+ self.course,
+ unicode(self.course.get_children()[0].scope_ids.usage_id),
+ None,
+ None
+ )
+
+ # removes newlines and whitespace from the returned view string
+ view = ''.join(render_accordion(request, self.course, table_of_contents['chapters'], 'en').split())
+ # the course id unicode is re-encoded here because the quote function does not accept unicode
+ course_id = quote(unicode(self.course.id).encode("utf-8"))
+
+ self.assertIn(
+ u'href="/courses/{}/courseware/Chapter_1/Sequential_1/">
Sequential 1 current section
', - 'Sequential 2
' - ] - for test in test_responses: - self.assertContains(response, test) @attr(shard=1) @@ -950,8 +960,7 @@ class BaseDueDateTests(ModuleStoreTestCase): section = ItemFactory.create( category='sequential', parent_location=chapter.location, - due=datetime(2013, 9, 18, 11, 30, 00), - format='homework' + due=datetime(2013, 9, 18, 11, 30, 00) ) vertical = ItemFactory.create(category='vertical', parent_location=section.location) ItemFactory.create(category='problem', parent_location=vertical.location) @@ -966,7 +975,8 @@ class BaseDueDateTests(ModuleStoreTestCase): self.user = UserFactory.create() self.assertTrue(self.client.login(username=self.user.username, password='test')) - self.time_with_tz = "2013-09-18 11:30:00+00:00" + self.time_with_tz = "due Sep 18, 2013 at 11:30 UTC" + self.time_without_tz = "due Sep 18, 2013 at 11:30" def test_backwards_compatability(self): # The test course being used has show_timezone = False in the policy file @@ -975,7 +985,8 @@ class BaseDueDateTests(ModuleStoreTestCase): # remove the timezone. course = self.set_up_course(due_date_display_format=None, show_timezone=False) response = self.get_response(course) - self.assertContains(response, self.time_with_tz) + self.assertContains(response, self.time_without_tz) + self.assertNotContains(response, self.time_with_tz) # Test that show_timezone has been cleared (which means you get the default value of True). self.assertTrue(course.show_timezone) @@ -990,11 +1001,25 @@ class BaseDueDateTests(ModuleStoreTestCase): response = self.get_response(course) self.assertContains(response, self.time_with_tz) + def test_format_plain_text(self): + # plain text due date + course = self.set_up_course(due_date_display_format="foobar") + response = self.get_response(course) + self.assertNotContains(response, self.time_with_tz) + self.assertContains(response, "due foobar") + def test_format_date(self): # due date with no time course = self.set_up_course(due_date_display_format=u"%b %d %y") response = self.get_response(course) - self.assertContains(response, self.time_with_tz) + self.assertNotContains(response, self.time_with_tz) + self.assertContains(response, "due Sep 18 13") + + def test_format_hidden(self): + # hide due date completely + course = self.set_up_course(due_date_display_format=u"") + response = self.get_response(course) + self.assertNotContains(response, "due ") def test_format_invalid(self): # improperly formatted due_date_display_format falls through to default @@ -1024,10 +1049,7 @@ class TestAccordionDueDate(BaseDueDateTests): def get_response(self, course): """ Returns the HTML for the accordion """ - return self.client.get( - reverse('courseware', args=[unicode(course.id)]), - follow=True - ) + return self.client.get(reverse('courseware', args=[unicode(course.id)]), follow=True) @attr(shard=1) @@ -1067,17 +1089,14 @@ class StartDateTests(ModuleStoreTestCase): course = self.set_up_course() response = self.get_about_response(course.id) # The start date is set in the set_up_course function above. - # This should return in the format '%Y-%m-%dT%H:%M:%S%z' - self.assertContains(response, "2013-09-16T07:17:28+0000") + self.assertContains(response, "2013-SEPTEMBER-16") - @patch( - 'util.date_utils.pgettext', - fake_pgettext(translations={("abbreviated month name", "Jul"): "JULY", }) - ) - @patch( - 'util.date_utils.ugettext', - fake_ugettext(translations={"SHORT_DATE_FORMAT": "%Y-%b-%d", }) - ) + @patch('util.date_utils.pgettext', fake_pgettext(translations={ + ("abbreviated month name", "Jul"): "JULY", + })) + @patch('util.date_utils.ugettext', fake_ugettext(translations={ + "SHORT_DATE_FORMAT": "%Y-%b-%d", + })) @unittest.skip def test_format_localized_in_xml_course(self): response = self.get_about_response(SlashSeparatedCourseKey('edX', 'toy', 'TT_2012_Fall')) @@ -1326,17 +1345,17 @@ class ProgressPageTests(ModuleStoreTestCase): """Test that query counts remain the same for self-paced and instructor-paced courses.""" SelfPacedConfiguration(enabled=self_paced_enabled).save() self.setup_course(self_paced=self_paced) - with self.assertNumQueries(38), check_mongo_calls(4): + with self.assertNumQueries(35), check_mongo_calls(4): self._get_progress_page() def test_progress_queries(self): self.setup_course() - with self.assertNumQueries(38), check_mongo_calls(4): + with self.assertNumQueries(35), check_mongo_calls(4): self._get_progress_page() # subsequent accesses to the progress page require fewer queries. for _ in range(2): - with self.assertNumQueries(24), check_mongo_calls(4): + with self.assertNumQueries(21), check_mongo_calls(4): self._get_progress_page() @patch( diff --git a/lms/djangoapps/courseware/views/index.py b/lms/djangoapps/courseware/views/index.py index 337ebb57a5..d3fe5938ef 100644 --- a/lms/djangoapps/courseware/views/index.py +++ b/lms/djangoapps/courseware/views/index.py @@ -24,6 +24,7 @@ import urllib from xblock.fragment import Fragment from opaque_keys.edx.keys import CourseKey +from openedx.core.lib.time_zone_utils import get_user_time_zone from openedx.core.djangoapps.lang_pref import LANGUAGE_KEY from openedx.core.djangoapps.user_api.preferences.api import get_user_preference from shoppingcart.models import CourseRegistrationCode @@ -401,6 +402,7 @@ class CoursewareIndex(View): self.request, self.course, table_of_contents['chapters'], + courseware_context['language_preference'], ) # entrance exam data @@ -497,7 +499,7 @@ class CoursewareIndex(View): raise -def render_accordion(request, course, table_of_contents): +def render_accordion(request, course, table_of_contents, language_preference): """ Returns the HTML that renders the navigation for the given course. Expects the table_of_contents to have data on each chapter and section, @@ -509,6 +511,9 @@ def render_accordion(request, course, table_of_contents): ('course_id', unicode(course.id)), ('csrf', csrf(request)['csrf_token']), ('due_date_display_format', course.due_date_display_format), + ('time_zone', request.user.preferences.model.get_value(request.user, "time_zone", None)), + ('language', language_preference), + ] + TEMPLATE_IMPORTS.items() ) return render_to_string('courseware/accordion.html', context) diff --git a/lms/envs/common.py b/lms/envs/common.py index d6a4c52346..52a9349f7c 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -518,9 +518,6 @@ TEMPLATES = [ # Shoppingcart processor (detects if request.user has a cart) 'shoppingcart.context_processor.user_has_cart_context_processor', - # Timezone processor (sends language and time_zone preference) - 'courseware.context_processor.user_timezone_locale_prefs', - # Allows the open edX footer to be leveraged in Django Templates. 'edxmako.shortcuts.footer_context_processor', diff --git a/lms/static/js/dateutil_factory.js b/lms/static/js/dateutil_factory.js index d0b5b6c6a5..8638d3279a 100644 --- a/lms/static/js/dateutil_factory.js +++ b/lms/static/js/dateutil_factory.js @@ -36,8 +36,8 @@ context = { datetime: $(this).data('datetime'), timezone: $(this).data('timezone'), - language: $(this).data('language'), - format: DateUtils.dateFormatEnum[$(this).data('format')] + language: $(this).attr('lang'), + format: $(this).data('format') }; displayDatetime = stringHandler( localizedTime(context), @@ -45,11 +45,6 @@ $(this).data('datetoken') ); $(this).text(displayDatetime); - } else { - displayDatetime = stringHandler( - $(this).data('string') - ); - $(this).text(displayDatetime); } }); }; diff --git a/lms/static/js/spec/dateutil_factory_spec.js b/lms/static/js/spec/dateutil_factory_spec.js index 9e09e7bd30..852ee51a68 100644 --- a/lms/static/js/spec/dateutil_factory_spec.js +++ b/lms/static/js/spec/dateutil_factory_spec.js @@ -35,7 +35,7 @@ define(['../dateutil_factory.js'], function(DateUtilIterator) { 'data-string="Due {date}">' ); Object.keys(testLangs).forEach(function(key) { - $form.attr('data-language', String(key)); + $form.attr('lang', String(key)); $(document.body).append($form); DateUtilIterator.transform(iterationKey); diff --git a/lms/static/js/student_account/views/account_settings_factory.js b/lms/static/js/student_account/views/account_settings_factory.js index c03ac83aba..86fca0e190 100644 --- a/lms/static/js/student_account/views/account_settings_factory.js +++ b/lms/static/js/student_account/views/account_settings_factory.js @@ -116,10 +116,9 @@ title: gettext('Time Zone'), valueAttribute: 'time_zone', helpMessage: gettext( - 'Select the time zone for displaying course dates. ' + - 'If you do not specify a time zone, course dates, ' + - 'including assignment deadlines, will be displayed ' + - 'in your browser\'s local time zone.' + 'Select the time zone for displaying course dates. If you do not specify a ' + + 'time zone here, course dates, including assignment deadlines, are displayed in ' + + 'Coordinated Universal Time (UTC).' ), groupOptions: [{ groupTitle: gettext('All Time Zones'), diff --git a/lms/templates/course.html b/lms/templates/course.html index 5ae2774d79..dfc53ef0ba 100644 --- a/lms/templates/course.html +++ b/lms/templates/course.html @@ -19,31 +19,14 @@ from django.core.urlresolvers import reverse ${course.display_number_with_default} ${course.display_name_with_default} - <% - if course.start is not None: - course_date_string = course.start.strftime('%Y-%m-%dT%H:%M:%S%z') - else: - course_date_string = '' - %> - % if isinstance(course_start_date, str): - - % else: - - % endif - + +% if 'proctoring' in section: @@ -55,12 +57,12 @@ else: ## completed proctored exam statuses should not show the due date ## since the exam has already been submitted by the user % if not section['proctoring'].get('in_completed_state', False): - + ${due_date} % endif % else: ## non-proctored section, we just show the exam format and the due date ## this is the standard case in edx-platform - + ${section['format']} ${due_date} % if 'graded' in section and section['graded']: @@ -85,8 +87,4 @@ else: <%static:require_module_async module_name="js/courseware/accordion_events" class_name="AccordionEvents"> AccordionEvents(); %static:require_module_async> - -<%static:require_module_async module_name="js/dateutil_factory" class_name="DateUtilFactory"> - DateUtilFactory.transform(iterationKey=".localized-datetime"); -%static:require_module_async> % endif diff --git a/lms/templates/courseware/course_about.html b/lms/templates/courseware/course_about.html index 8d6b0ae5e8..bfa62e86ee 100644 --- a/lms/templates/courseware/course_about.html +++ b/lms/templates/courseware/course_about.html @@ -223,40 +223,21 @@ from openedx.core.lib.courses import course_image_url
${_("Course Number")}
${course.display_number_with_default | h}${_("Classes Start")}
- % if isinstance(course_start_date, str): - ${course_start_date} - % else: - <% - course_date_string = course_start_date.strftime('%Y-%m-%dT%H:%M:%S%z') - %> - - % endif -${_("Classes Start")}
${course.start_datetime_text()}${_("Classes End")}
- % if isinstance(course_end_date, str): - ${course_end_date} - % else: - <% - course_date_string = course_end_date.strftime('%Y-%m-%dT%H:%M:%S%z') - %> - - % endif + + % if get_course_about_section(request, course, "end_date"): + ${get_course_about_section(request, course, "end_date")} + % else: + ${course.end_datetime_text()} + % endif +- + <% + formatted_string = get_time_display(section.due, course.due_date_display_format, coerce_tz=settings.TIME_ZONE_DISPLAYED_FOR_DEADLINES) + due_date = '' if len(formatted_string)==0 else _(u'due {date}').format(date=formatted_string) + %> + ${due_date | h}
%endif %if len(section.scores) > 0: @@ -192,6 +197,3 @@ from django.utils.http import urlquote_plus -<%static:require_module_async module_name="js/dateutil_factory" class_name="DateUtilFactory"> - DateUtilFactory.transform(iterationKey=".localized-datetime"); -%static:require_module_async> diff --git a/lms/templates/dashboard/_dashboard_course_listing.html b/lms/templates/dashboard/_dashboard_course_listing.html index 52637a3ade..14774c0e6a 100644 --- a/lms/templates/dashboard/_dashboard_course_listing.html +++ b/lms/templates/dashboard/_dashboard_course_listing.html @@ -10,6 +10,7 @@ from course_modes.models import CourseMode from course_modes.helpers import enrollment_mode_display from openedx.core.djangolib.js_utils import dump_js_escaped_json from openedx.core.djangolib.markup import HTML, Text +from openedx.core.lib.time_zone_utils import get_user_time_zone from student.helpers import ( VERIFY_STATUS_NEED_TO_VERIFY, VERIFY_STATUS_SUBMITTED, @@ -98,37 +99,20 @@ from student.helpers import (