From 242272867162cd5ef31d5030686d50279e3f534e Mon Sep 17 00:00:00 2001 From: Marko Jevtic Date: Thu, 8 Jun 2017 07:37:41 +0000 Subject: [PATCH] LEARNER-1366 EcommerceService should be able to provide a link to the basket page that contains multiple products --- common/djangoapps/course_modes/views.py | 4 ++-- lms/djangoapps/commerce/tests/test_utils.py | 16 +++++++++++----- lms/djangoapps/commerce/utils.py | 18 ++++++++++++++---- lms/djangoapps/courseware/date_summary.py | 2 +- lms/djangoapps/courseware/views/views.py | 4 ++-- lms/djangoapps/verify_student/views.py | 2 +- openedx/core/djangoapps/programs/utils.py | 2 +- 7 files changed, 32 insertions(+), 16 deletions(-) diff --git a/common/djangoapps/course_modes/views.py b/common/djangoapps/course_modes/views.py index e7058f7311..f034b060fc 100644 --- a/common/djangoapps/course_modes/views.py +++ b/common/djangoapps/course_modes/views.py @@ -99,9 +99,9 @@ class ChooseModeView(View): if ecommerce_service.is_enabled(request.user): professional_mode = modes.get(CourseMode.NO_ID_PROFESSIONAL_MODE) or modes.get(CourseMode.PROFESSIONAL) if purchase_workflow == "single" and professional_mode.sku: - redirect_url = ecommerce_service.checkout_page_url(professional_mode.sku) + redirect_url = ecommerce_service.get_checkout_page_url(professional_mode.sku) if purchase_workflow == "bulk" and professional_mode.bulk_sku: - redirect_url = ecommerce_service.checkout_page_url(professional_mode.bulk_sku) + redirect_url = ecommerce_service.get_checkout_page_url(professional_mode.bulk_sku) return redirect(redirect_url) # If there isn't a verified mode available, then there's nothing diff --git a/lms/djangoapps/commerce/tests/test_utils.py b/lms/djangoapps/commerce/tests/test_utils.py index d8ded5b616..201923ee45 100644 --- a/lms/djangoapps/commerce/tests/test_utils.py +++ b/lms/djangoapps/commerce/tests/test_utils.py @@ -1,4 +1,7 @@ """Tests of commerce utilities.""" +from urllib import urlencode + +import ddt from django.conf import settings from django.test import TestCase from django.test.client import RequestFactory @@ -9,7 +12,6 @@ from waffle.testutils import override_switch from commerce.models import CommerceConfiguration from commerce.utils import EcommerceService from openedx.core.lib.log_utils import audit_log -from openedx.core.djangoapps.site_configuration.tests.test_util import with_site_configuration from student.tests.factories import UserFactory @@ -34,9 +36,9 @@ class AuditLogTests(TestCase): self.assertTrue(mock_log.info.called_with(message)) +@ddt.ddt class EcommerceServiceTests(TestCase): """Tests for the EcommerceService helper class.""" - SKU = 'TESTSKU' def setUp(self): self.request_factory = RequestFactory() @@ -91,8 +93,12 @@ class EcommerceServiceTests(TestCase): self.assertEqual(url, expected_url) @override_settings(ECOMMERCE_PUBLIC_URL_ROOT='http://ecommerce_url') - def test_checkout_page_url(self): + @ddt.data(['TESTSKU'], ['TESTSKU1', 'TESTSKU2', 'TESTSKU3']) + def test_get_checkout_page_url(self, skus): """ Verify the checkout page URL is properly constructed and returned. """ - url = EcommerceService().checkout_page_url(self.SKU) - expected_url = 'http://ecommerce_url/test_basket/?sku={}'.format(self.SKU) + url = EcommerceService().get_checkout_page_url(*skus) + expected_url = '{root}/test_basket/?{skus}'.format( + root=settings.ECOMMERCE_PUBLIC_URL_ROOT, + skus=urlencode({'sku': skus}, doseq=True), + ) self.assertEqual(url, expected_url) diff --git a/lms/djangoapps/commerce/utils.py b/lms/djangoapps/commerce/utils.py index f35181fbd0..d0300bb394 100644 --- a/lms/djangoapps/commerce/utils.py +++ b/lms/djangoapps/commerce/utils.py @@ -1,4 +1,5 @@ """Utilities to assist with commerce tasks.""" +from urllib import urlencode from urlparse import urljoin from django.conf import settings @@ -76,10 +77,19 @@ class EcommerceService(object): """ return self.get_absolute_ecommerce_url(self.config.single_course_checkout_page) - def checkout_page_url(self, sku): - """ Construct the URL to the ecommerce checkout page and include a product. + def get_checkout_page_url(self, *skus): + """ Construct the URL to the ecommerce checkout page and include products. + + Args: + skus (list): List of SKUs associated with products to be added to basket + + Returns: + Absolute path to the ecommerce checkout page showing basket that contains specified products. Example: - http://localhost:8002/basket/single_item/?sku=5H3HG5 + http://localhost:8002/basket/single_item/?sku=5H3HG5&sku=57FHHD """ - return "{}?sku={}".format(self.get_absolute_ecommerce_url(self.config.single_course_checkout_page), sku) + return '{checkout_page_path}?{skus}'.format( + checkout_page_path=self.get_absolute_ecommerce_url(self.config.single_course_checkout_page), + skus=urlencode({'sku': skus}, doseq=True), + ) diff --git a/lms/djangoapps/courseware/date_summary.py b/lms/djangoapps/courseware/date_summary.py index 0fc6797d90..c0fa0c6eda 100644 --- a/lms/djangoapps/courseware/date_summary.py +++ b/lms/djangoapps/courseware/date_summary.py @@ -207,7 +207,7 @@ class VerifiedUpgradeDeadlineDate(DateSummary): course_mode = CourseMode.objects.get( course_id=self.course_id, mode_slug=CourseMode.VERIFIED ) - return ecommerce_service.checkout_page_url(course_mode.sku) + return ecommerce_service.get_checkout_page_url(course_mode.sku) return reverse('verify_student_upgrade_and_verify', args=(self.course_id,)) @property diff --git a/lms/djangoapps/courseware/views/views.py b/lms/djangoapps/courseware/views/views.py index c803fb7ed9..cb3f8ed1b8 100644 --- a/lms/djangoapps/courseware/views/views.py +++ b/lms/djangoapps/courseware/views/views.py @@ -732,9 +732,9 @@ def course_about(request, course_id): professional_mode = modes.get(CourseMode.PROFESSIONAL, '') or \ modes.get(CourseMode.NO_ID_PROFESSIONAL_MODE, '') if professional_mode.sku: - ecommerce_checkout_link = ecomm_service.checkout_page_url(professional_mode.sku) + ecommerce_checkout_link = ecomm_service.get_checkout_page_url(professional_mode.sku) if professional_mode.bulk_sku: - ecommerce_bulk_checkout_link = ecomm_service.checkout_page_url(professional_mode.bulk_sku) + ecommerce_bulk_checkout_link = ecomm_service.get_checkout_page_url(professional_mode.bulk_sku) registration_price, course_price = get_course_prices(course) diff --git a/lms/djangoapps/verify_student/views.py b/lms/djangoapps/verify_student/views.py index c69c998d5f..c1bf4e4282 100644 --- a/lms/djangoapps/verify_student/views.py +++ b/lms/djangoapps/verify_student/views.py @@ -505,7 +505,7 @@ class PayAndVerifyView(View): # is enabled redirect him to the ecommerce checkout page. ecommerce_service = EcommerceService() if ecommerce_service.is_enabled(user): - url = ecommerce_service.checkout_page_url(sku) + url = ecommerce_service.get_checkout_page_url(sku) # Redirect if necessary, otherwise implicitly return None if url is not None: diff --git a/openedx/core/djangoapps/programs/utils.py b/openedx/core/djangoapps/programs/utils.py index ba0d5b0607..dbc7421cd8 100644 --- a/openedx/core/djangoapps/programs/utils.py +++ b/openedx/core/djangoapps/programs/utils.py @@ -432,7 +432,7 @@ class ProgramDataExtender(object): ecommerce = EcommerceService() sku = getattr(required_mode, 'sku', None) if ecommerce.is_enabled(self.user) and sku: - run_mode['upgrade_url'] = ecommerce.checkout_page_url(required_mode.sku) + run_mode['upgrade_url'] = ecommerce.get_checkout_page_url(required_mode.sku) else: run_mode['upgrade_url'] = None else: