diff --git a/common/djangoapps/course_modes/models.py b/common/djangoapps/course_modes/models.py index ac93241157..6ed8558f81 100644 --- a/common/djangoapps/course_modes/models.py +++ b/common/djangoapps/course_modes/models.py @@ -2,9 +2,8 @@ Add and create new modes for running courses on this particular LMS """ from collections import defaultdict, namedtuple -from datetime import datetime, timedelta +from datetime import timedelta -import pytz from config_models.models import ConfigurationModel from django.conf import settings from django.core.exceptions import ValidationError @@ -12,6 +11,7 @@ from django.core.validators import validate_comma_separated_integer_list from django.db import models from django.db.models import Q from django.dispatch import receiver +from django.utils.timezone import now from django.utils.translation import ugettext_lazy as _ from openedx.core.djangoapps.content.course_overviews.models import CourseOverview @@ -272,12 +272,12 @@ class CourseMode(models.Model): and the second is a list of only unexpired `Mode`s. """ - now = datetime.now(pytz.UTC) + now_dt = now() all_modes = cls.all_modes_for_courses(course_id_list) unexpired_modes = { course_id: [ mode for mode in modes - if mode.expiration_datetime is None or mode.expiration_datetime >= now + if mode.expiration_datetime is None or mode.expiration_datetime >= now_dt ] for course_id, modes in all_modes.iteritems() } @@ -298,13 +298,12 @@ class CourseMode(models.Model): A list of CourseModes with a minimum price. """ - now = datetime.now(pytz.UTC) found_course_modes = cls.objects.filter( Q(course_id=course_id) & Q(min_price__gt=0) & ( Q(_expiration_datetime__isnull=True) | - Q(_expiration_datetime__gte=now) + Q(_expiration_datetime__gte=now()) ) ) return [mode.to_tuple() for mode in found_course_modes] @@ -333,14 +332,12 @@ class CourseMode(models.Model): list of `Mode` tuples """ - now = datetime.now(pytz.UTC) - found_course_modes = cls.objects.filter(course_id=course_id) # Filter out expired course modes if include_expired is not set if not include_expired: found_course_modes = found_course_modes.filter( - Q(_expiration_datetime__isnull=True) | Q(_expiration_datetime__gte=now) + Q(_expiration_datetime__isnull=True) | Q(_expiration_datetime__gte=now()) ) # Credit course modes are currently not shown on the track selection page; diff --git a/common/djangoapps/course_modes/tests/test_models.py b/common/djangoapps/course_modes/tests/test_models.py index c372462383..d15eba64e2 100644 --- a/common/djangoapps/course_modes/tests/test_models.py +++ b/common/djangoapps/course_modes/tests/test_models.py @@ -6,12 +6,12 @@ Replace this with more appropriate tests for your application. """ import itertools -from datetime import datetime, timedelta +from datetime import timedelta import ddt -import pytz from django.core.exceptions import ValidationError from django.test import TestCase, override_settings +from django.utils.timezone import now from mock import patch from opaque_keys.edx.locator import CourseLocator @@ -31,7 +31,7 @@ class CourseModeModelTest(TestCase): """ NOW = 'now' DATES = { - NOW: datetime.now(), + NOW: now(), None: None, } @@ -133,7 +133,7 @@ class CourseModeModelTest(TestCase): def test_modes_for_course_expired(self): expired_mode, _status = self.create_mode('verified', 'Verified Certificate', 10) - expired_mode.expiration_datetime = datetime.now(pytz.UTC) + timedelta(days=-1) + expired_mode.expiration_datetime = now() + timedelta(days=-1) expired_mode.save() modes = CourseMode.modes_for_course(self.course_key) self.assertEqual([CourseMode.DEFAULT_MODE], modes) @@ -143,7 +143,7 @@ class CourseModeModelTest(TestCase): modes = CourseMode.modes_for_course(self.course_key) self.assertEqual([mode1], modes) - expiration_datetime = datetime.now(pytz.UTC) + timedelta(days=1) + expiration_datetime = now() + timedelta(days=1) expired_mode.expiration_datetime = expiration_datetime expired_mode.save() expired_mode_value = Mode( @@ -232,9 +232,9 @@ class CourseModeModelTest(TestCase): self.assertEqual(CourseMode.auto_enroll_mode(self.course_key, modes), result) def test_all_modes_for_courses(self): - now = datetime.now(pytz.UTC) - future = now + timedelta(days=1) - past = now - timedelta(days=1) + now_dt = now() + future = now_dt + timedelta(days=1) + past = now_dt - timedelta(days=1) # Unexpired, no expiration date CourseModeFactory.create( @@ -430,20 +430,20 @@ class CourseModeModelTest(TestCase): def test_expiration_datetime_explicitly_set(self): """ Verify that setting the expiration_date property sets the explicit flag. """ verified_mode, __ = self.create_mode('verified', 'Verified Certificate', 10) - now = datetime.now() - verified_mode.expiration_datetime = now + now_dt = now() + verified_mode.expiration_datetime = now_dt self.assertTrue(verified_mode.expiration_datetime_is_explicit) - self.assertEqual(verified_mode.expiration_datetime, now) + self.assertEqual(verified_mode.expiration_datetime, now_dt) def test_expiration_datetime_not_explicitly_set(self): """ Verify that setting the _expiration_date property does not set the explicit flag. """ verified_mode, __ = self.create_mode('verified', 'Verified Certificate', 10) - now = datetime.now() - verified_mode._expiration_datetime = now # pylint: disable=protected-access + now_dt = now() + verified_mode._expiration_datetime = now_dt # pylint: disable=protected-access self.assertFalse(verified_mode.expiration_datetime_is_explicit) - self.assertEqual(verified_mode.expiration_datetime, now) + self.assertEqual(verified_mode.expiration_datetime, now_dt) def test_expiration_datetime_explicitly_set_to_none(self): """ Verify that setting the _expiration_date property does not set the explicit flag. """ diff --git a/lms/djangoapps/bulk_email/tests/test_models.py b/lms/djangoapps/bulk_email/tests/test_models.py index 89b51b511e..76043abc2b 100644 --- a/lms/djangoapps/bulk_email/tests/test_models.py +++ b/lms/djangoapps/bulk_email/tests/test_models.py @@ -9,6 +9,7 @@ from django.test import TestCase from mock import Mock, patch from nose.plugins.attrib import attr from opaque_keys.edx.keys import CourseKey +from pytz import UTC from bulk_email.models import ( SEND_TO_COHORT, @@ -74,8 +75,8 @@ class CourseEmailTest(ModuleStoreTestCase): CourseEmail.create(course_id, sender, to_option, subject, html_message) @ddt.data( - datetime.datetime(1999, 1, 1), - datetime.datetime(datetime.MAXYEAR, 1, 1), + datetime.datetime(1999, 1, 1, tzinfo=UTC), + datetime.datetime(datetime.MAXYEAR, 1, 1, tzinfo=UTC), ) def test_track_target(self, expiration_datetime): """ diff --git a/openedx/features/course_experience/tests/views/helpers.py b/openedx/features/course_experience/tests/views/helpers.py index 7999403a5f..b554085159 100644 --- a/openedx/features/course_experience/tests/views/helpers.py +++ b/openedx/features/course_experience/tests/views/helpers.py @@ -1,8 +1,9 @@ """ Test helpers for the course experience. """ +from datetime import timedelta -import datetime +from django.utils.timezone import now from course_modes.models import CourseMode @@ -13,11 +14,11 @@ def add_course_mode(course, upgrade_deadline_expired=False): """ Adds a course mode to the test course. """ - upgrade_exp_date = datetime.datetime.now() + upgrade_exp_date = now() if upgrade_deadline_expired: - upgrade_exp_date = upgrade_exp_date - datetime.timedelta(days=21) + upgrade_exp_date = upgrade_exp_date - timedelta(days=21) else: - upgrade_exp_date = upgrade_exp_date + datetime.timedelta(days=21) + upgrade_exp_date = upgrade_exp_date + timedelta(days=21) CourseMode( course_id=course.id, diff --git a/openedx/features/course_experience/tests/views/test_course_home.py b/openedx/features/course_experience/tests/views/test_course_home.py index aac24a4c9a..59551e15df 100644 --- a/openedx/features/course_experience/tests/views/test_course_home.py +++ b/openedx/features/course_experience/tests/views/test_course_home.py @@ -10,6 +10,7 @@ from django.conf import settings from django.core.urlresolvers import reverse from django.http import QueryDict from django.utils.http import urlquote_plus +from django.utils.timezone import now from pytz import UTC from waffle.models import Flag from waffle.testutils import override_flag @@ -96,7 +97,7 @@ class CourseHomePageTestCase(SharedModuleStoreTestCase): org='edX', number='test', display_name='Test Course', - start=datetime.now(UTC) - timedelta(days=30), + start=now() - timedelta(days=30), ) with cls.store.bulk_operations(cls.course.id): chapter = ItemFactory.create( @@ -122,7 +123,7 @@ class CourseHomePageTestCase(SharedModuleStoreTestCase): """ return CourseFactory.create( display_name='Test Future Course', - start=specific_date if specific_date else datetime.now(UTC) + timedelta(days=30), + start=specific_date if specific_date else now() + timedelta(days=30), ) @@ -487,9 +488,9 @@ class CourseHomeFragmentViewTests(ModuleStoreTestCase): super(CourseHomeFragmentViewTests, self).setUp() CommerceConfiguration.objects.create(checkout_on_ecommerce_service=True) - end = datetime.now(UTC) + timedelta(days=30) + end = now() + timedelta(days=30) self.course = CourseFactory( - start=datetime.now(UTC) - timedelta(days=30), + start=now() - timedelta(days=30), end=end, ) self.url = course_home_url(self.course) @@ -535,7 +536,7 @@ class CourseHomeFragmentViewTests(ModuleStoreTestCase): self.assert_upgrade_message_not_displayed() def test_no_upgrade_message_if_upgrade_deadline_passed(self): - self.verified_mode.expiration_datetime = datetime.now(UTC) - timedelta(days=20) + self.verified_mode.expiration_datetime = now() - timedelta(days=20) self.verified_mode.save() self.assert_upgrade_message_not_displayed()