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:
committed by
McKenzie Welter
parent
679bd2c6a6
commit
de6d48a698
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user