def get_required_content(usage_info, block_structure): """ Get the required content for the course. This takes into account if the user can skip the entrance exam. """ course_key = block_structure.root_block_usage_key.course_key user_can_skip_entrance_exam = False if usage_info.user.is_authenticated: user_can_skip_entrance_exam = EntranceExamConfiguration.user_can_skip_entrance_exam( usage_info.user, course_key) required_content = milestones_helpers.get_required_content( course_key, usage_info.user) if not required_content: return required_content if user_can_skip_entrance_exam: # remove the entrance exam from required content entrance_exam_id = block_structure.get_xblock_field( block_structure.root_block_usage_key, 'entrance_exam_id') required_content = [ content for content in required_content if not content == entrance_exam_id ] return required_content
def get_required_content(course, user): """ Queries milestones subsystem to see if the specified course is gated on one or more milestones, and if those milestones can be fulfilled via completion of a particular course content module """ required_content = [] if settings.FEATURES.get('MILESTONES_APP', False): # Get all of the outstanding milestones for this course, for this user try: milestone_paths = get_course_milestones_fulfillment_paths( unicode(course.id), serialize_user(user) ) except InvalidMilestoneRelationshipTypeException: return required_content # For each outstanding milestone, see if this content is one of its fulfillment paths for path_key in milestone_paths: milestone_path = milestone_paths[path_key] if milestone_path.get('content') and len(milestone_path['content']): for content in milestone_path['content']: required_content.append(content) #local imports to avoid circular reference from student.models import EntranceExamConfiguration can_skip_entrance_exam = EntranceExamConfiguration.user_can_skip_entrance_exam(user, course.id) # check if required_content has any entrance exam and user is allowed to skip it # then remove it from required content if required_content and getattr(course, 'entrance_exam_enabled', False) and can_skip_entrance_exam: descriptors = [modulestore().get_item(UsageKey.from_string(content)) for content in required_content] entrance_exam_contents = [unicode(descriptor.location) for descriptor in descriptors if descriptor.is_entrance_exam] required_content = list(set(required_content) - set(entrance_exam_contents)) return required_content
def load_data(self): """ Get the required content for the course, and whether or not the user can skip the entrance exam. """ self.required_content = milestones_helpers.get_required_content( self.course_key, self.user) if self.user.is_authenticated: self.can_skip_entrance_exam = EntranceExamConfiguration.user_can_skip_entrance_exam( self.user, self.course_key)
def user_can_skip_entrance_exam(user, course): """ Checks all of the various override conditions for a user to skip an entrance exam Begin by short-circuiting if the course does not have an entrance exam """ if not course_has_entrance_exam(course): return True if not user.is_authenticated: return False if has_access(user, 'staff', course): return True if EntranceExamConfiguration.user_can_skip_entrance_exam(user, course.id): return True if not get_entrance_exam_content(user, course): return True return False
def get_course_tab_list(course, user): """ Retrieves the course tab list from xmodule.tabs and manipulates the set as necessary """ user_is_enrolled = user.is_authenticated() and CourseEnrollment.is_enrolled(user, course.id) xmodule_tab_list = CourseTabList.iterate_displayable( course, settings, user.is_authenticated(), has_access(user, 'staff', course, course.id), user_is_enrolled ) # Entrance Exams Feature # If the course has an entrance exam, we'll need to see if the user has not passed it # If so, we'll need to hide away all of the tabs except for Courseware and Instructor entrance_exam_mode = False if settings.FEATURES.get('ENTRANCE_EXAMS', False): if getattr(course, 'entrance_exam_enabled', False): course_milestones_paths = get_course_milestones_fulfillment_paths( unicode(course.id), serialize_user(user) ) for __, value in course_milestones_paths.iteritems(): if len(value.get('content', [])): for content in value['content']: if content == course.entrance_exam_id \ and not EntranceExamConfiguration.user_can_skip_entrance_exam(user, course.id): entrance_exam_mode = True break # Now that we've loaded the tabs for this course, perform the Entrance Exam mode work # Majority case is no entrance exam defined course_tab_list = [] for tab in xmodule_tab_list: if entrance_exam_mode: # Hide all of the tabs except for 'Courseware' and 'Instructor' # Rename 'Courseware' tab to 'Entrance Exam' if tab.type not in ['courseware', 'instructor']: continue if tab.type == 'courseware': tab.name = _("Entrance Exam") course_tab_list.append(tab) return course_tab_list
def get_required_content(course, user): """ Queries milestones subsystem to see if the specified course is gated on one or more milestones, and if those milestones can be fulfilled via completion of a particular course content module """ required_content = [] if settings.FEATURES.get('MILESTONES_APP', False): from milestones import api as milestones_api from milestones.exceptions import InvalidMilestoneRelationshipTypeException # Get all of the outstanding milestones for this course, for this user try: milestone_paths = milestones_api.get_course_milestones_fulfillment_paths( unicode(course.id), serialize_user(user)) except InvalidMilestoneRelationshipTypeException: return required_content # For each outstanding milestone, see if this content is one of its fulfillment paths for path_key in milestone_paths: milestone_path = milestone_paths[path_key] if milestone_path.get('content') and len( milestone_path['content']): for content in milestone_path['content']: required_content.append(content) #local imports to avoid circular reference from student.models import EntranceExamConfiguration can_skip_entrance_exam = EntranceExamConfiguration.user_can_skip_entrance_exam( user, course.id) # check if required_content has any entrance exam and user is allowed to skip it # then remove it from required content if required_content and getattr(course, 'entrance_exam_enabled', False) and can_skip_entrance_exam: descriptors = [ modulestore().get_item(UsageKey.from_string(content)) for content in required_content ] entrance_exam_contents = [ unicode(descriptor.location) for descriptor in descriptors if descriptor.is_entrance_exam ] required_content = list( set(required_content) - set(entrance_exam_contents)) return required_content
def get_required_content(usage_info, block_structure): """ Get the required content for the course. This takes into account if the user can skip the entrance exam. """ course_key = block_structure.root_block_usage_key.course_key user_can_skip_entrance_exam = EntranceExamConfiguration.user_can_skip_entrance_exam(usage_info.user, course_key) required_content = milestones_helpers.get_required_content(course_key, usage_info.user) if not required_content: return required_content if user_can_skip_entrance_exam: # remove the entrance exam from required content entrance_exam_id = block_structure.get_xblock_field(block_structure.root_block_usage_key, 'entrance_exam_id') required_content = [content for content in required_content if not content == entrance_exam_id] return required_content