From 3c8ae7c3b214aec79e707294ccb8285b7ddde2ba Mon Sep 17 00:00:00 2001 From: vkaracic Date: Fri, 18 Mar 2016 14:43:53 +0000 Subject: [PATCH] Change EcommerceService's is_enabled to accept User instead of request . And change the verification link in the sidebar to redirect to new basket if the EcommerceService is enabled. --- common/djangoapps/course_modes/views.py | 4 ++-- common/djangoapps/student/views.py | 2 +- lms/djangoapps/commerce/tests/test_utils.py | 7 +++---- lms/djangoapps/commerce/utils.py | 4 ++-- lms/djangoapps/courseware/date_summary.py | 7 +++++++ .../courseware/tests/test_date_summary.py | 17 ++++++++++++++++- lms/djangoapps/courseware/tests/test_views.py | 6 ++---- lms/djangoapps/courseware/views.py | 4 ++-- 8 files changed, 35 insertions(+), 16 deletions(-) diff --git a/common/djangoapps/course_modes/views.py b/common/djangoapps/course_modes/views.py index 5e87c2f945..e81d67be77 100644 --- a/common/djangoapps/course_modes/views.py +++ b/common/djangoapps/course_modes/views.py @@ -89,7 +89,7 @@ class ChooseModeView(View): has_enrolled_professional = (CourseMode.is_professional_slug(enrollment_mode) and is_active) if CourseMode.has_professional_mode(modes) and not has_enrolled_professional: redirect_url = reverse('verify_student_start_flow', kwargs={'course_id': unicode(course_key)}) - if ecommerce_service.is_enabled(request): + if ecommerce_service.is_enabled(request.user): professional_mode = modes.get(CourseMode.NO_ID_PROFESSIONAL_MODE) or modes.get(CourseMode.PROFESSIONAL) if professional_mode.sku: redirect_url = ecommerce_service.checkout_page_url(professional_mode.sku) @@ -158,7 +158,7 @@ class ChooseModeView(View): context["verified_description"] = verified_mode.description if verified_mode.sku: - context["use_ecommerce_payment_flow"] = ecommerce_service.is_enabled(request) + context["use_ecommerce_payment_flow"] = ecommerce_service.is_enabled(request.user) context["ecommerce_payment_page"] = ecommerce_service.payment_page_url() context["sku"] = verified_mode.sku diff --git a/common/djangoapps/student/views.py b/common/djangoapps/student/views.py index c0abaccd7f..0930a69194 100644 --- a/common/djangoapps/student/views.py +++ b/common/djangoapps/student/views.py @@ -743,7 +743,7 @@ def dashboard(request): } ecommerce_service = EcommerceService() - if ecommerce_service.is_enabled(request): + if ecommerce_service.is_enabled(request.user): context.update({ 'use_ecommerce_payment_flow': True, 'ecommerce_payment_page': ecommerce_service.payment_page_url(), diff --git a/lms/djangoapps/commerce/tests/test_utils.py b/lms/djangoapps/commerce/tests/test_utils.py index 2e631f46e4..ae979a3902 100644 --- a/lms/djangoapps/commerce/tests/test_utils.py +++ b/lms/djangoapps/commerce/tests/test_utils.py @@ -38,26 +38,25 @@ class EcommerceServiceTests(TestCase): self.request_factory = RequestFactory() self.user = UserFactory.create() self.request = self.request_factory.get("foo") - self.request.user = self.user update_commerce_config(enabled=True) super(EcommerceServiceTests, self).setUp() def test_is_enabled(self): """Verify that is_enabled() returns True when ecomm checkout is enabled. """ - is_enabled = EcommerceService().is_enabled(self.request) + is_enabled = EcommerceService().is_enabled(self.user) self.assertTrue(is_enabled) config = CommerceConfiguration.current() config.checkout_on_ecommerce_service = False config.save() - is_not_enabled = EcommerceService().is_enabled(self.request) + is_not_enabled = EcommerceService().is_enabled(self.user) self.assertFalse(is_not_enabled) @patch('openedx.core.djangoapps.theming.helpers.is_request_in_themed_site') def test_is_enabled_for_microsites(self, is_microsite): """Verify that is_enabled() returns False if used for a microsite.""" is_microsite.return_value = True - is_not_enabled = EcommerceService().is_enabled(self.request) + is_not_enabled = EcommerceService().is_enabled(self.user) self.assertFalse(is_not_enabled) @override_settings(ECOMMERCE_PUBLIC_URL_ROOT='http://ecommerce_url') diff --git a/lms/djangoapps/commerce/utils.py b/lms/djangoapps/commerce/utils.py index e07ec1d9b7..7499c57053 100644 --- a/lms/djangoapps/commerce/utils.py +++ b/lms/djangoapps/commerce/utils.py @@ -44,9 +44,9 @@ class EcommerceService(object): def __init__(self): self.config = CommerceConfiguration.current() - def is_enabled(self, request): + def is_enabled(self, user): """ Check if the user is activated, if the service is enabled and that the site is not a microsite. """ - return (request.user.is_active and self.config.checkout_on_ecommerce_service and not + return (user.is_active and self.config.checkout_on_ecommerce_service and not helpers.is_request_in_themed_site()) def payment_page_url(self): diff --git a/lms/djangoapps/courseware/date_summary.py b/lms/djangoapps/courseware/date_summary.py index 06170a3995..b5347d8501 100644 --- a/lms/djangoapps/courseware/date_summary.py +++ b/lms/djangoapps/courseware/date_summary.py @@ -14,6 +14,7 @@ from lazy import lazy import pytz from course_modes.models import CourseMode +from lms.djangoapps.commerce.utils import EcommerceService from lms.djangoapps.verify_student.models import VerificationDeadline, SoftwareSecurePhotoVerification from student.models import CourseEnrollment @@ -204,6 +205,12 @@ class VerifiedUpgradeDeadlineDate(DateSummary): @property def link(self): + ecommerce_service = EcommerceService() + if ecommerce_service.is_enabled(self.user): + course_mode = CourseMode.objects.get( + course_id=self.course.id, mode_slug=CourseMode.VERIFIED + ) + return ecommerce_service.checkout_page_url(course_mode.sku) return reverse('verify_student_upgrade_and_verify', args=(self.course.id,)) @lazy diff --git a/lms/djangoapps/courseware/tests/test_date_summary.py b/lms/djangoapps/courseware/tests/test_date_summary.py index 60a392b169..1a6f4bb60e 100644 --- a/lms/djangoapps/courseware/tests/test_date_summary.py +++ b/lms/djangoapps/courseware/tests/test_date_summary.py @@ -8,6 +8,7 @@ import freezegun from nose.plugins.attrib import attr import pytz +from commerce.models import CommerceConfiguration from course_modes.tests.factories import CourseModeFactory from course_modes.models import CourseMode from courseware.courses import _get_course_date_summary_blocks @@ -44,6 +45,7 @@ class CourseDateSummaryTest(SharedModuleStoreTestCase): enrollment_mode=CourseMode.VERIFIED, days_till_verification_deadline=14, verification_status=None, + sku=None ): """Set up the course and user for this test.""" now = datetime.now(pytz.UTC) @@ -61,7 +63,8 @@ class CourseDateSummaryTest(SharedModuleStoreTestCase): CourseModeFactory.create( course_id=self.course.id, mode_slug=enrollment_mode, - expiration_datetime=now + timedelta(days=days_till_upgrade_deadline) + expiration_datetime=now + timedelta(days=days_till_upgrade_deadline), + sku=sku ) CourseEnrollmentFactory.create(course_id=self.course.id, user=self.user, mode=enrollment_mode) else: @@ -200,6 +203,18 @@ class CourseDateSummaryTest(SharedModuleStoreTestCase): block = VerifiedUpgradeDeadlineDate(self.course, self.user) self.assertIsNone(block.date) + def test_ecommerce_checkout_redirect(self): + """Verify the block link redirects to ecommerce checkout if it's enabled.""" + sku = 'TESTSKU' + checkout_page = '/test_basket/' + CommerceConfiguration.objects.create( + checkout_on_ecommerce_service=True, + single_course_checkout_page=checkout_page + ) + self.setup_course_and_user(sku=sku) + block = VerifiedUpgradeDeadlineDate(self.course, self.user) + self.assertEqual(block.link, '{}?sku={}'.format(checkout_page, sku)) + ## VerificationDeadlineDate def test_no_verification_deadline(self): diff --git a/lms/djangoapps/courseware/tests/test_views.py b/lms/djangoapps/courseware/tests/test_views.py index 94f6b2d326..cae1b67c95 100644 --- a/lms/djangoapps/courseware/tests/test_views.py +++ b/lms/djangoapps/courseware/tests/test_views.py @@ -278,8 +278,7 @@ class ViewsTestCase(ModuleStoreTestCase): self.assert_enrollment_link_present(is_anonymous=is_anonymous) else: request = self.request_factory.get("foo") - request.user = AnonymousUser() - self.assertEqual(EcommerceService().is_enabled(request), False) + self.assertEqual(EcommerceService().is_enabled(AnonymousUser()), False) @ddt.data(True, False) @unittest.skipUnless(settings.FEATURES.get('ENABLE_SHOPPING_CART'), 'Shopping Cart not enabled in settings') @@ -289,8 +288,7 @@ class ViewsTestCase(ModuleStoreTestCase): self.assert_enrollment_link_present(is_anonymous=is_anonymous, _id=True) else: request = self.request_factory.get("foo") - request.user = AnonymousUser() - self.assertEqual(EcommerceService().is_enabled(request), False) + self.assertEqual(EcommerceService().is_enabled(AnonymousUser()), False) def test_user_groups(self): # depreciated function diff --git a/lms/djangoapps/courseware/views.py b/lms/djangoapps/courseware/views.py index 8eae511794..ee6df9b384 100644 --- a/lms/djangoapps/courseware/views.py +++ b/lms/djangoapps/courseware/views.py @@ -909,7 +909,7 @@ def course_about(request, course_id): ecommerce_checkout_link = '' professional_mode = '' ecomm_service = EcommerceService() - if ecomm_service.is_enabled(request) and ( + if ecomm_service.is_enabled(request.user) and ( CourseMode.PROFESSIONAL in modes or CourseMode.NO_ID_PROFESSIONAL_MODE in modes ): professional_mode = modes.get(CourseMode.PROFESSIONAL, '') or \ @@ -947,7 +947,7 @@ def course_about(request, course_id): 'is_cosmetic_price_enabled': settings.FEATURES.get('ENABLE_COSMETIC_DISPLAY_PRICE'), 'course_price': course_price, 'in_cart': in_cart, - 'ecommerce_checkout': ecomm_service.is_enabled(request), + 'ecommerce_checkout': ecomm_service.is_enabled(request.user), 'ecommerce_checkout_link': ecommerce_checkout_link, 'professional_mode': professional_mode, 'reg_then_add_to_cart_link': reg_then_add_to_cart_link,