diff --git a/cms/djangoapps/contentstore/tests/tests.py b/cms/djangoapps/contentstore/tests/tests.py index f769652493..f7f330f91e 100644 --- a/cms/djangoapps/contentstore/tests/tests.py +++ b/cms/djangoapps/contentstore/tests/tests.py @@ -3,6 +3,10 @@ from django.core.urlresolvers import reverse from .utils import parse_json, user, registration from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase +from contentstore.tests.test_course_settings import CourseTestCase +from xmodule.modulestore.tests.factories import CourseFactory +import datetime +from pytz import UTC class ContentStoreTestCase(ModuleStoreTestCase): @@ -162,3 +166,21 @@ class AuthTestCase(ContentStoreTestCase): self.assertEqual(resp.status_code, 302) # Logged in should work. + + +class ForumTestCase(CourseTestCase): + def setUp(self): + """ Creates the test course. """ + super(ForumTestCase, self).setUp() + self.course = CourseFactory.create(org='testX', number='727', display_name='Forum Course') + + def test_blackouts(self): + now = datetime.datetime.now(UTC) + self.course.discussion_blackouts = [(t.isoformat(), t2.isoformat()) for t, t2 in + [(now - datetime.timedelta(days=14), now - datetime.timedelta(days=11)), + (now + datetime.timedelta(days=24), now + datetime.timedelta(days=30))]] + self.assertTrue(self.course.forum_posts_allowed) + self.course.discussion_blackouts = [(t.isoformat(), t2.isoformat()) for t, t2 in + [(now - datetime.timedelta(days=14), now + datetime.timedelta(days=2)), + (now + datetime.timedelta(days=24), now + datetime.timedelta(days=30))]] + self.assertFalse(self.course.forum_posts_allowed) diff --git a/common/lib/xmodule/xmodule/fields.py b/common/lib/xmodule/xmodule/fields.py index e4e0a19d34..a36934a24d 100644 --- a/common/lib/xmodule/xmodule/fields.py +++ b/common/lib/xmodule/xmodule/fields.py @@ -19,6 +19,23 @@ class Date(ModelType): CURRENT_YEAR = datetime.datetime.now(UTC).year DEFAULT_DATE0 = datetime.datetime(CURRENT_YEAR, 1, 1, tzinfo=UTC) DEFAULT_DATE1 = datetime.datetime(CURRENT_YEAR, 2, 2, tzinfo=UTC) + def _parse_date_wo_default_month_day(self, field): + """ + Parse the field as an iso string but prevent dateutils from defaulting the day or month while + allowing it to default the other fields. + """ + # It's not trivial to replace dateutil b/c parsing timezones as Z, +03:30, -400 is hard in python + # however, we don't want dateutil to default the month or day (but some tests at least expect + # us to default year); so, we'll see if dateutil uses the defaults for these the hard way + result = dateutil.parser.parse(field, default=self.DEFAULT_DATE0) + result_other = dateutil.parser.parse(field, default=self.DEFAULT_DATE1) + if result != result_other: + log.warning("Field {0} is missing month or day".format(self._name, field)) + return None + if result.tzinfo is None: + result = result.replace(tzinfo=UTC) + return result + def from_json(self, field): """ Parse an optional metadata key containing a time: if present, complain @@ -30,17 +47,7 @@ class Date(ModelType): elif field is "": return None elif isinstance(field, basestring): - # It's not trivial to replace dateutil b/c parsing timezones as Z, +03:30, -400 is hard in python - # however, we don't want dateutil to default the month or day (but some tests at least expect - # us to default year); so, we'll see if dateutil uses the defaults for these the hard way - result = dateutil.parser.parse(field, default=self.DEFAULT_DATE0) - result_other = dateutil.parser.parse(field, default=self.DEFAULT_DATE1) - if result != result_other: - log.warning("Field {0} is missing month or day".format(self._name, field)) - return None - if result.tzinfo is None: - result = result.replace(tzinfo=UTC) - return result + return self._parse_date_wo_default_month_day(field) elif isinstance(field, (int, long, float)): return datetime.datetime.fromtimestamp(field / 1000, UTC) elif isinstance(field, time.struct_time):