Commit 53cd05fb by Marko Jevtić Committed by GitHub

Merge pull request #15269 from edx/mjevtic/LEARNER-1366

LEARNER-1366 EcommerceService should be able to provide a link to the basket page that contains multiple products
parents 58c3366f 24227286
......@@ -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
......
"""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)
"""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),
)
......@@ -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
......
......@@ -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)
......
......@@ -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:
......
......@@ -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:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment