112 lines
3.9 KiB
Python
112 lines
3.9 KiB
Python
"""Utilities to assist with commerce tasks."""
|
|
from urllib import urlencode
|
|
from urlparse import urljoin
|
|
|
|
import waffle
|
|
from django.conf import settings
|
|
from django.core.urlresolvers import reverse
|
|
|
|
from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
|
|
from student.models import CourseEnrollment
|
|
|
|
from .models import CommerceConfiguration
|
|
|
|
|
|
def is_account_activation_requirement_disabled():
|
|
"""
|
|
Checks to see if the django-waffle switch for disabling the account activation requirement is active
|
|
|
|
Returns:
|
|
Boolean value representing switch status
|
|
"""
|
|
switch_name = configuration_helpers.get_value(
|
|
'DISABLE_ACCOUNT_ACTIVATION_REQUIREMENT_SWITCH',
|
|
settings.DISABLE_ACCOUNT_ACTIVATION_REQUIREMENT_SWITCH
|
|
)
|
|
return waffle.switch_is_active(switch_name)
|
|
|
|
|
|
class EcommerceService(object):
|
|
""" Helper class for ecommerce service integration. """
|
|
def __init__(self):
|
|
self.config = CommerceConfiguration.current()
|
|
|
|
@property
|
|
def ecommerce_url_root(self):
|
|
""" Retrieve Ecommerce service public url root. """
|
|
return configuration_helpers.get_value('ECOMMERCE_PUBLIC_URL_ROOT', settings.ECOMMERCE_PUBLIC_URL_ROOT)
|
|
|
|
def get_absolute_ecommerce_url(self, ecommerce_page_url):
|
|
""" Return the absolute URL to the ecommerce page.
|
|
|
|
Args:
|
|
ecommerce_page_url (str): Relative path to the ecommerce page.
|
|
|
|
Returns:
|
|
Absolute path to the ecommerce page.
|
|
"""
|
|
return urljoin(self.ecommerce_url_root, ecommerce_page_url)
|
|
|
|
def get_receipt_page_url(self, order_number):
|
|
"""
|
|
Gets the URL for the Order Receipt page hosted by the ecommerce service.
|
|
|
|
Args:
|
|
order_number (str): Order number.
|
|
|
|
Returns:
|
|
Receipt page for the specified Order.
|
|
"""
|
|
|
|
return self.get_absolute_ecommerce_url(CommerceConfiguration.DEFAULT_RECEIPT_PAGE_URL + order_number)
|
|
|
|
def is_enabled(self, user):
|
|
"""
|
|
Determines the availability of the EcommerceService based on user activation and service configuration.
|
|
Note: If the user is anonymous we bypass the user activation gate and only look at the service config.
|
|
|
|
Returns:
|
|
Boolean
|
|
"""
|
|
user_is_active = user.is_active or is_account_activation_requirement_disabled()
|
|
allow_user = user_is_active or user.is_anonymous()
|
|
return allow_user and self.config.checkout_on_ecommerce_service
|
|
|
|
def payment_page_url(self):
|
|
""" Return the URL for the checkout page.
|
|
|
|
Example:
|
|
http://localhost:8002/basket/single_item/
|
|
"""
|
|
return self.get_absolute_ecommerce_url(self.config.single_course_checkout_page)
|
|
|
|
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/add/?sku=5H3HG5&sku=57FHHD
|
|
"""
|
|
return '{checkout_page_path}?{skus}'.format(
|
|
checkout_page_path=self.get_absolute_ecommerce_url(self.config.MULTIPLE_ITEMS_BASKET_PAGE_URL),
|
|
skus=urlencode({'sku': skus}, doseq=True),
|
|
)
|
|
|
|
def upgrade_url(self, user, course_key):
|
|
"""
|
|
Returns the URL for the user to upgrade, or None if not applicable.
|
|
"""
|
|
enrollment = CourseEnrollment.get_enrollment(user, course_key)
|
|
verified_mode = enrollment.verified_mode if enrollment else None
|
|
if verified_mode:
|
|
if self.is_enabled(user):
|
|
return self.get_checkout_page_url(verified_mode.sku)
|
|
else:
|
|
return reverse('verify_student_upgrade_and_verify', args=(course_key,))
|
|
return None
|