Commit 3d37635f by Marko Jevtic

[LEARNER-314] Determine client/learner eligibility

parent 7e368e10
...@@ -82,15 +82,16 @@ class SeatFactory(DictFactoryBase): ...@@ -82,15 +82,16 @@ class SeatFactory(DictFactoryBase):
class CourseRunFactory(DictFactoryBase): class CourseRunFactory(DictFactoryBase):
eligible_for_financial_aid = True
end = factory.LazyFunction(generate_zulu_datetime) end = factory.LazyFunction(generate_zulu_datetime)
enrollment_end = factory.LazyFunction(generate_zulu_datetime) enrollment_end = factory.LazyFunction(generate_zulu_datetime)
enrollment_start = factory.LazyFunction(generate_zulu_datetime) enrollment_start = factory.LazyFunction(generate_zulu_datetime)
image = ImageFactory() image = ImageFactory()
is_enrolled = False
key = factory.LazyFunction(generate_course_run_key) key = factory.LazyFunction(generate_course_run_key)
marketing_url = factory.Faker('url') marketing_url = factory.Faker('url')
eligible_for_financial_aid = True
seats = factory.LazyFunction(partial(generate_instances, SeatFactory))
pacing_type = 'self_paced' pacing_type = 'self_paced'
seats = factory.LazyFunction(partial(generate_instances, SeatFactory))
short_description = factory.Faker('sentence') short_description = factory.Faker('sentence')
start = factory.LazyFunction(generate_zulu_datetime) start = factory.LazyFunction(generate_zulu_datetime)
title = factory.Faker('catch_phrase') title = factory.Faker('catch_phrase')
...@@ -112,6 +113,7 @@ class ProgramFactory(DictFactoryBase): ...@@ -112,6 +113,7 @@ class ProgramFactory(DictFactoryBase):
banner_image = factory.LazyFunction(generate_sized_stdimage) banner_image = factory.LazyFunction(generate_sized_stdimage)
card_image_url = factory.Faker('image_url') card_image_url = factory.Faker('image_url')
courses = factory.LazyFunction(partial(generate_instances, CourseFactory)) courses = factory.LazyFunction(partial(generate_instances, CourseFactory))
is_program_eligible_for_one_click_purchase = True
marketing_slug = factory.Faker('slug') marketing_slug = factory.Faker('slug')
marketing_url = factory.Faker('url') marketing_url = factory.Faker('url')
status = 'active' status = 'active'
......
...@@ -766,7 +766,7 @@ class TestProgramMarketingDataExtender(ModuleStoreTestCase): ...@@ -766,7 +766,7 @@ class TestProgramMarketingDataExtender(ModuleStoreTestCase):
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)]
) )
def _create_course(self, course_price): def _create_course(self, course_price, is_enrolled=False):
""" """
Creates the course in mongo and update it with the instructor data. Creates the course in mongo and update it with the instructor data.
Also creates catalog course with respect to course run. Also creates catalog course with respect to course run.
...@@ -781,6 +781,7 @@ class TestProgramMarketingDataExtender(ModuleStoreTestCase): ...@@ -781,6 +781,7 @@ class TestProgramMarketingDataExtender(ModuleStoreTestCase):
course = self.update_course(course, self.user.id) course = self.update_course(course, self.user.id)
course_run = CourseRunFactory( course_run = CourseRunFactory(
is_enrolled=is_enrolled,
key=unicode(course.id), key=unicode(course.id),
seats=[SeatFactory(price=course_price)] seats=[SeatFactory(price=course_price)]
) )
...@@ -811,3 +812,29 @@ class TestProgramMarketingDataExtender(ModuleStoreTestCase): ...@@ -811,3 +812,29 @@ class TestProgramMarketingDataExtender(ModuleStoreTestCase):
data = ProgramMarketingDataExtender(self.program, self.user).extend() data = ProgramMarketingDataExtender(self.program, self.user).extend()
self.assertEqual(data['courses'][0]['course_runs'][0]['can_enroll'], can_enroll) self.assertEqual(data['courses'][0]['course_runs'][0]['can_enroll'], can_enroll)
def test_learner_eligibility_for_one_click_purchase(self):
"""
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
"""
data = ProgramMarketingDataExtender(self.program, self.user).extend()
self.assertTrue(data['is_learner_eligible_for_one_click_purchase'])
courses = [self._create_course(self.course_price)]
program = ProgramFactory(
courses=courses,
is_program_eligible_for_one_click_purchase=False
)
data = ProgramMarketingDataExtender(program, self.user).extend()
self.assertFalse(data['is_learner_eligible_for_one_click_purchase'])
courses.append(self._create_course(self.course_price, is_enrolled=True))
program2 = ProgramFactory(
courses=courses,
is_program_eligible_for_one_click_purchase=True
)
data = ProgramMarketingDataExtender(program2, self.user).extend()
self.assertFalse(data['is_learner_eligible_for_one_click_purchase'])
...@@ -504,19 +504,27 @@ class ProgramMarketingDataExtender(ProgramDataExtender): ...@@ -504,19 +504,27 @@ class ProgramMarketingDataExtender(ProgramDataExtender):
uuid=self.data['uuid'] uuid=self.data['uuid']
) )
program_instructors = cache.get(cache_key) program_instructors = cache.get(cache_key)
is_learner_eligible_for_one_click_purchase = self.data['is_program_eligible_for_one_click_purchase']
for course in self.data['courses']: for course in self.data['courses']:
self._execute('_collect_course', course) self._execute('_collect_course', course)
if not program_instructors: if not program_instructors:
for course_run in course['course_runs']: for course_run in course['course_runs']:
self._execute('_collect_instructors', course_run) self._execute('_collect_instructors', course_run)
if is_learner_eligible_for_one_click_purchase:
is_learner_eligible_for_one_click_purchase = not any(
course_run['is_enrolled'] for course_run in course['course_runs']
)
if not program_instructors: if not program_instructors:
# We cache the program instructors list to avoid repeated modulestore queries # We cache the program instructors list to avoid repeated modulestore queries
program_instructors = self.instructors.values() program_instructors = self.instructors.values()
cache.set(cache_key, program_instructors, 3600) cache.set(cache_key, program_instructors, 3600)
self.data['instructors'] = program_instructors self.data.update({
'instructors': program_instructors,
'is_learner_eligible_for_one_click_purchase': is_learner_eligible_for_one_click_purchase,
})
@classmethod @classmethod
def _handlers(cls, prefix): def _handlers(cls, prefix):
......
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