def milestones_achieved_by_user(user, namespace): """ It would fetch list of milestones completed by user """ if not settings.FEATURES.get('MILESTONES_APP'): return None return milestones_api.get_user_milestones({'id': user.id}, namespace)
def milestones_achieved_by_user(user, namespace): """ It would fetch list of milestones completed by user """ if not ENABLE_MILESTONES_APP.is_enabled(): return None return milestones_api.get_user_milestones({'id': user.id}, namespace)
def test_get_course_milestones_fulfillment_paths(self): # pylint: disable=too-many-statements """ Unit Test: test_get_course_milestones_fulfillment_paths """ # Create three milestones in order tto cover all logical branches namespace = six.text_type(self.test_course_key) local_milestone_1 = api.add_milestone({ 'display_name': 'Local Milestone 1', 'name': 'local_milestone_1', 'namespace': namespace, 'description': 'Local Milestone 1 Description' }) local_milestone_2 = api.add_milestone({ 'display_name': 'Local Milestone 2', 'name': 'local_milestone_2', 'namespace': namespace, 'description': 'Local Milestone 2 Description' }) local_milestone_3 = api.add_milestone({ 'display_name': 'Local Milestone 3', 'name': 'local_milestone_3', 'namespace': namespace, 'description': 'Local Milestone 3 Description' }) # Specify the milestone requirements api.add_course_milestone( self.test_course_key, self.relationship_types['REQUIRES'], local_milestone_1 ) api.add_course_milestone( self.test_course_key, self.relationship_types['REQUIRES'], local_milestone_2 ) api.add_course_milestone( self.test_course_key, self.relationship_types['REQUIRES'], local_milestone_3 ) # Specify the milestone fulfillments (via course and content) api.add_course_milestone( self.test_prerequisite_course_key, self.relationship_types['FULFILLS'], local_milestone_1 ) api.add_course_milestone( self.test_prerequisite_course_key, self.relationship_types['FULFILLS'], local_milestone_2 ) api.add_course_content_milestone( self.test_course_key, UsageKey.from_string('i4x://the/content/key/123456789'), self.relationship_types['FULFILLS'], local_milestone_2 ) api.add_course_content_milestone( self.test_course_key, UsageKey.from_string('i4x://the/content/key/123456789'), self.relationship_types['FULFILLS'], local_milestone_3 ) api.add_course_content_milestone( self.test_course_key, UsageKey.from_string('i4x://the/content/key/987654321'), self.relationship_types['FULFILLS'], local_milestone_3 ) # Confirm the starting state for this test (user has no milestones, course requires three) self.assertEqual( len(api.get_user_milestones(self.serialized_test_user, namespace=namespace)), 0) self.assertEqual( len(api.get_course_required_milestones(self.test_course_key, self.serialized_test_user)), 3 ) # Check the possible fulfillment paths for the milestones for this course with self.assertNumQueries(8): paths = api.get_course_milestones_fulfillment_paths( self.test_course_key, self.serialized_test_user ) # Set up the key values we'll use to access/assert the response milestone_key_1 = '{}.{}'.format(local_milestone_1['namespace'], local_milestone_1['name']) milestone_key_2 = '{}.{}'.format(local_milestone_2['namespace'], local_milestone_2['name']) milestone_key_3 = '{}.{}'.format(local_milestone_3['namespace'], local_milestone_3['name']) # First round of assertions self.assertEqual(len(paths[milestone_key_1]['courses']), 1) self.assertIsNone(paths[milestone_key_1].get('content')) self.assertEqual(len(paths[milestone_key_2]['courses']), 1) self.assertEqual(len(paths[milestone_key_2]['content']), 1) self.assertIsNone(paths[milestone_key_3].get('courses')) self.assertEqual(len(paths[milestone_key_3]['content']), 2) # Collect the first milestone (two should remain) api.add_user_milestone(self.serialized_test_user, local_milestone_1) self.assertEqual( len(api.get_user_milestones(self.serialized_test_user, namespace=namespace)), 1) self.assertEqual( len(api.get_course_required_milestones(self.test_course_key, self.serialized_test_user)), 2 ) # Check the remaining fulfillment paths for the milestones for this course with self.assertNumQueries(6): paths = api.get_course_milestones_fulfillment_paths( self.test_course_key, self.serialized_test_user ) self.assertIsNone(paths.get(milestone_key_1)) self.assertEqual(len(paths[milestone_key_2]['courses']), 1) self.assertEqual(len(paths[milestone_key_2]['content']), 1) self.assertIsNone(paths[milestone_key_3].get('courses')) self.assertEqual(len(paths[milestone_key_3]['content']), 2) # Collect the second milestone (one should remain) api.add_user_milestone(self.serialized_test_user, local_milestone_2) self.assertEqual( len(api.get_user_milestones(self.serialized_test_user, namespace=namespace)), 2) self.assertEqual( len(api.get_course_required_milestones(self.test_course_key, self.serialized_test_user)), 1 ) # Check the remaining fulfillment paths for the milestones for this course with self.assertNumQueries(4): paths = api.get_course_milestones_fulfillment_paths( self.test_course_key, self.serialized_test_user ) self.assertIsNone(paths.get(milestone_key_1)) self.assertIsNone(paths.get(milestone_key_2)) self.assertIsNone(paths[milestone_key_3].get('courses')) self.assertEqual(len(paths[milestone_key_3]['content']), 2) # Collect the third milestone api.add_user_milestone(self.serialized_test_user, local_milestone_3) self.assertEqual( len(api.get_user_milestones(self.serialized_test_user, namespace=namespace)), 3) self.assertEqual( len(api.get_course_required_milestones(self.test_course_key, self.serialized_test_user)), 0 ) # Check the remaining fulfillment paths for the milestones for this course with self.assertNumQueries(2): paths = api.get_course_milestones_fulfillment_paths( self.test_course_key, self.serialized_test_user ) self.assertIsNone(paths.get(milestone_key_1)) self.assertIsNone(paths.get(milestone_key_2)) self.assertIsNone(paths.get(milestone_key_3))
def test_get_course_unfulfilled_milestones(self): """ Unit Test: test_get_course_unfulfilled_milestones """ namespace = 'test_get_milestones' milestone1 = api.add_milestone({ 'name': 'localmilestone1', 'display_name': 'Local Milestone 1', 'namespace': namespace, 'description': 'Local Milestone 1 Description' }) api.add_course_milestone( self.test_course_key, self.relationship_types['REQUIRES'], milestone1 ) milestone2 = api.add_milestone({ 'name': 'localmilestone2', 'display_name': 'Local Milestone 2', 'namespace': namespace, 'description': 'Local Milestone 2 Description' }) api.add_course_milestone( self.test_course_key, self.relationship_types['REQUIRES'], milestone2 ) # Confirm that the course has only two milestones, and that the User still needs to collect both course_milestones = api.get_course_milestones(self.test_course_key) self.assertEqual(len(course_milestones), 2) with self.assertNumQueries(2): required_milestones = api.get_course_required_milestones( self.test_course_key, self.serialized_test_user ) # Link the User to Milestone 2 (this one is now 'collected') api.add_user_milestone(self.serialized_test_user, milestone2) user_milestones = api.get_user_milestones(self.serialized_test_user, namespace=namespace) self.assertEqual(len(user_milestones), 1) self.assertEqual(user_milestones[0]['id'], milestone2['id']) # Only Milestone 1 should be listed as 'required' for the course at this point with self.assertNumQueries(2): required_milestones = api.get_course_required_milestones( self.test_course_key, self.serialized_test_user ) self.assertEqual(len(required_milestones), 1) self.assertEqual(required_milestones[0]['id'], milestone1['id']) # Link the User to Milestone 1 (this one is now 'collected', as well) api.add_user_milestone(self.serialized_test_user, milestone1) user_milestones = api.get_user_milestones(self.serialized_test_user, namespace=namespace) self.assertEqual(len(user_milestones), 2) # And there should be no more Milestones required for this User+Course with self.assertNumQueries(2): required_milestones = api.get_course_required_milestones( self.test_course_key, self.serialized_test_user ) self.assertEqual(len(required_milestones), 0)
def test_get_course_milestones_fulfillment_paths(self): # pylint: disable=too-many-statements """ Unit Test: test_get_course_milestones_fulfillment_paths """ # Create three milestones in order tto cover all logical branches namespace = unicode(self.test_course_key) local_milestone_1 = api.add_milestone({ 'display_name': 'Local Milestone 1', 'name': 'local_milestone_1', 'namespace': namespace, 'description': 'Local Milestone 1 Description' }) local_milestone_2 = api.add_milestone({ 'display_name': 'Local Milestone 2', 'name': 'local_milestone_2', 'namespace': namespace, 'description': 'Local Milestone 2 Description' }) local_milestone_3 = api.add_milestone({ 'display_name': 'Local Milestone 3', 'name': 'local_milestone_3', 'namespace': namespace, 'description': 'Local Milestone 3 Description' }) # Specify the milestone requirements api.add_course_milestone(self.test_course_key, self.relationship_types['REQUIRES'], local_milestone_1) api.add_course_milestone(self.test_course_key, self.relationship_types['REQUIRES'], local_milestone_2) api.add_course_milestone(self.test_course_key, self.relationship_types['REQUIRES'], local_milestone_3) # Specify the milestone fulfillments (via course and content) api.add_course_milestone(self.test_prerequisite_course_key, self.relationship_types['FULFILLS'], local_milestone_1) api.add_course_milestone(self.test_prerequisite_course_key, self.relationship_types['FULFILLS'], local_milestone_2) api.add_course_content_milestone( self.test_course_key, UsageKey.from_string('i4x://the/content/key/123456789'), self.relationship_types['FULFILLS'], local_milestone_2) api.add_course_content_milestone( self.test_course_key, UsageKey.from_string('i4x://the/content/key/123456789'), self.relationship_types['FULFILLS'], local_milestone_3) api.add_course_content_milestone( self.test_course_key, UsageKey.from_string('i4x://the/content/key/987654321'), self.relationship_types['FULFILLS'], local_milestone_3) # Confirm the starting state for this test (user has no milestones, course requires three) self.assertEqual( len( api.get_user_milestones(self.serialized_test_user, namespace=namespace)), 0) self.assertEqual( len( api.get_course_required_milestones(self.test_course_key, self.serialized_test_user)), 3) # Check the possible fulfillment paths for the milestones for this course with self.assertNumQueries(8): paths = api.get_course_milestones_fulfillment_paths( self.test_course_key, self.serialized_test_user) # Set up the key values we'll use to access/assert the response milestone_key_1 = '{}.{}'.format(local_milestone_1['namespace'], local_milestone_1['name']) milestone_key_2 = '{}.{}'.format(local_milestone_2['namespace'], local_milestone_2['name']) milestone_key_3 = '{}.{}'.format(local_milestone_3['namespace'], local_milestone_3['name']) # First round of assertions self.assertEqual(len(paths[milestone_key_1]['courses']), 1) self.assertIsNone(paths[milestone_key_1].get('content')) self.assertEqual(len(paths[milestone_key_2]['courses']), 1) self.assertEqual(len(paths[milestone_key_2]['content']), 1) self.assertIsNone(paths[milestone_key_3].get('courses')) self.assertEqual(len(paths[milestone_key_3]['content']), 2) # Collect the first milestone (two should remain) api.add_user_milestone(self.serialized_test_user, local_milestone_1) self.assertEqual( len( api.get_user_milestones(self.serialized_test_user, namespace=namespace)), 1) self.assertEqual( len( api.get_course_required_milestones(self.test_course_key, self.serialized_test_user)), 2) # Check the remaining fulfillment paths for the milestones for this course with self.assertNumQueries(6): paths = api.get_course_milestones_fulfillment_paths( self.test_course_key, self.serialized_test_user) self.assertIsNone(paths.get(milestone_key_1)) self.assertEqual(len(paths[milestone_key_2]['courses']), 1) self.assertEqual(len(paths[milestone_key_2]['content']), 1) self.assertIsNone(paths[milestone_key_3].get('courses')) self.assertEqual(len(paths[milestone_key_3]['content']), 2) # Collect the second milestone (one should remain) api.add_user_milestone(self.serialized_test_user, local_milestone_2) self.assertEqual( len( api.get_user_milestones(self.serialized_test_user, namespace=namespace)), 2) self.assertEqual( len( api.get_course_required_milestones(self.test_course_key, self.serialized_test_user)), 1) # Check the remaining fulfillment paths for the milestones for this course with self.assertNumQueries(4): paths = api.get_course_milestones_fulfillment_paths( self.test_course_key, self.serialized_test_user) self.assertIsNone(paths.get(milestone_key_1)) self.assertIsNone(paths.get(milestone_key_2)) self.assertIsNone(paths[milestone_key_3].get('courses')) self.assertEqual(len(paths[milestone_key_3]['content']), 2) # Collect the third milestone api.add_user_milestone(self.serialized_test_user, local_milestone_3) self.assertEqual( len( api.get_user_milestones(self.serialized_test_user, namespace=namespace)), 3) self.assertEqual( len( api.get_course_required_milestones(self.test_course_key, self.serialized_test_user)), 0) # Check the remaining fulfillment paths for the milestones for this course with self.assertNumQueries(2): paths = api.get_course_milestones_fulfillment_paths( self.test_course_key, self.serialized_test_user) self.assertIsNone(paths.get(milestone_key_1)) self.assertIsNone(paths.get(milestone_key_2)) self.assertIsNone(paths.get(milestone_key_3))
def test_get_course_unfulfilled_milestones(self): """ Unit Test: test_get_course_unfulfilled_milestones """ namespace = 'test_get_milestones' milestone1 = api.add_milestone({ 'name': 'localmilestone1', 'display_name': 'Local Milestone 1', 'namespace': namespace, 'description': 'Local Milestone 1 Description' }) api.add_course_milestone(self.test_course_key, self.relationship_types['REQUIRES'], milestone1) milestone2 = api.add_milestone({ 'name': 'localmilestone2', 'display_name': 'Local Milestone 2', 'namespace': namespace, 'description': 'Local Milestone 2 Description' }) api.add_course_milestone(self.test_course_key, self.relationship_types['REQUIRES'], milestone2) # Confirm that the course has only two milestones, and that the User still needs to collect both course_milestones = api.get_course_milestones(self.test_course_key) self.assertEqual(len(course_milestones), 2) with self.assertNumQueries(2): required_milestones = api.get_course_required_milestones( self.test_course_key, self.serialized_test_user) # Link the User to Milestone 2 (this one is now 'collected') api.add_user_milestone(self.serialized_test_user, milestone2) user_milestones = api.get_user_milestones(self.serialized_test_user, namespace=namespace) self.assertEqual(len(user_milestones), 1) self.assertEqual(user_milestones[0]['id'], milestone2['id']) # Only Milestone 1 should be listed as 'required' for the course at this point with self.assertNumQueries(2): required_milestones = api.get_course_required_milestones( self.test_course_key, self.serialized_test_user) self.assertEqual(len(required_milestones), 1) self.assertEqual(required_milestones[0]['id'], milestone1['id']) # Link the User to Milestone 1 (this one is now 'collected', as well) api.add_user_milestone(self.serialized_test_user, milestone1) user_milestones = api.get_user_milestones(self.serialized_test_user, namespace=namespace) self.assertEqual(len(user_milestones), 2) # And there should be no more Milestones required for this User+Course with self.assertNumQueries(2): required_milestones = api.get_course_required_milestones( self.test_course_key, self.serialized_test_user) self.assertEqual(len(required_milestones), 0)