def test_get_module_score_with_randomize(self): """ Test test_get_module_score_with_randomize """ answer_problem(self.course, self.request, self.problem3) answer_problem(self.course, self.request, self.problem4) score = get_module_score(self.request.user, self.course, self.seq2) self.assertEqual(score, 1.0)
def test_get_module_score_with_library_content(self): """ Test test_get_module_score_with_library_content """ answer_problem(self.course, self.request, self.problem5) answer_problem(self.course, self.request, self.problem6) score = get_module_score(self.request.user, self.course, self.seq3) self.assertEqual(score, 1.0)
def test_get_module_score(self): """ Test test_get_module_score """ with self.assertNumQueries(1): score = get_module_score(self.request.user, self.course, self.seq1) self.assertEqual(score, 0) answer_problem(self.course, self.request, self.problem1) answer_problem(self.course, self.request, self.problem2) with self.assertNumQueries(1): score = get_module_score(self.request.user, self.course, self.seq1) self.assertEqual(score, 1.0) answer_problem(self.course, self.request, self.problem1) answer_problem(self.course, self.request, self.problem2, 0) with self.assertNumQueries(1): score = get_module_score(self.request.user, self.course, self.seq1) self.assertEqual(score, .5)
def test_get_module_score_with_empty_score(self): """ Test test_get_module_score_with_empty_score """ set_score(self.request.user.id, self.problem1.location, None, None) # pylint: disable=no-member set_score(self.request.user.id, self.problem2.location, None, None) # pylint: disable=no-member with self.assertNumQueries(1): score = get_module_score(self.request.user, self.course, self.seq1) self.assertEqual(score, 0) answer_problem(self.course, self.request, self.problem1) with self.assertNumQueries(1): score = get_module_score(self.request.user, self.course, self.seq1) self.assertEqual(score, 0.5) answer_problem(self.course, self.request, self.problem2) with self.assertNumQueries(1): score = get_module_score(self.request.user, self.course, self.seq1) self.assertEqual(score, 1.0)
def evaluate_prerequisite(course, prereq_content_key, user_id): """ Finds the parent subsection of the content in the course and evaluates any milestone relationships attached to that subsection. If the calculated grade of the prerequisite subsection meets the minimum score required by dependent subsections, the related milestone will be fulfilled for the user. Arguments: user_id (int): ID of User for which evaluation should occur course (CourseModule): The course prereq_content_key (UsageKey): The prerequisite content usage key Returns: None """ xblock = modulestore().get_item(prereq_content_key) sequential = _get_xblock_parent(xblock, 'sequential') if sequential: prereq_milestone = gating_api.get_gating_milestone( course.id, sequential.location.for_branch(None), 'fulfills') if prereq_milestone: gated_content_milestones = defaultdict(list) for milestone in gating_api.find_gating_milestones( course.id, None, 'requires'): gated_content_milestones[milestone['id']].append(milestone) gated_content = gated_content_milestones.get( prereq_milestone['id']) if gated_content: from courseware.grades import get_module_score user = User.objects.get(id=user_id) score = get_module_score(user, course, sequential) * 100 for milestone in gated_content: # Default minimum score to 100 min_score = 100 requirements = milestone.get('requirements') if requirements: try: min_score = int(requirements.get('min_score')) except (ValueError, TypeError): log.warning( 'Failed to find minimum score for gating milestone %s, defaulting to 100', json.dumps(milestone)) if score >= min_score: milestones_api.add_user_milestone({'id': user_id}, prereq_milestone) else: milestones_api.remove_user_milestone({'id': user_id}, prereq_milestone)
def evaluate_prerequisite(course, prereq_content_key, user_id): """ Finds the parent subsection of the content in the course and evaluates any milestone relationships attached to that subsection. If the calculated grade of the prerequisite subsection meets the minimum score required by dependent subsections, the related milestone will be fulfilled for the user. Arguments: user_id (int): ID of User for which evaluation should occur course (CourseModule): The course prereq_content_key (UsageKey): The prerequisite content usage key Returns: None """ xblock = modulestore().get_item(prereq_content_key) sequential = _get_xblock_parent(xblock, 'sequential') if sequential: prereq_milestone = gating_api.get_gating_milestone( course.id, sequential.location.for_branch(None), 'fulfills' ) if prereq_milestone: gated_content_milestones = defaultdict(list) for milestone in gating_api.find_gating_milestones(course.id, None, 'requires'): gated_content_milestones[milestone['id']].append(milestone) gated_content = gated_content_milestones.get(prereq_milestone['id']) if gated_content: from courseware.grades import get_module_score user = User.objects.get(id=user_id) score = get_module_score(user, course, sequential) * 100 for milestone in gated_content: # Default minimum score to 100 min_score = 100 requirements = milestone.get('requirements') if requirements: try: min_score = int(requirements.get('min_score')) except (ValueError, TypeError): log.warning( 'Failed to find minimum score for gating milestone %s, defaulting to 100', json.dumps(milestone) ) if score >= min_score: milestones_api.add_user_milestone({'id': user_id}, prereq_milestone) else: milestones_api.remove_user_milestone({'id': user_id}, prereq_milestone)