From e12a704ceadd9b43dfa38e36293f117aa4e199ee Mon Sep 17 00:00:00 2001 From: Diana Huang Date: Wed, 26 Apr 2017 14:16:24 -0400 Subject: [PATCH] Add new course dates fragment. Also add it to the course home page. --- .../course_modes/tests/test_views.py | 20 +- common/djangoapps/track/tests/__init__.py | 5 +- common/djangoapps/track/views/__init__.py | 4 +- .../xmodule/xmodule/tests/test_sequence.py | 64 ++-- .../certificates/apis/v0/tests/test_views.py | 5 +- lms/djangoapps/certificates/tests/test_api.py | 8 +- lms/djangoapps/commerce/tests/__init__.py | 47 ++- .../courseware/tests/test_date_summary.py | 322 ++++++++++-------- .../courseware/tests/test_module_render.py | 30 +- lms/djangoapps/courseware/tests/test_views.py | 50 +-- lms/djangoapps/courseware/views/views.py | 8 + lms/djangoapps/grades/tests/test_models.py | 18 +- .../tests/test_tasks_helper.py | 7 +- .../sass/features/_course-experience.scss | 60 ++++ lms/templates/courseware/info.html | 30 +- .../verification_api/tests/test_views.py | 5 +- .../core/lib/tests/test_time_zone_utils.py | 24 +- .../course-dates-fragment.html | 36 ++ .../course-home-fragment.html | 3 + .../tests/views/test_course_home.py | 2 +- .../course_experience/views/course_dates.py | 27 ++ .../course_experience/views/course_home.py | 6 + requirements/edx/base.txt | 2 +- 23 files changed, 466 insertions(+), 317 deletions(-) create mode 100644 openedx/features/course_experience/templates/course_experience/course-dates-fragment.html create mode 100644 openedx/features/course_experience/views/course_dates.py diff --git a/common/djangoapps/course_modes/tests/test_views.py b/common/djangoapps/course_modes/tests/test_views.py index 94eb2a7da8..efcf0e5ac7 100644 --- a/common/djangoapps/course_modes/tests/test_views.py +++ b/common/djangoapps/course_modes/tests/test_views.py @@ -527,19 +527,19 @@ class CourseModeViewTest(CatalogIntegrationMixin, UrlResetMixin, ModuleStoreTest self.assertNotContains(response, "Schools & Partners") @unittest.skipUnless(settings.ROOT_URLCONF == 'lms.urls', 'Test only valid in lms') - @freezegun.freeze_time('2015-01-02') def test_course_closed(self): - for mode in ["honor", "verified"]: - CourseModeFactory(mode_slug=mode, course_id=self.course.id) + with freezegun.freeze_time('2015-01-02'): + for mode in ["honor", "verified"]: + CourseModeFactory(mode_slug=mode, course_id=self.course.id) - self.course.enrollment_end = datetime(2015, 01, 01) - modulestore().update_item(self.course, self.user.id) + self.course.enrollment_end = datetime(2015, 01, 01) + modulestore().update_item(self.course, self.user.id) - url = reverse('course_modes_choose', args=[unicode(self.course.id)]) - response = self.client.get(url) - # URL-encoded version of 1/1/15, 12:00 AM - redirect_url = reverse('dashboard') + '?course_closed=1%2F1%2F15%2C+12%3A00+AM' - self.assertRedirects(response, redirect_url) + url = reverse('course_modes_choose', args=[unicode(self.course.id)]) + response = self.client.get(url) + # URL-encoded version of 1/1/15, 12:00 AM + redirect_url = reverse('dashboard') + '?course_closed=1%2F1%2F15%2C+12%3A00+AM' + self.assertRedirects(response, redirect_url) @unittest.skipUnless(settings.ROOT_URLCONF == 'lms.urls', 'Test only valid in lms') diff --git a/common/djangoapps/track/tests/__init__.py b/common/djangoapps/track/tests/__init__.py index 3b99e5811c..a3363e1c2f 100644 --- a/common/djangoapps/track/tests/__init__.py +++ b/common/djangoapps/track/tests/__init__.py @@ -31,7 +31,6 @@ class InMemoryBackend(object): self.events.append(event) -@freeze_time(FROZEN_TIME) @override_settings( EVENT_TRACKING_BACKENDS=IN_MEMORY_BACKEND_CONFIG ) @@ -46,6 +45,10 @@ class EventTrackingTestCase(TestCase): # Make this more robust to the addition of new events that the test doesn't care about. def setUp(self): + freezer = freeze_time(FROZEN_TIME) + freezer.start() + self.addCleanup(freezer.stop) + super(EventTrackingTestCase, self).setUp() self.recreate_tracker() diff --git a/common/djangoapps/track/views/__init__.py b/common/djangoapps/track/views/__init__.py index e34ebea3b8..b5cf9ce881 100644 --- a/common/djangoapps/track/views/__init__.py +++ b/common/djangoapps/track/views/__init__.py @@ -107,7 +107,7 @@ def server_track(request, event_type, event, page=None): "event": event, "agent": _get_request_header(request, 'HTTP_USER_AGENT').decode('latin1'), "page": page, - "time": datetime.datetime.utcnow(), + "time": datetime.datetime.utcnow().replace(tzinfo=pytz.utc), "host": _get_request_header(request, 'SERVER_NAME'), "context": eventtracker.get_tracker().resolve_context(), } @@ -155,7 +155,7 @@ def task_track(request_info, task_info, event_type, event, page=None): "event": full_event, "agent": request_info.get('agent', 'unknown'), "page": page, - "time": datetime.datetime.utcnow(), + "time": datetime.datetime.utcnow().replace(tzinfo=pytz.utc), "host": request_info.get('host', 'unknown'), "context": eventtracker.get_tracker().resolve_context(), } diff --git a/common/lib/xmodule/xmodule/tests/test_sequence.py b/common/lib/xmodule/xmodule/tests/test_sequence.py index 26112a6110..af3ae73a4e 100644 --- a/common/lib/xmodule/xmodule/tests/test_sequence.py +++ b/common/lib/xmodule/xmodule/tests/test_sequence.py @@ -139,42 +139,42 @@ class SequenceBlockTestCase(XModuleXmlImportTest): self.assertIn("seq_module.html", html) self.assertIn("'banner_text': None", html) - @freeze_time(COURSE_END_DATE) def test_hidden_content_past_due(self): - progress_url = 'http://test_progress_link' - html = self._get_rendered_student_view( - self.sequence_4_1, - extra_context=dict(progress_url=progress_url), - ) - self.assertIn("hidden_content.html", html) - self.assertIn(progress_url, html) + with freeze_time(COURSE_END_DATE): + progress_url = 'http://test_progress_link' + html = self._get_rendered_student_view( + self.sequence_4_1, + extra_context=dict(progress_url=progress_url), + ) + self.assertIn("hidden_content.html", html) + self.assertIn(progress_url, html) - @freeze_time(COURSE_END_DATE) def test_masquerade_hidden_content_past_due(self): - html = self._get_rendered_student_view( - self.sequence_4_1, - extra_context=dict(specific_masquerade=True), - ) - self.assertIn("seq_module.html", html) - self.assertIn( - "'banner_text': 'Because the due date has passed, " - "this assignment is hidden from the learner.'", - html - ) + with freeze_time(COURSE_END_DATE): + html = self._get_rendered_student_view( + self.sequence_4_1, + extra_context=dict(specific_masquerade=True), + ) + self.assertIn("seq_module.html", html) + self.assertIn( + "'banner_text': 'Because the due date has passed, " + "this assignment is hidden from the learner.'", + html + ) - @freeze_time(PAST_DUE_BEFORE_END_DATE) def test_hidden_content_self_paced_past_due_before_end(self): - html = self._get_rendered_student_view(self.sequence_4_1, self_paced=True) - self.assertIn("seq_module.html", html) - self.assertIn("'banner_text': None", html) + with freeze_time(PAST_DUE_BEFORE_END_DATE): + html = self._get_rendered_student_view(self.sequence_4_1, self_paced=True) + self.assertIn("seq_module.html", html) + self.assertIn("'banner_text': None", html) - @freeze_time(COURSE_END_DATE + timedelta(days=7)) def test_hidden_content_self_paced_past_end(self): - progress_url = 'http://test_progress_link' - html = self._get_rendered_student_view( - self.sequence_4_1, - extra_context=dict(progress_url=progress_url), - self_paced=True, - ) - self.assertIn("hidden_content.html", html) - self.assertIn(progress_url, html) + with freeze_time(COURSE_END_DATE + timedelta(days=7)): + progress_url = 'http://test_progress_link' + html = self._get_rendered_student_view( + self.sequence_4_1, + extra_context=dict(progress_url=progress_url), + self_paced=True, + ) + self.assertIn("hidden_content.html", html) + self.assertIn(progress_url, html) diff --git a/lms/djangoapps/certificates/apis/v0/tests/test_views.py b/lms/djangoapps/certificates/apis/v0/tests/test_views.py index cfa0d55fbe..b66c2bcdc5 100644 --- a/lms/djangoapps/certificates/apis/v0/tests/test_views.py +++ b/lms/djangoapps/certificates/apis/v0/tests/test_views.py @@ -35,8 +35,11 @@ class CertificatesRestApiTest(SharedModuleStoreTestCase, APITestCase): display_name='Verified Course' ) - @freeze_time(now) def setUp(self): + freezer = freeze_time(self.now) + freezer.start() + self.addCleanup(freezer.stop) + super(CertificatesRestApiTest, self).setUp() self.student = UserFactory.create(password=USER_PASSWORD) diff --git a/lms/djangoapps/certificates/tests/test_api.py b/lms/djangoapps/certificates/tests/test_api.py index 02224efe68..c0291a14db 100644 --- a/lms/djangoapps/certificates/tests/test_api.py +++ b/lms/djangoapps/certificates/tests/test_api.py @@ -326,8 +326,10 @@ class CertificateGetTests(SharedModuleStoreTestCase): now = timezone.now() @classmethod - @freeze_time(now) def setUpClass(cls): + cls.freezer = freeze_time(cls.now) + cls.freezer.start() + super(CertificateGetTests, cls).setUpClass() cls.student = UserFactory() cls.student_no_cert = UserFactory() @@ -365,6 +367,10 @@ class CertificateGetTests(SharedModuleStoreTestCase): verify_uuid=cls.uuid, ) + @classmethod + def tearDownClass(cls): + cls.freezer.stop() + def test_get_certificate_for_user(self): """ Test to get a certificate for a user for a specific course. diff --git a/lms/djangoapps/commerce/tests/__init__.py b/lms/djangoapps/commerce/tests/__init__.py index 922a2b3d85..82df849ba3 100644 --- a/lms/djangoapps/commerce/tests/__init__.py +++ b/lms/djangoapps/commerce/tests/__init__.py @@ -33,39 +33,38 @@ class EdxRestApiClientTest(TestCase): self.user = UserFactory() @httpretty.activate - @freeze_time('2015-7-2') def test_tracking_context(self): """ Ensure the tracking context is set up in the api client correctly and automatically. """ + with freeze_time('2015-7-2'): + # fake an E-Commerce API request. + httpretty.register_uri( + httpretty.POST, + '{}/baskets/1/'.format(settings.ECOMMERCE_API_URL.strip('/')), + status=200, body='{}', + adding_headers={'Content-Type': JSON} + ) - # fake an E-Commerce API request. - httpretty.register_uri( - httpretty.POST, - '{}/baskets/1/'.format(settings.ECOMMERCE_API_URL.strip('/')), - status=200, body='{}', - adding_headers={'Content-Type': JSON} - ) + mock_tracker = mock.Mock() + mock_tracker.resolve_context = mock.Mock(return_value={'client_id': self.TEST_CLIENT_ID, 'ip': '127.0.0.1'}) + with mock.patch('openedx.core.djangoapps.commerce.utils.tracker.get_tracker', return_value=mock_tracker): + ecommerce_api_client(self.user).baskets(1).post() - mock_tracker = mock.Mock() - mock_tracker.resolve_context = mock.Mock(return_value={'client_id': self.TEST_CLIENT_ID, 'ip': '127.0.0.1'}) - with mock.patch('openedx.core.djangoapps.commerce.utils.tracker.get_tracker', return_value=mock_tracker): - ecommerce_api_client(self.user).baskets(1).post() + # Verify the JWT includes the tracking context for the user + actual_header = httpretty.last_request().headers['Authorization'] - # Verify the JWT includes the tracking context for the user - actual_header = httpretty.last_request().headers['Authorization'] - - claims = { - 'tracking_context': { - 'lms_user_id': self.user.id, # pylint: disable=no-member - 'lms_client_id': self.TEST_CLIENT_ID, - 'lms_ip': '127.0.0.1', + claims = { + 'tracking_context': { + 'lms_user_id': self.user.id, # pylint: disable=no-member + 'lms_client_id': self.TEST_CLIENT_ID, + 'lms_ip': '127.0.0.1', + } } - } - expected_jwt = JwtBuilder(self.user).build_token(['email', 'profile'], additional_claims=claims) - expected_header = 'JWT {}'.format(expected_jwt) - self.assertEqual(actual_header, expected_header) + expected_jwt = JwtBuilder(self.user).build_token(['email', 'profile'], additional_claims=claims) + expected_header = 'JWT {}'.format(expected_jwt) + self.assertEqual(actual_header, expected_header) @httpretty.activate def test_client_unicode(self): diff --git a/lms/djangoapps/courseware/tests/test_date_summary.py b/lms/djangoapps/courseware/tests/test_date_summary.py index 16bd1c262a..66974670fa 100644 --- a/lms/djangoapps/courseware/tests/test_date_summary.py +++ b/lms/djangoapps/courseware/tests/test_date_summary.py @@ -7,6 +7,8 @@ from django.core.urlresolvers import reverse from freezegun import freeze_time from nose.plugins.attrib import attr from pytz import utc +from waffle.testutils import override_flag +from openedx.features.course_experience import UNIFIED_COURSE_EXPERIENCE_FLAG from commerce.models import CommerceConfiguration from course_modes.tests.factories import CourseModeFactory @@ -169,56 +171,66 @@ class CourseDateSummaryTest(SharedModuleStoreTestCase): self.setup_course_and_user(**course_options) self.assert_block_types(expected_blocks) - @freeze_time('2015-01-02') def test_todays_date_block(self): """ Helper function to test that today's date block renders correctly and displays the correct time, accounting for daylight savings """ - self.setup_course_and_user() - block = TodaysDate(self.course, self.user) - self.assertTrue(block.is_enabled) - self.assertEqual(block.date, datetime.now(utc)) - self.assertEqual(block.title, 'current_datetime') + with freeze_time('2015-01-02'): + self.setup_course_and_user() + block = TodaysDate(self.course, self.user) + self.assertTrue(block.is_enabled) + self.assertEqual(block.date, datetime.now(utc)) + self.assertEqual(block.title, 'current_datetime') - @freeze_time('2015-01-02') - def test_todays_date_no_timezone(self): - self.setup_course_and_user() - self.client.login(username='mrrobot', password='test') + @ddt.data( + 'info', + 'openedx.course_experience.course_home', + ) + @override_flag(UNIFIED_COURSE_EXPERIENCE_FLAG, active=True) + def test_todays_date_no_timezone(self, url_name): + with freeze_time('2015-01-02'): + self.setup_course_and_user() + self.client.login(username='mrrobot', password='test') - html_elements = [ - '

Important Course Dates

', - '
', - '
', - 'Important Course Dates', + '
', + '
', + 'Important Course Dates', - '
', - '
', - 'Important Course Dates', + '
', + '
', + ' % if SelfPacedConfiguration.current().enable_course_home_improvements: -

${_("Important Course Dates")}

- ## Should be organized by date, last date appearing at the bottom - - % for course_date in get_course_date_blocks(course, user): -
-
- % if course_date.title: - % if course_date.title == 'current_datetime': - - % else: - ${course_date.title} - % endif - % endif - % if course_date.date and course_date.title != 'current_datetime': -

- % endif - % if course_date.description: -

${course_date.description}

- % endif - % if course_date.link and course_date.link_text: - - ${course_date.link_text} - - % endif -
-
- % endfor - % endif + ${HTML(dates_fragment.body_html())} + % endif

${_(course.info_sidebar_name)}

${HTML(get_course_info_section(request, masquerade_user, course, 'handouts'))} diff --git a/openedx/core/djangoapps/user_api/verification_api/tests/test_views.py b/openedx/core/djangoapps/user_api/verification_api/tests/test_views.py index a9c49a99fb..79e732aac5 100644 --- a/openedx/core/djangoapps/user_api/verification_api/tests/test_views.py +++ b/openedx/core/djangoapps/user_api/verification_api/tests/test_views.py @@ -17,7 +17,6 @@ FROZEN_TIME = '2015-01-01' VERIFY_STUDENT = {'DAYS_GOOD_FOR': 365} -@freezegun.freeze_time(FROZEN_TIME) @override_settings(VERIFY_STUDENT=VERIFY_STUDENT) class PhotoVerificationStatusViewTests(TestCase): """ Tests for the PhotoVerificationStatusView endpoint. """ @@ -25,6 +24,10 @@ class PhotoVerificationStatusViewTests(TestCase): PASSWORD = 'test' def setUp(self): + freezer = freezegun.freeze_time(FROZEN_TIME) + freezer.start() + self.addCleanup(freezer.stop) + super(PhotoVerificationStatusViewTests, self).setUp() self.user = UserFactory(password=self.PASSWORD) self.staff = UserFactory(is_staff=True, password=self.PASSWORD) diff --git a/openedx/core/lib/tests/test_time_zone_utils.py b/openedx/core/lib/tests/test_time_zone_utils.py index 082b46cadd..a231467b4a 100644 --- a/openedx/core/lib/tests/test_time_zone_utils.py +++ b/openedx/core/lib/tests/test_time_zone_utils.py @@ -44,38 +44,38 @@ class TestTimeZoneUtils(TestCase): self.assertEqual(display_tz_info['abbr'], expected_abbr) self.assertEqual(display_tz_info['offset'], expected_offset) - @freeze_time("2015-02-09") def test_display_time_zone_without_dst(self): """ Test to ensure get_display_time_zone() returns full display string when no kwargs specified and returns just abbreviation or offset when specified """ - tz_info = self._display_time_zone_helper('America/Los_Angeles') - self._assert_time_zone_info_equal(tz_info, 'America/Los Angeles', 'PST', '-0800') + with freeze_time("2015-02-09"): + tz_info = self._display_time_zone_helper('America/Los_Angeles') + self._assert_time_zone_info_equal(tz_info, 'America/Los Angeles', 'PST', '-0800') - @freeze_time("2015-04-02") def test_display_time_zone_with_dst(self): """ Test to ensure get_display_time_zone() returns modified abbreviations and offsets during daylight savings time. """ - tz_info = self._display_time_zone_helper('America/Los_Angeles') - self._assert_time_zone_info_equal(tz_info, 'America/Los Angeles', 'PDT', '-0700') + with freeze_time("2015-04-02"): + tz_info = self._display_time_zone_helper('America/Los_Angeles') + self._assert_time_zone_info_equal(tz_info, 'America/Los Angeles', 'PDT', '-0700') - @freeze_time("2015-11-01 08:59:00") def test_display_time_zone_ambiguous_before(self): """ Test to ensure get_display_time_zone() returns correct abbreviations and offsets during ambiguous time periods (e.g. when DST is about to start/end) before the change """ - tz_info = self._display_time_zone_helper('America/Los_Angeles') - self._assert_time_zone_info_equal(tz_info, 'America/Los Angeles', 'PDT', '-0700') + with freeze_time("2015-11-01 08:59:00"): + tz_info = self._display_time_zone_helper('America/Los_Angeles') + self._assert_time_zone_info_equal(tz_info, 'America/Los Angeles', 'PDT', '-0700') - @freeze_time("2015-11-01 09:00:00") def test_display_time_zone_ambiguous_after(self): """ Test to ensure get_display_time_zone() returns correct abbreviations and offsets during ambiguous time periods (e.g. when DST is about to start/end) after the change """ - tz_info = self._display_time_zone_helper('America/Los_Angeles') - self._assert_time_zone_info_equal(tz_info, 'America/Los Angeles', 'PST', '-0800') + with freeze_time("2015-11-01 09:00:00"): + tz_info = self._display_time_zone_helper('America/Los_Angeles') + self._assert_time_zone_info_equal(tz_info, 'America/Los Angeles', 'PST', '-0800') diff --git a/openedx/features/course_experience/templates/course_experience/course-dates-fragment.html b/openedx/features/course_experience/templates/course_experience/course-dates-fragment.html new file mode 100644 index 0000000000..962405e36c --- /dev/null +++ b/openedx/features/course_experience/templates/course_experience/course-dates-fragment.html @@ -0,0 +1,36 @@ +## mako + +<%page expression_filter="h"/> + +<%namespace name='static' file='../static_content.html'/> + +<%! +from django.utils.translation import ugettext as _ +%> +

${_("Important Course Dates")}

+## Should be organized by date, last date appearing at the bottom + +% for course_date in course_date_blocks: +
+
+ % if course_date.title: + % if course_date.title == 'current_datetime': + + % else: + ${course_date.title} + % endif + % endif + % if course_date.date and course_date.title != 'current_datetime': +

+ % endif + % if course_date.description: +

${course_date.description}

+ % endif + % if course_date.link and course_date.link_text: + + ${course_date.link_text} + + % endif +
+
+% endfor diff --git a/openedx/features/course_experience/templates/course_experience/course-home-fragment.html b/openedx/features/course_experience/templates/course_experience/course-home-fragment.html index 45ee9442cb..82972b9168 100644 --- a/openedx/features/course_experience/templates/course_experience/course-home-fragment.html +++ b/openedx/features/course_experience/templates/course_experience/course-home-fragment.html @@ -90,6 +90,9 @@ from openedx.features.course_experience import UNIFIED_COURSE_EXPERIENCE_FLAG
+ % if handouts_html:

${_("Course Handouts")}

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 859c3fef58..82364e795b 100644 --- a/openedx/features/course_experience/tests/views/test_course_home.py +++ b/openedx/features/course_experience/tests/views/test_course_home.py @@ -65,7 +65,7 @@ class TestCourseHomePage(SharedModuleStoreTestCase): get_course_in_cache(self.course.id) # Fetch the view and verify the query counts - with self.assertNumQueries(35): + with self.assertNumQueries(37): with check_mongo_calls(3): url = course_home_url(self.course) self.client.get(url) diff --git a/openedx/features/course_experience/views/course_dates.py b/openedx/features/course_experience/views/course_dates.py new file mode 100644 index 0000000000..ccb2287543 --- /dev/null +++ b/openedx/features/course_experience/views/course_dates.py @@ -0,0 +1,27 @@ +""" +Fragment for rendering the course dates sidebar. +""" +from django.template.loader import render_to_string +from opaque_keys.edx.keys import CourseKey +from web_fragments.fragment import Fragment +from openedx.core.djangoapps.plugin_api.views import EdxFragmentView +from courseware.courses import get_course_with_access, get_course_date_blocks + + +class CourseDatesFragmentView(EdxFragmentView): + """ + A fragment to important dates within a course. + """ + def render_to_fragment(self, request, course_id=None, **kwargs): + """ + Render the course dates fragment. + """ + course_key = CourseKey.from_string(course_id) + course = get_course_with_access(request.user, 'load', course_key, check_if_enrolled=False) + course_date_blocks = get_course_date_blocks(course, request.user) + + context = { + 'course_date_blocks': course_date_blocks + } + html = render_to_string('course_experience/course-dates-fragment.html', context) + return Fragment(html) diff --git a/openedx/features/course_experience/views/course_home.py b/openedx/features/course_experience/views/course_home.py index 8baa859ad7..9ed7c96a5f 100644 --- a/openedx/features/course_experience/views/course_home.py +++ b/openedx/features/course_experience/views/course_home.py @@ -17,6 +17,7 @@ from util.views import ensure_valid_course_key from web_fragments.fragment import Fragment from .course_outline import CourseOutlineFragmentView +from .course_dates import CourseDatesFragmentView from ..utils import get_course_outline_block_tree @@ -92,6 +93,9 @@ class CourseHomeFragmentView(EdxFragmentView): # Get resume course information has_visited_course, resume_course_url = self._get_resume_course_info(request, course_id) + # Render the course dates as a fragment + dates_fragment = CourseDatesFragmentView().render_to_fragment(request, course_id=course_id, **kwargs) + # Get the handouts # TODO: Use get_course_overview_with_access and blocks api course = get_course_with_access(request.user, 'load', course_key, check_if_enrolled=True) @@ -101,10 +105,12 @@ class CourseHomeFragmentView(EdxFragmentView): context = { 'csrf': csrf(request)['csrf_token'], 'course_key': course_key, + 'course': course, 'outline_fragment': outline_fragment, 'handouts_html': handouts_html, 'has_visited_course': has_visited_course, 'resume_course_url': resume_course_url, + 'dates_fragment': dates_fragment, 'disable_courseware_js': True, 'uses_pattern_library': True, } diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index 8d8087c702..eefa8fa8da 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -163,7 +163,7 @@ django-crum==0.5 django_nose==1.4.1 factory_boy==2.8.1 flaky==3.3.0 -freezegun==0.1.11 +freezegun==0.3.8 mock-django==0.6.9 mock==1.0.1 moto==0.3.1