def test_enrollments_sorted_most_recent(self): """ Test that the list of newly created courses are properly sorted to show the most recent enrollments first. """ self._configure_message_timeout(600) # Create a number of new enrollments and courses, and force their creation behind # the first enrollment courses = [] for idx, seconds_past in zip(range(2, 6), [5, 10, 15, 20]): course_location = locator.CourseLocator( 'Org{num}'.format(num=idx), 'Course{num}'.format(num=idx), 'Run{num}'.format(num=idx) ) course, enrollment = self._create_course_and_enrollment(course_location) enrollment.created = datetime.datetime.now(UTC) - datetime.timedelta(seconds=seconds_past) enrollment.save() courses.append(course) courses_list = list(get_course_enrollment_pairs(self.student, None, [])) self.assertEqual(len(courses_list), 6) recent_course_list = _get_recently_enrolled_courses(courses_list) self.assertEqual(len(recent_course_list), 5) self.assertEqual(recent_course_list[1], courses[0]) self.assertEqual(recent_course_list[2], courses[1]) self.assertEqual(recent_course_list[3], courses[2]) self.assertEqual(recent_course_list[4], courses[3])
def test_enrollments_sorted_most_recent(self): """ Test that the list of newly created courses are properly sorted to show the most recent enrollments first. """ self._configure_message_timeout(600) # Create a number of new enrollments and courses, and force their creation behind # the first enrollment courses = [] for idx, seconds_past in zip(range(2, 6), [5, 10, 15, 20]): course_location = locator.CourseLocator( 'Org{num}'.format(num=idx), 'Course{num}'.format(num=idx), 'Run{num}'.format(num=idx)) course, enrollment = self._create_course_and_enrollment( course_location) enrollment.created = datetime.datetime.now( UTC) - datetime.timedelta(seconds=seconds_past) enrollment.save() courses.append(course) courses_list = list(get_course_enrollment_pairs( self.student, None, [])) self.assertEqual(len(courses_list), 6) recent_course_list = _get_recently_enrolled_courses(courses_list) self.assertEqual(len(recent_course_list), 5) self.assertEqual(recent_course_list[1], courses[0]) self.assertEqual(recent_course_list[2], courses[1]) self.assertEqual(recent_course_list[3], courses[2]) self.assertEqual(recent_course_list[4], courses[3])
def test_course_listing_errored_deleted_courses(self): """ Create good courses, courses that won't load, and deleted courses which still have roles. Test course listing. """ mongo_store = modulestore()._get_modulestore_by_type(ModuleStoreEnum.Type.mongo) good_location = SlashSeparatedCourseKey('testOrg', 'testCourse', 'RunBabyRun') self._create_course_with_access_groups(good_location) course_location = SlashSeparatedCourseKey('testOrg', 'doomedCourse', 'RunBabyRun') self._create_course_with_access_groups(course_location) mongo_store.delete_course(course_location, ModuleStoreEnum.UserID.test) course_location = SlashSeparatedCourseKey('testOrg', 'erroredCourse', 'RunBabyRun') course = self._create_course_with_access_groups(course_location) course_db_record = mongo_store._find_one(course.location) course_db_record.setdefault('metadata', {}).get('tabs', []).append({ "type": "wiko", "name": "Wiki", }) mongo_store.collection.update( {'_id': course.location.to_deprecated_son()}, {'$set': { 'metadata.tabs': course_db_record['metadata']['tabs'], }}, ) courses_list = list(get_course_enrollment_pairs(self.student, None, [])) self.assertEqual(len(courses_list), 1, courses_list) self.assertEqual(courses_list[0][0].id, good_location)
def test_course_listing_errored_deleted_courses(self): """ Create good courses, courses that won't load, and deleted courses which still have roles. Test course listing. """ mongo_store = modulestore()._get_modulestore_by_type(ModuleStoreEnum.Type.mongo) good_location = mongo_store.make_course_key('testOrg', 'testCourse', 'RunBabyRun') self._create_course_with_access_groups(good_location, default_store=ModuleStoreEnum.Type.mongo) course_location = mongo_store.make_course_key('testOrg', 'doomedCourse', 'RunBabyRun') self._create_course_with_access_groups(course_location, default_store=ModuleStoreEnum.Type.mongo) mongo_store.delete_course(course_location, ModuleStoreEnum.UserID.test) course_location = mongo_store.make_course_key('testOrg', 'erroredCourse', 'RunBabyRun') course = self._create_course_with_access_groups(course_location, default_store=ModuleStoreEnum.Type.mongo) course_db_record = mongo_store._find_one(course.location) course_db_record.setdefault('metadata', {}).get('tabs', []).append({ "type": "wiko", "name": "Wiki", }) mongo_store.collection.update( {'_id': course.location.to_deprecated_son()}, {'$set': { 'metadata.tabs': course_db_record['metadata']['tabs'], }}, ) courses_list = list(get_course_enrollment_pairs(self.student, None, [])) self.assertEqual(len(courses_list), 1, courses_list) self.assertEqual(courses_list[0][0].id, good_location)
def test_course_listing_errored_deleted_courses(self): """ Create good courses, courses that won't load, and deleted courses which still have roles. Test course listing. """ good_location = SlashSeparatedCourseKey('testOrg', 'testCourse', 'RunBabyRun') self._create_course_with_access_groups(good_location) course_location = SlashSeparatedCourseKey('testOrg', 'doomedCourse', 'RunBabyRun') self._create_course_with_access_groups(course_location) modulestore('direct').delete_course(course_location) course_location = SlashSeparatedCourseKey('testOrg', 'erroredCourse', 'RunBabyRun') course = self._create_course_with_access_groups(course_location) course_db_record = modulestore('direct')._find_one(course.location) course_db_record.setdefault('metadata', {}).get('tabs', []).append({"type": "wiko", "name": "Wiki" }) modulestore('direct').collection.update( {'_id': course_db_record['_id']}, {'$set': { 'metadata.tabs': course_db_record['metadata']['tabs'], }}, ) courses_list = list(get_course_enrollment_pairs(self.student, None, [])) self.assertEqual(len(courses_list), 1, courses_list) self.assertEqual(courses_list[0][0].id, good_location)
def test_course_listing_has_pre_requisite_courses(self): """ Creates four courses. Enroll test user in all courses Sets two of them as pre-requisites of another course. Checks course where pre-requisite course is set has appropriate info. """ seed_milestone_relationship_types() course_location2 = self.store.make_course_key('Org1', 'Course2', 'Run2') self._create_course_with_access_groups(course_location2) pre_requisite_course_location = self.store.make_course_key('Org1', 'Course3', 'Run3') self._create_course_with_access_groups(pre_requisite_course_location) pre_requisite_course_location2 = self.store.make_course_key('Org1', 'Course4', 'Run4') self._create_course_with_access_groups(pre_requisite_course_location2) # create a course with pre_requisite_courses pre_requisite_courses = [ unicode(pre_requisite_course_location), unicode(pre_requisite_course_location2), ] course_location = self.store.make_course_key('Org1', 'Course1', 'Run1') self._create_course_with_access_groups(course_location, { 'pre_requisite_courses': pre_requisite_courses }) set_prerequisite_courses(course_location, pre_requisite_courses) # get dashboard course_enrollment_pairs = list(get_course_enrollment_pairs(self.student, None, [])) courses_having_prerequisites = frozenset(course.id for course, _enrollment in course_enrollment_pairs if course.pre_requisite_courses) courses_requirements_not_met = get_pre_requisite_courses_not_completed( self.student, courses_having_prerequisites ) self.assertEqual(len(courses_requirements_not_met[course_location]['courses']), len(pre_requisite_courses))
def test_get_course_list(self): """ Test getting courses """ course_location = self.store.make_course_key('Org1', 'Course1', 'Run1') self._create_course_with_access_groups(course_location) # get dashboard courses_list = list(get_course_enrollment_pairs(self.student, None, [])) self.assertEqual(len(courses_list), 1) self.assertEqual(courses_list[0][0].id, course_location) CourseEnrollment.unenroll(self.student, course_location) # get dashboard courses_list = list(get_course_enrollment_pairs(self.student, None, [])) self.assertEqual(len(courses_list), 0)
def test_get_course_list(self): """ Test getting courses """ course_location = SlashSeparatedCourseKey('Org1', 'Course1', 'Run1') self._create_course_with_access_groups(course_location) # get dashboard courses_list = list(get_course_enrollment_pairs(self.student, None, [])) self.assertEqual(len(courses_list), 1) self.assertEqual(courses_list[0][0].id, course_location) CourseEnrollment.unenroll(self.student, course_location) # get dashboard courses_list = list(get_course_enrollment_pairs(self.student, None, [])) self.assertEqual(len(courses_list), 0)
def test_zero_second_delta(self): """ Tests that the recent enrollment list is empty if configured to zero seconds. """ self._configure_message_timeout(0) courses_list = list(get_course_enrollment_pairs(self.student, None, [])) self.assertEqual(len(courses_list), 2) recent_course_list = _get_recently_enrolled_courses(courses_list) self.assertEqual(len(recent_course_list), 0)
def test_zero_second_delta(self): """ Tests that the recent enrollment list is empty if configured to zero seconds. """ config = DashboardConfiguration(recent_enrollment_time_delta=0) config.save() courses_list = list(get_course_enrollment_pairs(self.student, None, [])) self.assertEqual(len(courses_list), 2) recent_course_list = _get_recently_enrolled_courses(courses_list) self.assertEqual(len(recent_course_list), 0)
def test_zero_second_delta(self): """ Tests that the recent enrollment list is empty if configured to zero seconds. """ self._configure_message_timeout(0) courses_list = list(get_course_enrollment_pairs( self.student, None, [])) self.assertEqual(len(courses_list), 2) recent_course_list = _get_recently_enrolled_courses(courses_list) self.assertEqual(len(recent_course_list), 0)
def test_recently_enrolled_courses(self): """ Test if the function for filtering recent enrollments works appropriately. """ self._configure_message_timeout(60) # get courses through iterating all courses courses_list = list(get_course_enrollment_pairs(self.student, None, [])) self.assertEqual(len(courses_list), 2) recent_course_list = _get_recently_enrolled_courses(courses_list) self.assertEqual(len(recent_course_list), 1)
def test_zero_second_delta(self): """ Tests that the recent enrollment list is empty if configured to zero seconds. """ config = DashboardConfiguration(recent_enrollment_time_delta=0) config.save() courses_list = list(get_course_enrollment_pairs( self.student, None, [])) self.assertEqual(len(courses_list), 2) recent_course_list = _get_recently_enrolled_courses(courses_list) self.assertEqual(len(recent_course_list), 0)
def test_recently_enrolled_courses(self): """ Test if the function for filtering recent enrollments works appropriately. """ config = DashboardConfiguration(recent_enrollment_time_delta=60) config.save() # get courses through iterating all courses courses_list = list(get_course_enrollment_pairs(self.student, None, [])) self.assertEqual(len(courses_list), 2) recent_course_list = _get_recently_enrolled_courses(courses_list) self.assertEqual(len(recent_course_list), 1)
def test_recently_enrolled_courses(self): """ Test if the function for filtering recent enrollments works appropriately. """ config = DashboardConfiguration(recent_enrollment_time_delta=60) config.save() # get courses through iterating all courses courses_list = list(get_course_enrollment_pairs( self.student, None, [])) self.assertEqual(len(courses_list), 2) recent_course_list = _get_recently_enrolled_courses(courses_list) self.assertEqual(len(recent_course_list), 1)
def test_recently_enrolled_courses(self): """ Test if the function for filtering recent enrollments works appropriately. """ self._configure_message_timeout(60) # get courses through iterating all courses courses_list = list(get_course_enrollment_pairs( self.student, None, [])) self.assertEqual(len(courses_list), 2) recent_course_list = _get_recently_enrolled_courses(courses_list) self.assertEqual(len(recent_course_list), 1)
def test_errored_course_regular_access(self): """ Test the course list for regular staff when get_course returns an ErrorDescriptor """ course_key = SlashSeparatedCourseKey('Org1', 'Course1', 'Run1') self._create_course_with_access_groups(course_key) with patch('xmodule.modulestore.mongo.base.MongoKeyValueStore', Mock(side_effect=Exception)): self.assertIsInstance(modulestore().get_course(course_key), ErrorDescriptor) # get courses through iterating all courses courses_list = list(get_course_enrollment_pairs(self.student, None, [])) self.assertEqual(courses_list, [])
def test_errored_course_regular_access(self): """ Test the course list for regular staff when get_course returns an ErrorDescriptor """ # pylint: disable=protected-access mongo_store = modulestore()._get_modulestore_by_type(ModuleStoreEnum.Type.mongo) course_key = mongo_store.make_course_key('Org1', 'Course1', 'Run1') self._create_course_with_access_groups(course_key, default_store=ModuleStoreEnum.Type.mongo) with patch('xmodule.modulestore.mongo.base.MongoKeyValueStore', Mock(side_effect=Exception)): self.assertIsInstance(modulestore().get_course(course_key), ErrorDescriptor) # get courses through iterating all courses courses_list = list(get_course_enrollment_pairs(self.student, None, [])) self.assertEqual(courses_list, [])
def test_course_listing_errored_deleted_courses(self): """ Create good courses, courses that won't load, and deleted courses which still have roles. Test course listing. """ mongo_store = modulestore()._get_modulestore_by_type(ModuleStoreEnum.Type.mongo) good_location = mongo_store.make_course_key('testOrg', 'testCourse', 'RunBabyRun') self._create_course_with_access_groups(good_location, default_store=ModuleStoreEnum.Type.mongo) course_location = mongo_store.make_course_key('testOrg', 'doomedCourse', 'RunBabyRun') self._create_course_with_access_groups(course_location, default_store=ModuleStoreEnum.Type.mongo) mongo_store.delete_course(course_location, ModuleStoreEnum.UserID.test) courses_list = list(get_course_enrollment_pairs(self.student, None, [])) self.assertEqual(len(courses_list), 1, courses_list) self.assertEqual(courses_list[0][0].id, good_location)
def test_enrollments_sorted_most_recent(self): """ Test that the list of newly created courses are properly sorted to show the most recent enrollments first. """ config = DashboardConfiguration(recent_enrollment_time_delta=600) config.save() # Create a number of new enrollments and courses, and force their creation behind # the first enrollment course_location = locator.CourseLocator('Org2', 'Course2', 'Run2') _, enrollment2 = self._create_course_and_enrollment(course_location) enrollment2.created = datetime.datetime.now(UTC) - datetime.timedelta( seconds=5) enrollment2.save() course_location = locator.CourseLocator('Org3', 'Course3', 'Run3') _, enrollment3 = self._create_course_and_enrollment(course_location) enrollment3.created = datetime.datetime.now(UTC) - datetime.timedelta( seconds=10) enrollment3.save() course_location = locator.CourseLocator('Org4', 'Course4', 'Run4') _, enrollment4 = self._create_course_and_enrollment(course_location) enrollment4.created = datetime.datetime.now(UTC) - datetime.timedelta( seconds=15) enrollment4.save() course_location = locator.CourseLocator('Org5', 'Course5', 'Run5') _, enrollment5 = self._create_course_and_enrollment(course_location) enrollment5.created = datetime.datetime.now(UTC) - datetime.timedelta( seconds=20) enrollment5.save() courses_list = list(get_course_enrollment_pairs( self.student, None, [])) self.assertEqual(len(courses_list), 6) recent_course_list = _get_recently_enrolled_courses(courses_list) self.assertEqual(len(recent_course_list), 5) self.assertEqual(recent_course_list[1][1], enrollment2) self.assertEqual(recent_course_list[2][1], enrollment3) self.assertEqual(recent_course_list[3][1], enrollment4) self.assertEqual(recent_course_list[4][1], enrollment5)
def test_enrollments_sorted_most_recent(self): """ Test that the list of newly created courses are properly sorted to show the most recent enrollments first. """ config = DashboardConfiguration(recent_enrollment_time_delta=600) config.save() # Create a number of new enrollments and courses, and force their creation behind # the first enrollment course_location = locator.CourseLocator('Org2', 'Course2', 'Run2') _, enrollment2 = self._create_course_and_enrollment(course_location) enrollment2.created = datetime.datetime.now(UTC) - datetime.timedelta(seconds=5) enrollment2.save() course_location = locator.CourseLocator('Org3', 'Course3', 'Run3') _, enrollment3 = self._create_course_and_enrollment(course_location) enrollment3.created = datetime.datetime.now(UTC) - datetime.timedelta(seconds=10) enrollment3.save() course_location = locator.CourseLocator('Org4', 'Course4', 'Run4') _, enrollment4 = self._create_course_and_enrollment(course_location) enrollment4.created = datetime.datetime.now(UTC) - datetime.timedelta(seconds=15) enrollment4.save() course_location = locator.CourseLocator('Org5', 'Course5', 'Run5') _, enrollment5 = self._create_course_and_enrollment(course_location) enrollment5.created = datetime.datetime.now(UTC) - datetime.timedelta(seconds=20) enrollment5.save() courses_list = list(get_course_enrollment_pairs(self.student, None, [])) self.assertEqual(len(courses_list), 6) recent_course_list = _get_recently_enrolled_courses(courses_list) self.assertEqual(len(recent_course_list), 5) self.assertEqual(recent_course_list[1][1], enrollment2) self.assertEqual(recent_course_list[2][1], enrollment3) self.assertEqual(recent_course_list[3][1], enrollment4) self.assertEqual(recent_course_list[4][1], enrollment5)
def get_course_enrollment(request): if not request.user.is_authenticated(): return JsonResponse({ "status": False }) # for microsites, we want to filter and only show enrollments for courses # within the microsites 'ORG' course_org_filter = microsite.get_value('course_org_filter') # Let's filter out any courses in an "org" that has been declared to be # in a Microsite org_filter_out_set = microsite.get_all_orgs() # remove our current Microsite from the "filter out" list, if applicable if course_org_filter: org_filter_out_set.remove(course_org_filter) # Build our (course, enrollment) list for the user, but ignore any courses # that no longer exist (because the course IDs have changed). Still, we don't # delete those enrollments, because it could have been a data push snafu. course_enrollment_pairs = list(get_course_enrollment_pairs(request.user, course_org_filter, org_filter_out_set)) enrollment_list = [] for course, enrollment in course_enrollment_pairs: item = { "course_image_url": course_image_url(course), "course_id": course.id.to_deprecated_string(), "display_organization": get_course_about_section(course, 'university'), "display_number": course.display_number_with_default, "display_name": course.display_name_with_default, "course_start": course.start, "course_end": course.end, "enrollment_start": course.enrollment_start, "enrollment_end": course.enrollment_end, "advertised_start": course.advertised_start, "enrollment_date": enrollment.created, "active": enrollment.is_active, } enrollment_list.append(item) return JsonResponse({ "status": True, "enrollment": enrollment_list })