Commit 21056b95 by Oleg Marshev

Use DATE_TIME format for course start or end time in student dashboard.

parent 0d36dd72
...@@ -954,10 +954,9 @@ class CourseDescriptor(CourseFields, SequenceDescriptor): ...@@ -954,10 +954,9 @@ class CourseDescriptor(CourseFields, SequenceDescriptor):
"""Return the course_id for this course""" """Return the course_id for this course"""
return self.location.course_key return self.location.course_key
@property def start_datetime_text(self, format_string="SHORT_DATE"):
def start_date_text(self):
""" """
Returns the desired text corresponding the course's start date. Prefers .advertised_start, Returns the desired text corresponding the course's start date and time in UTC. Prefers .advertised_start,
then falls back to .start then falls back to .start
""" """
i18n = self.runtime.service(self, "i18n") i18n = self.runtime.service(self, "i18n")
...@@ -970,7 +969,9 @@ class CourseDescriptor(CourseFields, SequenceDescriptor): ...@@ -970,7 +969,9 @@ class CourseDescriptor(CourseFields, SequenceDescriptor):
if result is None: if result is None:
result = text.title() result = text.title()
else: else:
result = strftime(result, "SHORT_DATE") result = strftime(result, format_string)
if format_string == "DATE_TIME":
result = self._add_timezone_string(result)
except ValueError: except ValueError:
result = text.title() result = text.title()
...@@ -984,7 +985,11 @@ class CourseDescriptor(CourseFields, SequenceDescriptor): ...@@ -984,7 +985,11 @@ class CourseDescriptor(CourseFields, SequenceDescriptor):
return _('TBD') return _('TBD')
else: else:
when = self.advertised_start or self.start when = self.advertised_start or self.start
return strftime(when, "SHORT_DATE")
if format_string == "DATE_TIME":
return self._add_timezone_string(strftime(when, format_string))
return strftime(when, format_string)
@property @property
def start_date_is_still_default(self): def start_date_is_still_default(self):
...@@ -994,10 +999,9 @@ class CourseDescriptor(CourseFields, SequenceDescriptor): ...@@ -994,10 +999,9 @@ class CourseDescriptor(CourseFields, SequenceDescriptor):
""" """
return self.advertised_start is None and self.start == CourseFields.start.default return self.advertised_start is None and self.start == CourseFields.start.default
@property def end_datetime_text(self, format_string="SHORT_DATE"):
def end_date_text(self):
""" """
Returns the end date for the course formatted as a string. Returns the end date or date_time for the course formatted as a string.
If the course does not have an end date set (course.end is None), an empty string will be returned. If the course does not have an end date set (course.end is None), an empty string will be returned.
""" """
...@@ -1005,7 +1009,14 @@ class CourseDescriptor(CourseFields, SequenceDescriptor): ...@@ -1005,7 +1009,14 @@ class CourseDescriptor(CourseFields, SequenceDescriptor):
return '' return ''
else: else:
strftime = self.runtime.service(self, "i18n").strftime strftime = self.runtime.service(self, "i18n").strftime
return strftime(self.end, "SHORT_DATE") date_time = strftime(self.end, format_string)
return date_time if format_string == "SHORT_DATE" else self._add_timezone_string(date_time)
def _add_timezone_string(self, date_time):
"""
Adds 'UTC' string to the end of start/end date and time texts.
"""
return date_time + u" UTC"
@property @property
def forum_posts_allowed(self): def forum_posts_allowed(self):
......
...@@ -185,13 +185,13 @@ class IsNewCourseTestCase(unittest.TestCase): ...@@ -185,13 +185,13 @@ class IsNewCourseTestCase(unittest.TestCase):
assertion(a_score, b_score) assertion(a_score, b_score)
start_advertised_settings = [ start_advertised_settings = [
# start, advertised, result, is_still_default # start, advertised, result, is_still_default, date_time_result
('2012-12-02T12:00', None, 'Dec 02, 2012', False), ('2012-12-02T12:00', None, 'Dec 02, 2012', False, u'Dec 02, 2012 at 12:00 UTC'),
('2012-12-02T12:00', '2011-11-01T12:00', 'Nov 01, 2011', False), ('2012-12-02T12:00', '2011-11-01T12:00', 'Nov 01, 2011', False, u'Nov 01, 2011 at 12:00 UTC'),
('2012-12-02T12:00', 'Spring 2012', 'Spring 2012', False), ('2012-12-02T12:00', 'Spring 2012', 'Spring 2012', False, 'Spring 2012'),
('2012-12-02T12:00', 'November, 2011', 'November, 2011', False), ('2012-12-02T12:00', 'November, 2011', 'November, 2011', False, 'November, 2011'),
(xmodule.course_module.CourseFields.start.default, None, 'TBD', True), (xmodule.course_module.CourseFields.start.default, None, 'TBD', True, 'TBD'),
(xmodule.course_module.CourseFields.start.default, 'January 2014', 'January 2014', False), (xmodule.course_module.CourseFields.start.default, 'January 2014', 'January 2014', False, 'January 2014'),
] ]
@patch('xmodule.course_module.datetime.now') @patch('xmodule.course_module.datetime.now')
...@@ -200,7 +200,15 @@ class IsNewCourseTestCase(unittest.TestCase): ...@@ -200,7 +200,15 @@ class IsNewCourseTestCase(unittest.TestCase):
for s in self.start_advertised_settings: for s in self.start_advertised_settings:
d = get_dummy_course(start=s[0], advertised_start=s[1]) d = get_dummy_course(start=s[0], advertised_start=s[1])
print "Checking start=%s advertised=%s" % (s[0], s[1]) print "Checking start=%s advertised=%s" % (s[0], s[1])
self.assertEqual(d.start_date_text, s[2]) self.assertEqual(d.start_datetime_text(), s[2])
@patch('xmodule.course_module.datetime.now')
def test_start_date_time_text(self, gmtime_mock):
gmtime_mock.return_value = NOW
for setting in self.start_advertised_settings:
course = get_dummy_course(start=setting[0], advertised_start=setting[1])
print "Checking start=%s advertised=%s" % (setting[0], setting[1])
self.assertEqual(course.start_datetime_text("DATE_TIME"), setting[4])
def test_start_date_is_default(self): def test_start_date_is_default(self):
for s in self.start_advertised_settings: for s in self.start_advertised_settings:
...@@ -242,10 +250,18 @@ class IsNewCourseTestCase(unittest.TestCase): ...@@ -242,10 +250,18 @@ class IsNewCourseTestCase(unittest.TestCase):
def test_end_date_text(self): def test_end_date_text(self):
# No end date set, returns empty string. # No end date set, returns empty string.
d = get_dummy_course('2012-12-02T12:00') d = get_dummy_course('2012-12-02T12:00')
self.assertEqual('', d.end_date_text) self.assertEqual('', d.end_datetime_text())
d = get_dummy_course('2012-12-02T12:00', end='2014-9-04T12:00') d = get_dummy_course('2012-12-02T12:00', end='2014-9-04T12:00')
self.assertEqual('Sep 04, 2014', d.end_date_text) self.assertEqual('Sep 04, 2014', d.end_datetime_text())
def test_end_date_time_text(self):
# No end date set, returns empty string.
course = get_dummy_course('2012-12-02T12:00')
self.assertEqual('', course.end_datetime_text("DATE_TIME"))
course = get_dummy_course('2012-12-02T12:00', end='2014-9-04T12:00')
self.assertEqual('Sep 04, 2014 at 12:00 UTC', course.end_datetime_text("DATE_TIME"))
class DiscussionTopicsTestCase(unittest.TestCase): class DiscussionTopicsTestCase(unittest.TestCase):
......
...@@ -250,7 +250,7 @@ class Order(models.Model): ...@@ -250,7 +250,7 @@ class Order(models.Model):
course_id = item.course_id course_id = item.course_id
course = get_course_by_id(getattr(item, 'course_id'), depth=0) course = get_course_by_id(getattr(item, 'course_id'), depth=0)
registration_codes = CourseRegistrationCode.objects.filter(course_id=course_id, order=self) registration_codes = CourseRegistrationCode.objects.filter(course_id=course_id, order=self)
course_info.append((course.display_name, ' (' + course.start_date_text + '-' + course.end_date_text + ')')) course_info.append((course.display_name, ' (' + course.start_datetime_text() + '-' + course.end_datetime_text() + ')'))
for registration_code in registration_codes: for registration_code in registration_codes:
redemption_url = reverse('register_code_redemption', args=[registration_code.code]) redemption_url = reverse('register_code_redemption', args=[registration_code.code])
url = '{base_url}{redemption_url}'.format(base_url=site_name, redemption_url=redemption_url) url = '{base_url}{redemption_url}'.format(base_url=site_name, redemption_url=redemption_url)
...@@ -1156,7 +1156,7 @@ class CertificateItem(OrderItem): ...@@ -1156,7 +1156,7 @@ class CertificateItem(OrderItem):
"course_name": course.display_name_with_default, "course_name": course.display_name_with_default,
"course_org": course.display_org_with_default, "course_org": course.display_org_with_default,
"course_num": course.display_number_with_default, "course_num": course.display_number_with_default,
"course_start_date_text": course.start_date_text, "course_start_date_text": course.start_datetime_text(),
"course_has_started": course.start > datetime.today().replace(tzinfo=pytz.utc), "course_has_started": course.start > datetime.today().replace(tzinfo=pytz.utc),
"course_root_url": reverse( "course_root_url": reverse(
'course_root', 'course_root',
......
...@@ -27,7 +27,7 @@ from courseware.courses import course_image_url, get_course_about_section ...@@ -27,7 +27,7 @@ from courseware.courses import course_image_url, get_course_about_section
<div class="bottom"> <div class="bottom">
<span class="university">${get_course_about_section(course, 'university')}</span> <span class="university">${get_course_about_section(course, 'university')}</span>
% if not course.start_date_is_still_default: % if not course.start_date_is_still_default:
<span class="start-date">${course.start_date_text}</span> <span class="start-date">${course.start_datetime_text()}</span>
% endif % endif
</div> </div>
</section> </section>
......
...@@ -292,7 +292,7 @@ ...@@ -292,7 +292,7 @@
<ol class="important-dates"> <ol class="important-dates">
<li><div class="icon course-number"></div><p>${_("Course Number")}</p><span class="course-number">${course.display_number_with_default | h}</span></li> <li><div class="icon course-number"></div><p>${_("Course Number")}</p><span class="course-number">${course.display_number_with_default | h}</span></li>
% if not course.start_date_is_still_default: % if not course.start_date_is_still_default:
<li><div class="icon start"></div><p>${_("Classes Start")}</p><span class="start-date">${course.start_date_text}</span></li> <li><div class="icon start"></div><p>${_("Classes Start")}</p><span class="start-date">${course.start_datetime_text()}</span></li>
% endif % endif
## We plan to ditch end_date (which is not stored in course metadata), ## We plan to ditch end_date (which is not stored in course metadata),
## but for backwards compatibility, show about/end_date blob if it exists. ## but for backwards compatibility, show about/end_date blob if it exists.
...@@ -303,7 +303,7 @@ ...@@ -303,7 +303,7 @@
% if get_course_about_section(course, "end_date"): % if get_course_about_section(course, "end_date"):
${get_course_about_section(course, "end_date")} ${get_course_about_section(course, "end_date")}
% else: % else:
${course.end_date_text} ${course.end_datetime_text()}
% endif % endif
</span> </span>
</li> </li>
......
...@@ -73,13 +73,13 @@ ...@@ -73,13 +73,13 @@
<hgroup> <hgroup>
<p class="date-block"> <p class="date-block">
% if course.has_ended(): % if course.has_ended():
${_("Course Completed - {end_date}").format(end_date=course.end_date_text)} ${_("Course Completed - {end_date}").format(end_date=course.end_datetime_text("DATE_TIME"))}
% elif course.has_started(): % elif course.has_started():
${_("Course Started - {start_date}").format(start_date=course.start_date_text)} ${_("Course Started - {start_date}").format(start_date=course.start_datetime_text("DATE_TIME"))}
% elif course.start_date_is_still_default: # Course start date TBD % elif course.start_date_is_still_default: # Course start date TBD
${_("Course has not yet started")} ${_("Course has not yet started")}
% else: # hasn't started yet % else: # hasn't started yet
${_("Course Starts - {start_date}").format(start_date=course.start_date_text)} ${_("Course Starts - {start_date}").format(start_date=course.start_datetime_text("DATE_TIME"))}
% endif % endif
</p> </p>
<h2 class="university">${get_course_about_section(course, 'university')}</h2> <h2 class="university">${get_course_about_section(course, 'university')}</h2>
...@@ -239,4 +239,4 @@ ...@@ -239,4 +239,4 @@
}); });
} }
}); });
</script> </script>
\ No newline at end of file
...@@ -278,7 +278,11 @@ from courseware.courses import course_image_url, get_course_about_section, get_c ...@@ -278,7 +278,11 @@ from courseware.courses import course_image_url, get_course_about_section, get_c
<div class="data-input"> <div class="data-input">
<h3>${_("Registration for")}: <h3>${_("Registration for")}:
<span class="pull-right"> <span class="pull-right">
% if course.start_date_text or course.end_date_text: <%
course_start_time = course.start_datetime_text()
course_end_time = course.end_datetime_text()
%>
% if course_start_time or course_end_time:
${_("Course Dates")}: ${_("Course Dates")}:
%endif %endif
</span> </span>
...@@ -286,12 +290,12 @@ from courseware.courses import course_image_url, get_course_about_section, get_c ...@@ -286,12 +290,12 @@ from courseware.courses import course_image_url, get_course_about_section, get_c
<h1>${_(" {course_name} ").format(course_name=course.display_name)} <h1>${_(" {course_name} ").format(course_name=course.display_name)}
<span class="pull-right"> <span class="pull-right">
% if course.start_date_text: % if course_start_time:
${course.start_date_text} ${course_start_time}
%endif %endif
- -
% if course.end_date_text: % if course_end_time:
${course.end_date_text} ${course_end_time}
%endif %endif
</span> </span>
</h1> </h1>
......
...@@ -30,7 +30,7 @@ from courseware.courses import course_image_url, get_course_about_section ...@@ -30,7 +30,7 @@ from courseware.courses import course_image_url, get_course_about_section
<div class="course-title"> <div class="course-title">
<h1> <h1>
${_("{course_name}").format(course_name=course.display_name)} ${_("{course_name}").format(course_name=course.display_name)}
<span class="course-dates">${_("{start_date}").format(start_date=course.start_date_text)} - ${_("{end_date}").format(end_date=course.end_date_text)} <span class="course-dates">${_("{start_date}").format(start_date=course.start_datetime_text())} - ${_("{end_date}").format(end_date=course.end_datetime_text())}
</span> </span>
</h1> </h1>
</div> </div>
......
...@@ -34,7 +34,7 @@ from django.utils.translation import ugettext as _ ...@@ -34,7 +34,7 @@ from django.utils.translation import ugettext as _
</div> </div>
<div class="data-input"> <div class="data-input">
<h3>${_('Registration for:')} <span class="pull-right">${_('Course Dates:')}</span></h3> <h3>${_('Registration for:')} <span class="pull-right">${_('Course Dates:')}</span></h3>
<h1>${ course.display_name }<span class="pull-right">${course.start_date_text} - ${course.end_date_text}</span></h1> <h1>${ course.display_name }<span class="pull-right">${course.start_datetime_text()} - ${course.end_datetime_text()}</span></h1>
<hr /> <hr />
<div class="three-col"> <div class="three-col">
<div class="col-1"> <div class="col-1">
......
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