def add_entrance_exam_milestone(course, entrance_exam): """ Adds the milestone for given `entrance_exam` in `course` Args: course (Course): Course object in which the extrance_exam is located entrance_exam (xblock): the entrance exam to be added as a milestone """ namespace_choices = get_namespace_choices() milestone_relationship_types = get_milestone_relationship_types() milestone_namespace = generate_milestone_namespace( namespace_choices.get('ENTRANCE_EXAM'), course.id ) milestone = add_milestone( { 'name': 'Test Milestone', 'namespace': milestone_namespace, 'description': 'Testing Courseware Entrance Exam Chapter', } ) add_course_milestone( str(course.id), milestone_relationship_types['REQUIRES'], milestone ) add_course_content_milestone( str(course.id), str(entrance_exam.location), milestone_relationship_types['FULFILLS'], milestone )
def add_entrance_exam_milestone(course_id, x_block): # lint-amnesty, pylint: disable=missing-function-docstring # Add an entrance exam milestone if one does not already exist for given xBlock # As this is a standalone method for entrance exam, We should check that given xBlock should be an entrance exam. if x_block.is_entrance_exam: namespace_choices = milestones_helpers.get_namespace_choices() milestone_namespace = milestones_helpers.generate_milestone_namespace( namespace_choices.get('ENTRANCE_EXAM'), course_id ) milestones = milestones_helpers.get_milestones(milestone_namespace) if len(milestones): # lint-amnesty, pylint: disable=len-as-condition milestone = milestones[0] else: description = f'Autogenerated during {str(course_id)} entrance exam creation.' milestone = milestones_helpers.add_milestone({ 'name': _('Completed Course Entrance Exam'), 'namespace': milestone_namespace, 'description': description }) relationship_types = milestones_helpers.get_milestone_relationship_types() milestones_helpers.add_course_milestone( str(course_id), relationship_types['REQUIRES'], milestone ) milestones_helpers.add_course_content_milestone( str(course_id), str(x_block.location), relationship_types['FULFILLS'], milestone )
def setUp(self): """ Test case scaffolding """ super().setUp() self.course = CourseFactory.create() self.instructor_tab = ItemFactory.create( category="instructor", parent_location=self.course.location, data="Instructor Tab", display_name="Instructor") self.extra_tab_2 = ItemFactory.create( category="static_tab", parent_location=self.course.location, data="Extra Tab", display_name="Extra Tab 2") self.extra_tab_3 = ItemFactory.create( category="static_tab", parent_location=self.course.location, data="Extra Tab", display_name="Extra Tab 3") self.setup_user() self.enroll(self.course) self.user.is_staff = True self.relationship_types = get_milestone_relationship_types() self.addCleanup(set_current_request, None)
def evaluate_entrance_exam(course_grade, user): """ Evaluates any entrance exam milestone relationships attached to the given course. If the course_grade meets the minimum score required, the dependent milestones will be marked fulfilled for the user. """ course = course_grade.course_data.course if ENTRANCE_EXAMS.is_enabled() and getattr(course, 'entrance_exam_enabled', False): if get_entrance_exam_content(user, course): exam_chapter_key = get_entrance_exam_usage_key(course) exam_score_ratio = get_entrance_exam_score_ratio( course_grade, exam_chapter_key) if exam_score_ratio >= course.entrance_exam_minimum_score_pct: relationship_types = milestones_helpers.get_milestone_relationship_types( ) content_milestones = milestones_helpers.get_course_content_milestones( course.id, exam_chapter_key, relationship=relationship_types['FULFILLS']) # Mark each entrance exam dependent milestone as fulfilled by the user. for milestone in content_milestones: milestones_helpers.add_user_milestone({'id': user.id}, milestone)
def test_import_delete_pre_exiting_entrance_exam(self): """ Check that pre existed entrance exam content should be overwrite with the imported course. """ exam_url = '/course/{}/entrance_exam/'.format(six.text_type(self.course.id)) resp = self.client.post(exam_url, {'entrance_exam_minimum_score_pct': 0.5}, http_accept='application/json') self.assertEqual(resp.status_code, 201) # Reload the test course now that the exam module has been added self.course = modulestore().get_course(self.course.id) metadata = CourseMetadata.fetch_all(self.course) self.assertTrue(metadata['entrance_exam_enabled']) self.assertIsNotNone(metadata['entrance_exam_minimum_score_pct']) self.assertEqual(metadata['entrance_exam_minimum_score_pct']['value'], 0.5) self.assertTrue(len(milestones_helpers.get_course_milestones(six.text_type(self.course.id)))) content_milestones = milestones_helpers.get_course_content_milestones( six.text_type(self.course.id), metadata['entrance_exam_id']['value'], milestones_helpers.get_milestone_relationship_types()['FULFILLS'] ) self.assertTrue(len(content_milestones)) # Now import entrance exam course with open(self.entrance_exam_tar, 'rb') as gtar: # pylint: disable=open-builtin args = {"name": self.entrance_exam_tar, "course-data": [gtar]} resp = self.client.post(self.url, args) self.assertEqual(resp.status_code, 200) course = self.store.get_course(self.course.id) self.assertIsNotNone(course) self.assertEqual(course.entrance_exam_enabled, True) self.assertEqual(course.entrance_exam_minimum_score_pct, 0.7)
def setUp(self): """ Shared scaffolding for individual test runs """ super().setUp() self.course_key = self.course.id self.usage_key = self.course.location self.course_url = '/course/{}'.format(str(self.course.id)) self.exam_url = '/course/{}/entrance_exam/'.format(str(self.course.id)) self.milestone_relationship_types = milestones_helpers.get_milestone_relationship_types()
def setUp(self): """ Shared scaffolding for individual test runs """ super(EntranceExamHandlerTests, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments self.course_key = self.course.id self.usage_key = self.course.location self.course_url = '/course/{}'.format(six.text_type(self.course.id)) self.exam_url = '/course/{}/entrance_exam/'.format(six.text_type(self.course.id)) self.milestone_relationship_types = milestones_helpers.get_milestone_relationship_types()
def test_get_milestone_relationship_types_returns_none_when_app_disabled( self): response = milestones_helpers.get_milestone_relationship_types() assert len(response) == 0