Commit 24227286 by Marko Jevtic

LEARNER-1366 EcommerceService should be able to provide a link to the basket…

LEARNER-1366 EcommerceService should be able to provide a link to the basket page that contains multiple products
parent 58c3366f
...@@ -99,9 +99,9 @@ class ChooseModeView(View): ...@@ -99,9 +99,9 @@ class ChooseModeView(View):
if ecommerce_service.is_enabled(request.user): if ecommerce_service.is_enabled(request.user):
professional_mode = modes.get(CourseMode.NO_ID_PROFESSIONAL_MODE) or modes.get(CourseMode.PROFESSIONAL) professional_mode = modes.get(CourseMode.NO_ID_PROFESSIONAL_MODE) or modes.get(CourseMode.PROFESSIONAL)
if purchase_workflow == "single" and professional_mode.sku: 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: 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) return redirect(redirect_url)
# If there isn't a verified mode available, then there's nothing # If there isn't a verified mode available, then there's nothing
......
"""Tests of commerce utilities.""" """Tests of commerce utilities."""
from urllib import urlencode
import ddt
from django.conf import settings from django.conf import settings
from django.test import TestCase from django.test import TestCase
from django.test.client import RequestFactory from django.test.client import RequestFactory
...@@ -9,7 +12,6 @@ from waffle.testutils import override_switch ...@@ -9,7 +12,6 @@ from waffle.testutils import override_switch
from commerce.models import CommerceConfiguration from commerce.models import CommerceConfiguration
from commerce.utils import EcommerceService from commerce.utils import EcommerceService
from openedx.core.lib.log_utils import audit_log 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 from student.tests.factories import UserFactory
...@@ -34,9 +36,9 @@ class AuditLogTests(TestCase): ...@@ -34,9 +36,9 @@ class AuditLogTests(TestCase):
self.assertTrue(mock_log.info.called_with(message)) self.assertTrue(mock_log.info.called_with(message))
@ddt.ddt
class EcommerceServiceTests(TestCase): class EcommerceServiceTests(TestCase):
"""Tests for the EcommerceService helper class.""" """Tests for the EcommerceService helper class."""
SKU = 'TESTSKU'
def setUp(self): def setUp(self):
self.request_factory = RequestFactory() self.request_factory = RequestFactory()
...@@ -91,8 +93,12 @@ class EcommerceServiceTests(TestCase): ...@@ -91,8 +93,12 @@ class EcommerceServiceTests(TestCase):
self.assertEqual(url, expected_url) self.assertEqual(url, expected_url)
@override_settings(ECOMMERCE_PUBLIC_URL_ROOT='http://ecommerce_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. """ """ Verify the checkout page URL is properly constructed and returned. """
url = EcommerceService().checkout_page_url(self.SKU) url = EcommerceService().get_checkout_page_url(*skus)
expected_url = 'http://ecommerce_url/test_basket/?sku={}'.format(self.SKU) expected_url = '{root}/test_basket/?{skus}'.format(
root=settings.ECOMMERCE_PUBLIC_URL_ROOT,
skus=urlencode({'sku': skus}, doseq=True),
)
self.assertEqual(url, expected_url) self.assertEqual(url, expected_url)
"""Utilities to assist with commerce tasks.""" """Utilities to assist with commerce tasks."""
from urllib import urlencode
from urlparse import urljoin from urlparse import urljoin
from django.conf import settings from django.conf import settings
...@@ -76,10 +77,19 @@ class EcommerceService(object): ...@@ -76,10 +77,19 @@ class EcommerceService(object):
""" """
return self.get_absolute_ecommerce_url(self.config.single_course_checkout_page) return self.get_absolute_ecommerce_url(self.config.single_course_checkout_page)
def checkout_page_url(self, sku): def get_checkout_page_url(self, *skus):
""" Construct the URL to the ecommerce checkout page and include a product. """ 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: 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): ...@@ -207,7 +207,7 @@ class VerifiedUpgradeDeadlineDate(DateSummary):
course_mode = CourseMode.objects.get( course_mode = CourseMode.objects.get(
course_id=self.course_id, mode_slug=CourseMode.VERIFIED 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,)) return reverse('verify_student_upgrade_and_verify', args=(self.course_id,))
@property @property
......
...@@ -732,9 +732,9 @@ def course_about(request, course_id): ...@@ -732,9 +732,9 @@ def course_about(request, course_id):
professional_mode = modes.get(CourseMode.PROFESSIONAL, '') or \ professional_mode = modes.get(CourseMode.PROFESSIONAL, '') or \
modes.get(CourseMode.NO_ID_PROFESSIONAL_MODE, '') modes.get(CourseMode.NO_ID_PROFESSIONAL_MODE, '')
if professional_mode.sku: 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: 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) registration_price, course_price = get_course_prices(course)
......
...@@ -505,7 +505,7 @@ class PayAndVerifyView(View): ...@@ -505,7 +505,7 @@ class PayAndVerifyView(View):
# is enabled redirect him to the ecommerce checkout page. # is enabled redirect him to the ecommerce checkout page.
ecommerce_service = EcommerceService() ecommerce_service = EcommerceService()
if ecommerce_service.is_enabled(user): 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 # Redirect if necessary, otherwise implicitly return None
if url is not None: if url is not None:
......
...@@ -432,7 +432,7 @@ class ProgramDataExtender(object): ...@@ -432,7 +432,7 @@ class ProgramDataExtender(object):
ecommerce = EcommerceService() ecommerce = EcommerceService()
sku = getattr(required_mode, 'sku', None) sku = getattr(required_mode, 'sku', None)
if ecommerce.is_enabled(self.user) and sku: 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: else:
run_mode['upgrade_url'] = None run_mode['upgrade_url'] = None
else: 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