Added Program Purchase button to the Programs dashboard

Learners can upgrade or enroll as verified in all remaining courses in a program from their programs dashboard

[LEARNER-1899]
This commit is contained in:
Albert St. Aubin
2017-07-28 09:47:33 -04:00
committed by McKenzie Welter
parent 679bd2c6a6
commit de6d48a698
8 changed files with 142 additions and 45 deletions

View File

@@ -846,7 +846,8 @@ class TestProgramMarketingDataExtender(ModuleStoreTestCase):
self.course_price = 100
self.number_of_courses = 2
self.program = ProgramFactory(
courses=[self._create_course(self.course_price) for __ in range(self.number_of_courses)]
courses=[self._create_course(self.course_price) for __ in range(self.number_of_courses)],
applicable_seat_types=['verified']
)
def _create_course(self, course_price):
@@ -940,7 +941,7 @@ class TestProgramMarketingDataExtender(ModuleStoreTestCase):
"""
Learner should be eligible for one click purchase if:
- program is eligible for one click purchase
- learner is not enrolled in any of the course runs associated with the program
- There are courses remaining that have not been purchased and enrolled in.
"""
data = ProgramMarketingDataExtender(self.program, self.user).extend()
self.assertTrue(data['is_learner_eligible_for_one_click_purchase'])
@@ -954,14 +955,17 @@ class TestProgramMarketingDataExtender(ModuleStoreTestCase):
data = ProgramMarketingDataExtender(program, self.user).extend()
self.assertFalse(data['is_learner_eligible_for_one_click_purchase'])
course = self._create_course(self.course_price)
CourseEnrollmentFactory(user=self.user, course_id=course['course_runs'][0]['key'])
course1 = self._create_course(self.course_price)
course2 = self._create_course(self.course_price)
CourseEnrollmentFactory(user=self.user, course_id=course1['course_runs'][0]['key'], mode='verified')
CourseEnrollmentFactory(user=self.user, course_id=course2['course_runs'][0]['key'], mode='audit')
program2 = ProgramFactory(
courses=[course],
is_program_eligible_for_one_click_purchase=True
courses=[course1, course2],
is_program_eligible_for_one_click_purchase=True,
applicable_seat_types=['verified'],
)
data = ProgramMarketingDataExtender(program2, self.user).extend()
self.assertFalse(data['is_learner_eligible_for_one_click_purchase'])
self.assertTrue(data['is_learner_eligible_for_one_click_purchase'])
def test_multiple_published_course_runs(self):
"""
@@ -993,7 +997,8 @@ class TestProgramMarketingDataExtender(ModuleStoreTestCase):
)
])
],
is_program_eligible_for_one_click_purchase=True
is_program_eligible_for_one_click_purchase=True,
applicable_seat_types=['verified']
)
data = ProgramMarketingDataExtender(program, self.user).extend()
@@ -1065,6 +1070,7 @@ class TestProgramMarketingDataExtender(ModuleStoreTestCase):
"""
User shouldn't be able to do a one click purchase of a program if a program has no applicable seat types.
"""
self.program['applicable_seat_types'] = []
data = ProgramMarketingDataExtender(self.program, self.user).extend()
self.assertEqual(len(data['skus']), 0)

View File

@@ -600,10 +600,17 @@ class ProgramMarketingDataExtender(ProgramDataExtender):
skus = []
if is_learner_eligible_for_one_click_purchase:
for course in self.data['courses']:
is_learner_eligible_for_one_click_purchase = not any(
course_run['is_enrolled'] for course_run in course['course_runs']
)
if is_learner_eligible_for_one_click_purchase:
add_course_sku = False
for course_run in course['course_runs']:
(enrollment_mode, active) = CourseEnrollment.enrollment_mode_for_user(
self.user,
CourseKey.from_string(course_run['key'])
)
if enrollment_mode not in applicable_seat_types or not active:
add_course_sku = True
break
if add_course_sku:
published_course_runs = filter(lambda run: run['status'] == 'published', course['course_runs'])
if len(published_course_runs) == 1:
for seat in published_course_runs[0]['seats']:
@@ -615,15 +622,16 @@ class ProgramMarketingDataExtender(ProgramDataExtender):
is_learner_eligible_for_one_click_purchase = False
skus = []
break
else:
skus = []
break
if skus:
try:
User = get_user_model()
service_user = User.objects.get(username=settings.ECOMMERCE_SERVICE_WORKER_USERNAME)
api = ecommerce_api_client(service_user)
api_user = self.user
if not self.user.is_authenticated():
user = get_user_model()
service_user = user.objects.get(username=settings.ECOMMERCE_SERVICE_WORKER_USERNAME)
api_user = service_user
api = ecommerce_api_client(api_user)
# Make an API call to calculate the discounted price
discount_data = api.baskets.calculate.get(sku=skus)
@@ -639,6 +647,8 @@ class ProgramMarketingDataExtender(ProgramDataExtender):
})
except (ConnectionError, SlumberBaseException, Timeout):
log.exception('Failed to get discount price for following product SKUs: %s ', ', '.join(skus))
else:
is_learner_eligible_for_one_click_purchase = False
self.data.update({
'is_learner_eligible_for_one_click_purchase': is_learner_eligible_for_one_click_purchase,