Commit 95ad1826 by cahrens

Hide show_timezone from Advanced Settings and migrate courses with…

Hide show_timezone from Advanced Settings and migrate courses with show_timezone=False to using due_date_display_format.
parent 08d99429
......@@ -20,7 +20,8 @@ class CourseMetadata(object):
'enrollment_end',
'tabs',
'graceperiod',
'checklists']
'checklists',
'show_timezone']
@classmethod
def fetch(cls, course_location):
......
......@@ -337,7 +337,10 @@ class CourseFields(object):
"action_external": False}]}
])
info_sidebar_name = String(scope=Scope.settings, default='Course Handouts')
show_timezone = Boolean(help="True if timezones should be shown on dates in the courseware", scope=Scope.settings, default=True)
show_timezone = Boolean(
help="True if timezones should be shown on dates in the courseware. Deprecated in favor of due_date_display_format.",
scope=Scope.settings, default=True
)
due_date_display_format = String(
help="Format supported by strftime for displaying due dates. Takes precedence over show_timezone.",
scope=Scope.settings, default=None
......@@ -395,7 +398,13 @@ class CourseDescriptor(CourseFields, SequenceDescriptor):
elif isinstance(self.location, CourseLocator):
self.wiki_slug = self.location.course_id or self.display_name
msg = None
if self.due_date_display_format is None and self.show_timezone is False:
# For existing courses with show_timezone set to False (and no due_date_display_format specified),
# set the due_date_display_format to what would have been shown previously (with no timezone).
# Then remove show_timezone so that if the user clears out the due_date_display_format,
# they get the default date display.
self.due_date_display_format = u"%b %d, %Y at %H:%M"
delattr(self, 'show_timezone')
# NOTE: relies on the modulestore to call set_grading_policy() right after
# init. (Modulestore is in charge of figuring out where to load the policy from)
......
......@@ -12,12 +12,6 @@ def test_get_default_time_display():
assert_equals(
"Mar 12, 1992 at 15:03 UTC",
get_default_time_display(test_time))
assert_equals(
"Mar 12, 1992 at 15:03 UTC",
get_default_time_display(test_time, True))
assert_equals(
"Mar 12, 1992 at 15:03",
get_default_time_display(test_time, False))
def test_get_default_time_display_notz():
......@@ -25,12 +19,6 @@ def test_get_default_time_display_notz():
assert_equals(
"Mar 12, 1992 at 15:03 UTC",
get_default_time_display(test_time))
assert_equals(
"Mar 12, 1992 at 15:03 UTC",
get_default_time_display(test_time, True))
assert_equals(
"Mar 12, 1992 at 15:03",
get_default_time_display(test_time, False))
def test_get_time_display_return_empty():
......@@ -42,17 +30,16 @@ def test_get_time_display_return_empty():
def test_get_time_display():
test_time = datetime(1992, 3, 12, 15, 3, 30, tzinfo=UTC)
assert_equals("dummy text", get_time_display(test_time, 'dummy text'))
assert_equals("Mar 12 1992", get_time_display(test_time, '%b %d %Y', True))
assert_equals("Mar 12 1992 UTC", get_time_display(test_time, '%b %d %Y %Z', False))
assert_equals("Mar 12 15:03", get_time_display(test_time, '%b %d %H:%M', False))
assert_equals("Mar 12 1992", get_time_display(test_time, '%b %d %Y'))
assert_equals("Mar 12 1992 UTC", get_time_display(test_time, '%b %d %Y %Z'))
assert_equals("Mar 12 15:03", get_time_display(test_time, '%b %d %H:%M'))
def test_get_time_pass_through():
test_time = datetime(1992, 3, 12, 15, 3, 30, tzinfo=UTC)
assert_equals("Mar 12, 1992 at 15:03 UTC", get_time_display(test_time))
assert_equals("Mar 12, 1992 at 15:03", get_time_display(test_time, None, False))
assert_equals("Mar 12, 1992 at 15:03", get_time_display(test_time, "%", False))
assert_equals("Mar 12, 1992 at 15:03 UTC", get_time_display(test_time, "%", True))
assert_equals("Mar 12, 1992 at 15:03 UTC", get_time_display(test_time, None))
assert_equals("Mar 12, 1992 at 15:03 UTC", get_time_display(test_time, "%"))
# pylint: disable=W0232
......@@ -72,12 +59,6 @@ def test_get_default_time_display_no_tzname():
assert_equals(
"Mar 12, 1992 at 15:03-0300",
get_default_time_display(test_time))
assert_equals(
"Mar 12, 1992 at 15:03-0300",
get_default_time_display(test_time, True))
assert_equals(
"Mar 12, 1992 at 15:03",
get_default_time_display(test_time, False))
def test_almost_same_datetime():
......
......@@ -2,51 +2,46 @@
Convenience methods for working with datetime objects
"""
from datetime import timedelta
from django.utils.translation import ugettext as _
def get_default_time_display(dt, show_timezone=True):
def get_default_time_display(dt):
"""
Converts a datetime to a string representation. This is the default
representation used in Studio and LMS.
It is of the form "Apr 09, 2013 at 16:00" or "Apr 09, 2013 at 16:00 UTC",
depending on the value of show_timezone.
It is of the form "Apr 09, 2013 at 16:00 UTC".
If None is passed in for dt, an empty string will be returned.
The default value of show_timezone is True.
"""
if dt is None:
return u""
timezone = u""
if show_timezone:
if dt.tzinfo is not None:
try:
timezone = u" " + dt.tzinfo.tzname(dt)
except NotImplementedError:
timezone = dt.strftime('%z')
else:
timezone = u" UTC"
return unicode(dt.strftime(u"%b %d, %Y {at} %H:%M{tz}")).format(
at=_(u"at"), tz=timezone).strip()
def get_time_display(dt, format_string=None, show_timezone=True):
if dt.tzinfo is not None:
try:
timezone = u" " + dt.tzinfo.tzname(dt)
except NotImplementedError:
timezone = dt.strftime('%z')
else:
timezone = u" UTC"
return unicode(dt.strftime(u"%b %d, %Y at %H:%M{tz}")).format(
tz=timezone).strip()
def get_time_display(dt, format_string=None):
"""
Converts a datetime to a string representation.
If None is passed in for dt, an empty string will be returned.
If the format_string is None, or if format_string is improperly
formatted, this method will return the value from `get_default_time_display`
(passing in the show_timezone argument).
If the format_string is specified, show_timezone is ignored.
formatted, this method will return the value from `get_default_time_display`.
format_string should be a unicode string that is a valid argument for datetime's strftime method.
"""
if dt is None or format_string is None:
return get_default_time_display(dt, show_timezone)
return get_default_time_display(dt)
try:
return unicode(dt.strftime(format_string))
except ValueError:
return get_default_time_display(dt, show_timezone)
return get_default_time_display(dt)
def almost_same_datetime(dt1, dt2, allowed_delta=timedelta(minutes=1)):
......
{"course/2013_fall": {"tabs": [{"type": "courseware"}, {"type": "course_info", "name": "Course Info"}, {"type": "textbooks"}, {"type": "discussion", "name": "Discussion"}, {"type": "wiki", "name": "Wiki"}, {"type": "progress", "name": "Progress"}], "display_name": "due_date", "discussion_topics": {"General": {"id": "i4x-edX-due_date-course-2013_fall"}}}}
\ No newline at end of file
{"course/2013_fall": {"tabs": [{"type": "courseware"}, {"type": "course_info", "name": "Course Info"}, {"type": "textbooks"}, {"type": "discussion", "name": "Discussion"}, {"type": "wiki", "name": "Wiki"}, {"type": "progress", "name": "Progress"}], "display_name": "due_date", "discussion_topics": {"General": {"id": "i4x-edX-due_date-course-2013_fall"}}, "show_timezone": "false"}}
\ No newline at end of file
......@@ -14,7 +14,7 @@ from student.models import CourseEnrollment
from student.tests.factories import AdminFactory
from mitxmako.middleware import MakoMiddleware
from xmodule.modulestore.django import modulestore
from xmodule.modulestore.django import modulestore, clear_existing_modulestores
import courseware.views as views
from xmodule.modulestore import Location
......@@ -254,6 +254,8 @@ class ViewsTestCase(TestCase):
def set_show_timezone(show_timezone):
"""
Sets the show_timezone property and returns value from get_text function.
Note that show_timezone is deprecated and cannot be set by the user.
"""
course.show_timezone = show_timezone
course.save()
......@@ -268,38 +270,51 @@ class ViewsTestCase(TestCase):
return get_text()
request.user = self.user
# Clear out the modulestores, so we start with the test course in its default state.
clear_existing_modulestores()
course = modulestore().get_course("edX/due_date/2013_fall")
# Default case show_timezone = True
text = set_show_timezone(True)
self.assertIn("due Sep 18, 2013 at 11:30 UTC", text)
# show_timezone = False
text = set_show_timezone(False)
self.assertNotIn("due Sep 18, 2013 at 11:30 UTC", text)
self.assertIn("due Sep 18, 2013 at 11:30", text)
time_with_utc = "due Sep 18, 2013 at 11:30 UTC"
time_without_utc = "due Sep 18, 2013 at 11:30"
# The test course being used has show_timezone = False in the policy file
# (and no due_date_display_format set). This is to test our backwards compatibility--
# in course_module's init method, the date_display_format will be set accordingly to
# remove the timezone.
text = get_text()
self.assertIn(time_without_utc, text)
self.assertNotIn(time_with_utc, text)
# Test that show_timezone has been cleared (which means you get the default value of True).
self.assertTrue(course.show_timezone)
# Clear out the due date format and verify you get the default (with timezone).
delattr(course, 'due_date_display_format')
course.save()
text = get_text()
self.assertIn(time_with_utc, text)
# Same for setting the due date to None
text = set_due_date_format(None)
self.assertIn(time_with_utc, text)
# plain text due date
text = set_due_date_format("foobar")
self.assertNotIn("due Sep 18, 2013 at 11:30", text)
self.assertNotIn(time_with_utc, text)
self.assertIn("due foobar", text)
# due date with no time
text = set_due_date_format(u"%b %d %Y")
self.assertNotIn("due Sep 18, 2013 at 11:30", text)
self.assertIn("due Sep 18 2013", text)
text = set_due_date_format(u"%b %d %y")
self.assertNotIn(time_with_utc, text)
self.assertIn("due Sep 18 13", text)
# hide due date completely
text = set_due_date_format(u"")
self.assertNotIn("due ", text)
# improperly formatted due_date_display_format falls through to default with show_timezone arg
# improperly formatted due_date_display_format falls through to default
# (value of show_timezone does not matter-- setting to False to make that clear).
set_show_timezone(False)
text = set_due_date_format(u"%%%")
self.assertNotIn("%%%", text)
self.assertIn("due Sep 18, 2013 at 11:30", text)
self.assertNotIn("due Sep 18, 2013 at 11:30 UTC", text)
self.assertIn(time_with_utc, text)
set_show_timezone(True)
text = set_due_date_format(u"%%%")
self.assertNotIn("%%%", text)
self.assertIn("due Sep 18, 2013 at 11:30 UTC", text)
......@@ -98,7 +98,6 @@ def render_accordion(request, course, chapter, section, field_data_cache):
context = dict([('toc', toc),
('course_id', course.id),
('csrf', csrf(request)['csrf_token']),
('show_timezone', course.show_timezone),
('due_date_display_format', course.due_date_display_format)] + template_imports.items())
return render_to_string('courseware/accordion.html', context)
......
......@@ -29,7 +29,7 @@
if section.get('due') is None:
due_date = ''
else:
formatted_string = get_time_display(section['due'], due_date_display_format, show_timezone)
formatted_string = get_time_display(section['due'], due_date_display_format)
due_date = '' if len(formatted_string)==0 else _('due {date}'.format(date=formatted_string))
%>
<p class="subtitle">${section['format']} ${due_date}</p>
......
......@@ -70,7 +70,7 @@ ${progress_graph.body(grade_summary, course.grade_cutoffs, "grade-detail-graph",
%if section.get('due') is not None:
<%
formatted_string = get_time_display(section['due'], course.due_date_display_format, course.show_timezone)
formatted_string = get_time_display(section['due'], course.due_date_display_format)
due_date = '' if len(formatted_string)==0 else _('due {date}'.format(date=formatted_string))
%>
<em>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment