Commit 3188bb06 by Don Mitchell

WIP: Use approximate comparison when checking for changes to start dates

parent 1c5706fb
<%inherit file="base.html" /> <%inherit file="base.html" />
<%! <%!
import logging import logging
from xmodule.util.date_utils import get_default_time_display from xmodule.util.date_utils import get_default_time_display, almost_same_datetime
%> %>
<%! from django.core.urlresolvers import reverse %> <%! from django.core.urlresolvers import reverse %>
...@@ -47,9 +47,10 @@ ...@@ -47,9 +47,10 @@
placeholder="HH:MM" class="time" size='10' autocomplete="off"/> placeholder="HH:MM" class="time" size='10' autocomplete="off"/>
</div> </div>
</div> </div>
% if subsection.lms.start != parent_item.lms.start and subsection.lms.start: % if subsection.lms.start and not almost_same_datetime(subsection.lms.start, parent_item.lms.start):
% if parent_item.lms.start is None: % if parent_item.lms.start is None:
<p class="notice">The date above differs from the release date of ${parent_item.display_name_with_default}, which is unset. <p class="notice">The date above differs from the release date of
${parent_item.display_name_with_default}, which is unset.
% else: % else:
<p class="notice">The date above differs from the release date of ${parent_item.display_name_with_default} – <p class="notice">The date above differs from the release date of ${parent_item.display_name_with_default} –
${get_default_time_display(parent_item.lms.start)}. ${get_default_time_display(parent_item.lms.start)}.
......
# Tests for xmodule.util.date_utils # Tests for xmodule.util.date_utils
from nose.tools import assert_equals from nose.tools import assert_equals, assert_false
from xmodule.util import date_utils from xmodule.util.date_utils import get_default_time_display, almost_same_datetime
import datetime from datetime import datetime, timedelta, tzinfo
from pytz import UTC from pytz import UTC
def test_get_default_time_display(): def test_get_default_time_display():
assert_equals("", date_utils.get_default_time_display(None)) assert_equals("", get_default_time_display(None))
test_time = datetime.datetime(1992, 3, 12, 15, 3, 30, tzinfo=UTC) test_time = datetime(1992, 3, 12, 15, 3, 30, tzinfo=UTC)
assert_equals( assert_equals(
"Mar 12, 1992 at 15:03 UTC", "Mar 12, 1992 at 15:03 UTC",
date_utils.get_default_time_display(test_time)) get_default_time_display(test_time))
assert_equals( assert_equals(
"Mar 12, 1992 at 15:03 UTC", "Mar 12, 1992 at 15:03 UTC",
date_utils.get_default_time_display(test_time, True)) get_default_time_display(test_time, True))
assert_equals( assert_equals(
"Mar 12, 1992 at 15:03", "Mar 12, 1992 at 15:03",
date_utils.get_default_time_display(test_time, False)) get_default_time_display(test_time, False))
def test_get_default_time_display_notz(): def test_get_default_time_display_notz():
test_time = datetime.datetime(1992, 3, 12, 15, 3, 30) test_time = datetime(1992, 3, 12, 15, 3, 30)
assert_equals( assert_equals(
"Mar 12, 1992 at 15:03 UTC", "Mar 12, 1992 at 15:03 UTC",
date_utils.get_default_time_display(test_time)) get_default_time_display(test_time))
assert_equals( assert_equals(
"Mar 12, 1992 at 15:03 UTC", "Mar 12, 1992 at 15:03 UTC",
date_utils.get_default_time_display(test_time, True)) get_default_time_display(test_time, True))
assert_equals( assert_equals(
"Mar 12, 1992 at 15:03", "Mar 12, 1992 at 15:03",
date_utils.get_default_time_display(test_time, False)) get_default_time_display(test_time, False))
# pylint: disable=W0232 # pylint: disable=W0232
class NamelessTZ(datetime.tzinfo): class NamelessTZ(tzinfo):
def utcoffset(self, _dt): def utcoffset(self, _dt):
return datetime.timedelta(hours=-3) return timedelta(hours=-3)
def dst(self, _dt): def dst(self, _dt):
return datetime.timedelta(0) return timedelta(0)
def test_get_default_time_display_no_tzname(): def test_get_default_time_display_no_tzname():
assert_equals("", date_utils.get_default_time_display(None)) assert_equals("", get_default_time_display(None))
test_time = datetime.datetime(1992, 3, 12, 15, 3, 30, tzinfo=NamelessTZ()) test_time = datetime(1992, 3, 12, 15, 3, 30, tzinfo=NamelessTZ())
assert_equals( assert_equals(
"Mar 12, 1992 at 15:03-0300", "Mar 12, 1992 at 15:03-0300",
date_utils.get_default_time_display(test_time)) get_default_time_display(test_time))
assert_equals( assert_equals(
"Mar 12, 1992 at 15:03-0300", "Mar 12, 1992 at 15:03-0300",
date_utils.get_default_time_display(test_time, True)) get_default_time_display(test_time, True))
assert_equals( assert_equals(
"Mar 12, 1992 at 15:03", "Mar 12, 1992 at 15:03",
date_utils.get_default_time_display(test_time, False)) get_default_time_display(test_time, False))
def test_almost_same_datetime():
assert almost_same_datetime(
datetime(2013, 5, 3, 10, 20, 30),
datetime(2013, 5, 3, 10, 21, 29)
)
assert almost_same_datetime(
datetime(2013, 5, 3, 11, 20, 30),
datetime(2013, 5, 3, 10, 21, 29),
timedelta(hours=1)
)
assert_false(
almost_same_datetime(
datetime(2013, 5, 3, 11, 20, 30),
datetime(2013, 5, 3, 10, 21, 29)
)
)
assert_false(
almost_same_datetime(
datetime(2013, 5, 3, 11, 20, 30),
datetime(2013, 5, 3, 10, 21, 29),
timedelta(minutes=10)
)
)
...@@ -185,6 +185,9 @@ class TestEdxJsonEncoder(unittest.TestCase): ...@@ -185,6 +185,9 @@ class TestEdxJsonEncoder(unittest.TestCase):
self.encoder.default(datetime(2013, 5, 3, 10, 20, 30, 0, self.null_utc_tz)) self.encoder.default(datetime(2013, 5, 3, 10, 20, 30, 0, self.null_utc_tz))
) )
def test_other_classes(self): def test_fallthrough(self):
with self.assertRaises(TypeError): with self.assertRaises(TypeError):
self.encoder.default(None) self.encoder.default(None)
with self.assertRaises(TypeError):
self.encoder.default({})
import datetime
def get_default_time_display(dt, show_timezone=True): def get_default_time_display(dt, show_timezone=True):
""" """
Converts a datetime to a string representation. This is the default Converts a datetime to a string representation. This is the default
...@@ -20,3 +21,14 @@ def get_default_time_display(dt, show_timezone=True): ...@@ -20,3 +21,14 @@ def get_default_time_display(dt, show_timezone=True):
else: else:
timezone = " UTC" timezone = " UTC"
return dt.strftime("%b %d, %Y at %H:%M") + timezone return dt.strftime("%b %d, %Y at %H:%M") + timezone
def almost_same_datetime(dt1, dt2, allowed_delta=datetime.timedelta(minutes=1)):
"""
Returns true if these are w/in a minute of each other. (in case secs saved to db
or timezone aren't same)
:param dt1:
:param dt2:
"""
return abs(dt1 - dt2) < allowed_delta
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