Commit 53d53996 by Clinton Blackburn

Merge pull request #226 from edx/enrollment-fulfillment-fix

Fixed Fulfillment of No-ID Professional Enrollments
parents 35e5ea8a 4781467c
......@@ -4,16 +4,12 @@ import logging
from django.conf import settings
import requests
from ecommerce.courses.utils import mode_for_seat
logger = logging.getLogger(__name__)
class LMSPublisher(object):
# TODO Test this and update SKU generation
def mode_for_seat(self, seat):
if seat.attr.certificate_type == 'professional' and not seat.attr.id_verification_required:
return 'no-id-professional'
return seat.attr.certificate_type
def get_seat_expiration(self, seat):
if not seat.expires or 'professional' in seat.attr.certificate_type:
return None
......@@ -24,7 +20,7 @@ class LMSPublisher(object):
""" Serializes a course seat product to a dict that can be further serialized to JSON. """
stock_record = seat.stockrecords.first()
return {
'name': self.mode_for_seat(seat),
'name': mode_for_seat(seat),
'currency': stock_record.price_currency,
'price': int(stock_record.price_excl_tax),
'sku': stock_record.partner_sku,
......
import ddt
from django.test import TestCase
from ecommerce.courses.models import Course
from ecommerce.courses.utils import mode_for_seat
from ecommerce.extensions.catalogue.tests.mixins import CourseCatalogTestMixin
@ddt.ddt
class UtilsTests(CourseCatalogTestMixin, TestCase):
@ddt.unpack
@ddt.data(
('honor', True, 'honor'),
('honor', False, 'honor'),
('verified', True, 'verified'),
('verified', False, 'verified'),
('professional', True, 'professional'),
('professional', False, 'no-id-professional'),
('no-id-professional', False, 'no-id-professional'),
)
def test_mode_for_seat(self, certificate_type, id_verification_required, mode):
""" Verify the correct enrollment mode is returned for a given seat. """
course = Course.objects.create(id='edx/Demo_Course/DemoX')
seat = course.create_or_update_seat(certificate_type, id_verification_required, 10.00)
self.assertEqual(mode_for_seat(seat), mode)
def mode_for_seat(seat):
""" Returns the Enrollment mode for a given seat product. """
certificate_type = seat.attr.certificate_type
if certificate_type == 'professional' and not seat.attr.id_verification_required:
return 'no-id-professional'
return certificate_type
......@@ -11,6 +11,7 @@ from django.conf import settings
from rest_framework import status
import requests
from requests.exceptions import ConnectionError, Timeout
from ecommerce.courses.utils import mode_for_seat
from ecommerce.extensions.analytics.utils import audit_log
from ecommerce.extensions.fulfillment.status import LINE
......@@ -153,7 +154,7 @@ class EnrollmentFulfillmentModule(BaseFulfillmentModule):
for line in lines:
try:
certificate_type = line.product.attr.certificate_type
mode = mode_for_seat(line.product)
course_key = line.product.attr.course_key
except AttributeError:
logger.error("Supported Seat Product does not have required attributes, [certificate_type, course_key]")
......@@ -168,7 +169,7 @@ class EnrollmentFulfillmentModule(BaseFulfillmentModule):
data = {
'user': order.user.username,
'is_active': True,
'mode': certificate_type,
'mode': mode,
'course_details': {
'course_id': course_key
},
......@@ -194,7 +195,7 @@ class EnrollmentFulfillmentModule(BaseFulfillmentModule):
order_number=order.number,
product_class=line.product.get_product_class().name,
course_id=course_key,
certificate_type=certificate_type,
mode=mode,
user_id=order.user.id,
credit_provider=provider,
)
......
......@@ -14,6 +14,7 @@ from requests.exceptions import ConnectionError, Timeout
from testfixtures import LogCapture
from ecommerce.courses.models import Course
from ecommerce.courses.utils import mode_for_seat
from ecommerce.extensions.catalogue.tests.mixins import CourseCatalogTestMixin
from ecommerce.extensions.fulfillment.modules import EnrollmentFulfillmentModule
from ecommerce.extensions.fulfillment.status import LINE
......@@ -66,11 +67,11 @@ class EnrollmentFulfillmentModuleTests(EnrollmentFulfillmentTestMixin, TestCase)
(
LOGGER_NAME,
'INFO',
'line_fulfilled: certificate_type="{}", course_id="{}", credit_provider="{}", order_line_id="{}", '
'line_fulfilled: course_id="{}", credit_provider="{}", mode="{}", order_line_id="{}", '
'order_number="{}", product_class="{}", user_id="{}"'.format(
line.product.attr.certificate_type,
line.product.attr.course_key,
None,
mode_for_seat(line.product),
line.id,
line.order.number,
line.product.get_product_class().name,
......@@ -240,11 +241,11 @@ class EnrollmentFulfillmentCreditSeatModuleTests(EnrollmentFulfillmentTestMixin,
(
LOGGER_NAME,
'INFO',
'line_fulfilled: certificate_type="{}", course_id="{}", credit_provider="{}", order_line_id="{}", '
'line_fulfilled: course_id="{}", credit_provider="{}", mode="{}", order_line_id="{}", '
'order_number="{}", product_class="{}", user_id="{}"'.format(
line.product.attr.certificate_type,
line.product.attr.course_key,
line.product.attr.credit_provider,
mode_for_seat(line.product),
line.id,
line.order.number,
line.product.get_product_class().name,
......
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