From 13ee3056fff3ae5c35f72e170cb89ba7a7da71bc Mon Sep 17 00:00:00 2001 From: "Albert St. Aubin" Date: Thu, 16 Feb 2017 07:59:04 -0500 Subject: [PATCH] update session cookie with the course id --- .../courseware/tests/test_date_summary.py | 33 +++++++++++++++++-- lms/djangoapps/courseware/views/views.py | 27 ++++++++++----- 2 files changed, 49 insertions(+), 11 deletions(-) diff --git a/lms/djangoapps/courseware/tests/test_date_summary.py b/lms/djangoapps/courseware/tests/test_date_summary.py index 2627fef09d..0b396f8844 100644 --- a/lms/djangoapps/courseware/tests/test_date_summary.py +++ b/lms/djangoapps/courseware/tests/test_date_summary.py @@ -49,14 +49,17 @@ class CourseDateSummaryTest(SharedModuleStoreTestCase): course_min_price=100, days_till_verification_deadline=14, verification_status=None, - sku=None + sku=None, + create_user=True ): """Set up the course and user for this test.""" now = datetime.now(utc) + if create_user: + self.user = UserFactory.create(username='mrrobot', password='test') # pylint: disable=attribute-defined-outside-init + self.course = CourseFactory.create( # pylint: disable=attribute-defined-outside-init start=now + timedelta(days=days_till_start) ) - self.user = UserFactory.create(username='mrrobot', password='test') # pylint: disable=attribute-defined-outside-init if days_till_end is not None: self.course.end = now + timedelta(days=days_till_end) @@ -280,7 +283,12 @@ class CourseDateSummaryTest(SharedModuleStoreTestCase): # Tests Verified Upgrade Deadline Date Block - def check_upgrade_banner(self, banner_expected=True, include_url_parameter=True): + def check_upgrade_banner( + self, + banner_expected=True, + include_url_parameter=True, + expected_cookie_value=None + ): """ Helper method to check for the presence of the Upgrade Banner """ @@ -288,11 +296,17 @@ class CourseDateSummaryTest(SharedModuleStoreTestCase): if include_url_parameter: url += '?upgrade=true' resp = self.client.get(url) + upgrade_cookie_name = 'show_upgrade_notification' expected_banner_text = "Give yourself an additional incentive to complete" if banner_expected: self.assertIn(expected_banner_text, resp.content) + self.assertIn(str(self.course.id), self.client.cookies[upgrade_cookie_name].value) else: self.assertNotIn(expected_banner_text, resp.content) + if upgrade_cookie_name in self.client.cookies: + self.assertNotIn(str(self.course.id), self.client.cookies[upgrade_cookie_name].value) + if expected_cookie_value is not None: + self.assertIn(str(expected_cookie_value), self.client.cookies[upgrade_cookie_name].value) @freeze_time('2015-01-02') def test_verified_upgrade_deadline_date(self): @@ -335,6 +349,19 @@ class CourseDateSummaryTest(SharedModuleStoreTestCase): # the URL parameter in order to see the notification. self.check_upgrade_banner(include_url_parameter=False) + # Store the current course_id for testing + old_course_id = self.course.id + + # Change to another course + self.setup_course_and_user(days_till_upgrade_deadline=1, + user_enrollment_mode=CourseMode.AUDIT, + create_user=False) + + # Banner should not be present in the newly created course + self.check_upgrade_banner(include_url_parameter=False, + banner_expected=False, + expected_cookie_value=old_course_id) + # Unfortunately (according to django doc), it is not possible to test expiration of the cookie. def test_ecommerce_checkout_redirect(self): diff --git a/lms/djangoapps/courseware/views/views.py b/lms/djangoapps/courseware/views/views.py index 45782714e1..22e3aab350 100644 --- a/lms/djangoapps/courseware/views/views.py +++ b/lms/djangoapps/courseware/views/views.py @@ -354,13 +354,16 @@ def course_info(request, course_id): if request.GET.get('upgrade', 'false') == 'true': store_upgrade_cookie = True show_upgrade_notification = True - elif upgrade_cookie_name in request.COOKIES and bool(request.COOKIES[upgrade_cookie_name]): + elif upgrade_cookie_name in request.COOKIES and course_id in request.COOKIES[upgrade_cookie_name]: show_upgrade_notification = True if show_upgrade_notification: upgrade_data = VerifiedUpgradeDeadlineDate(course, user) if upgrade_data.is_enabled: upgrade_link = upgrade_data.link + else: + # The upgrade is not enabled so the cookie does not need to be stored + store_upgrade_cookie = False context = { 'request': request, @@ -393,13 +396,21 @@ def course_info(request, course_id): response = render_to_response('courseware/info.html', context) if store_upgrade_cookie: - response.set_cookie( - upgrade_cookie_name, - True, - max_age=10 * 24 * 60 * 60, # set for 10 days - domain=settings.SESSION_COOKIE_DOMAIN, - httponly=True # no use case for accessing from JavaScript - ) + if upgrade_cookie_name in request.COOKIES and str(course_id) not in request.COOKIES[upgrade_cookie_name]: + cookie_value = '%s,%s' % (course_id, request.COOKIES[upgrade_cookie_name]) + elif upgrade_cookie_name in request.COOKIES and str(course_id) in request.COOKIES[upgrade_cookie_name]: + cookie_value = request.COOKIES[upgrade_cookie_name] + else: + cookie_value = course_id + + if cookie_value is not None: + response.set_cookie( + upgrade_cookie_name, + cookie_value, + max_age=10 * 24 * 60 * 60, # set for 10 days + domain=settings.SESSION_COOKIE_DOMAIN, + httponly=True # no use case for accessing from JavaScript + ) return response