def test_remove_extra_panel_tab(self): """ Tests if a tab can be removed from a course tab list. """ for tab_type in utils.EXTRA_TAB_PANELS.keys(): tab = utils.EXTRA_TAB_PANELS.get(tab_type) # test removing with changed = True tab_test_setup = [ [tab], [tab, self.get_tab_type_dicts("x,y,z")], [self.get_tab_type_dicts("x,y"), tab, self.get_tab_type_dicts("z")], [self.get_tab_type_dicts("x,y,z"), tab], ] for tab_setup in tab_test_setup: course = self.get_course_with_tabs(tab_setup) expected_tabs = [t for t in course.tabs if t != utils.EXTRA_TAB_PANELS.get(tab_type)] changed, actual_tabs = utils.remove_extra_panel_tab(tab_type, course) self.assertTrue(changed) self.assertEqual(actual_tabs, expected_tabs) # test removing with changed = False for tab_setup in ["", "x", "x,y,z"]: course = self.get_course_with_tabs(tab_setup) expected_tabs = copy.copy(course.tabs) changed, actual_tabs = utils.remove_extra_panel_tab(tab_type, course) self.assertFalse(changed) self.assertEqual(actual_tabs, expected_tabs)
def test_remove_extra_panel_tab(self): """ Tests if a tab can be removed from a course tab list. """ for tab_type in utils.EXTRA_TAB_PANELS.keys(): tab = utils.EXTRA_TAB_PANELS.get(tab_type) # test removing with changed = True tab_test_setup = [[tab], [tab, self.get_tab_type_dicts('x,y,z')], [ self.get_tab_type_dicts('x,y'), tab, self.get_tab_type_dicts('z') ], [self.get_tab_type_dicts('x,y,z'), tab]] for tab_setup in tab_test_setup: course = self.get_course_with_tabs(tab_setup) expected_tabs = [ t for t in course.tabs if t != utils.EXTRA_TAB_PANELS.get(tab_type) ] changed, actual_tabs = utils.remove_extra_panel_tab( tab_type, course) self.assertTrue(changed) self.assertEqual(actual_tabs, expected_tabs) # test removing with changed = False for tab_setup in ['', 'x', 'x,y,z']: course = self.get_course_with_tabs(tab_setup) expected_tabs = copy.copy(course.tabs) changed, actual_tabs = utils.remove_extra_panel_tab( tab_type, course) self.assertFalse(changed) self.assertEqual(actual_tabs, expected_tabs)
def _config_course_advanced_components(request, course_module): """ Check to see if the user instantiated any advanced components. This is a hack that does the following : 1) adds/removes the open ended panel tab to a course automatically if the user has indicated that they want to edit the combinedopendended or peergrading module 2) adds/removes the notes panel tab to a course automatically if the user has indicated that they want the notes module enabled in their course """ # TODO refactor the above into distinct advanced policy settings filter_tabs = True # Exceptional conditions will pull this to False if ADVANCED_COMPONENT_POLICY_KEY in request.json: # Maps tab types to components tab_component_map = { 'open_ended': OPEN_ENDED_COMPONENT_TYPES, 'notes': NOTE_COMPONENT_TYPES, } # Check to see if the user instantiated any notes or open ended # components for tab_type in tab_component_map.keys(): component_types = tab_component_map.get(tab_type) found_ac_type = False for ac_type in component_types: if ac_type in request.json[ADVANCED_COMPONENT_POLICY_KEY]: # Add tab to the course if needed changed, new_tabs = add_extra_panel_tab( tab_type, course_module) # If a tab has been added to the course, then send the # metadata along to CourseMetadata.update_from_json if changed: course_module.tabs = new_tabs request.json.update({'tabs': new_tabs}) # Indicate that tabs should not be filtered out of # the metadata filter_tabs = False # Set this flag to avoid the tab removal code below. found_ac_type = True #break # If we did not find a module type in the advanced settings, # we may need to remove the tab from the course. if not found_ac_type: # Remove tab from the course if needed changed, new_tabs = remove_extra_panel_tab( tab_type, course_module) if changed: course_module.tabs = new_tabs request.json.update({'tabs': new_tabs}) # Indicate that tabs should *not* be filtered out of # the metadata filter_tabs = False return filter_tabs
def _config_course_advanced_components(request, course_module): """ Check to see if the user instantiated any advanced components. This is a hack that does the following : 1) adds/removes the open ended panel tab to a course automatically if the user has indicated that they want to edit the combinedopendended or peergrading module 2) adds/removes the notes panel tab to a course automatically if the user has indicated that they want the notes module enabled in their course """ # TODO refactor the above into distinct advanced policy settings filter_tabs = True # Exceptional conditions will pull this to False if ADVANCED_COMPONENT_POLICY_KEY in request.json: # Maps tab types to components tab_component_map = { 'open_ended': OPEN_ENDED_COMPONENT_TYPES, 'notes': NOTE_COMPONENT_TYPES, } # Check to see if the user instantiated any notes or open ended # components for tab_type in tab_component_map.keys(): component_types = tab_component_map.get(tab_type) found_ac_type = False for ac_type in component_types: if ac_type in request.json[ADVANCED_COMPONENT_POLICY_KEY]: # Add tab to the course if needed changed, new_tabs = add_extra_panel_tab(tab_type, course_module) # If a tab has been added to the course, then send the # metadata along to CourseMetadata.update_from_json if changed: course_module.tabs = new_tabs request.json.update({'tabs': new_tabs}) # Indicate that tabs should not be filtered out of # the metadata filter_tabs = False # Set this flag to avoid the tab removal code below. found_ac_type = True #break # If we did not find a module type in the advanced settings, # we may need to remove the tab from the course. if not found_ac_type: # Remove tab from the course if needed changed, new_tabs = remove_extra_panel_tab(tab_type, course_module) if changed: course_module.tabs = new_tabs request.json.update({'tabs':new_tabs}) # Indicate that tabs should *not* be filtered out of # the metadata filter_tabs = False return filter_tabs
def course_advanced_updates(request, org, course, name): """ restful CRUD operations on metadata. The payload is a json rep of the metadata dicts. For delete, otoh, the payload is either a key or a list of keys to delete. org, course: Attributes of the Location for the item to edit """ location = get_location_and_verify_access(request, org, course, name) real_method = get_request_method(request) if real_method == 'GET': return HttpResponse(json.dumps(CourseMetadata.fetch(location)), mimetype="application/json") elif real_method == 'DELETE': return HttpResponse(json.dumps( CourseMetadata.delete_key(location, json.loads(request.body))), mimetype="application/json") elif real_method == 'POST' or real_method == 'PUT': # NOTE: request.POST is messed up because expect_json # cloned_request.POST.copy() is creating a defective entry w/ the whole payload as the key request_body = json.loads(request.body) # Whether or not to filter the tabs key out of the settings metadata filter_tabs = True # Check to see if the user instantiated any advanced components. This is a hack # that does the following : # 1) adds/removes the open ended panel tab to a course automatically if the user # has indicated that they want to edit the combinedopendended or peergrading module # 2) adds/removes the notes panel tab to a course automatically if the user has # indicated that they want the notes module enabled in their course # TODO refactor the above into distinct advanced policy settings if ADVANCED_COMPONENT_POLICY_KEY in request_body: # Get the course so that we can scrape current tabs course_module = modulestore().get_item(location) # Maps tab types to components tab_component_map = { 'open_ended': OPEN_ENDED_COMPONENT_TYPES, 'notes': NOTE_COMPONENT_TYPES, } # Check to see if the user instantiated any notes or open ended components for tab_type in tab_component_map.keys(): component_types = tab_component_map.get(tab_type) found_ac_type = False for ac_type in component_types: if ac_type in request_body[ADVANCED_COMPONENT_POLICY_KEY]: # Add tab to the course if needed changed, new_tabs = add_extra_panel_tab( tab_type, course_module) # If a tab has been added to the course, then send the metadata along to CourseMetadata.update_from_json if changed: course_module.tabs = new_tabs request_body.update({'tabs': new_tabs}) # Indicate that tabs should not be filtered out of the metadata filter_tabs = False # Set this flag to avoid the tab removal code below. found_ac_type = True break # If we did not find a module type in the advanced settings, # we may need to remove the tab from the course. if not found_ac_type: # Remove tab from the course if needed changed, new_tabs = remove_extra_panel_tab( tab_type, course_module) if changed: course_module.tabs = new_tabs request_body.update({'tabs': new_tabs}) # Indicate that tabs should *not* be filtered out of the metadata filter_tabs = False try: response_json = json.dumps( CourseMetadata.update_from_json(location, request_body, filter_tabs=filter_tabs)) except (TypeError, ValueError), e: return HttpResponseBadRequest("Incorrect setting format. " + str(e), content_type="text/plain") return HttpResponse(response_json, mimetype="application/json")
def course_advanced_updates(request, org, course, name): """ restful CRUD operations on metadata. The payload is a json rep of the metadata dicts. For delete, otoh, the payload is either a key or a list of keys to delete. org, course: Attributes of the Location for the item to edit """ location = get_location_and_verify_access(request, org, course, name) real_method = get_request_method(request) if real_method == 'GET': return HttpResponse(json.dumps(CourseMetadata.fetch(location)), mimetype="application/json") elif real_method == 'DELETE': return HttpResponse(json.dumps(CourseMetadata.delete_key(location, json.loads(request.body))), mimetype="application/json") elif real_method == 'POST' or real_method == 'PUT': # NOTE: request.POST is messed up because expect_json # cloned_request.POST.copy() is creating a defective entry w/ the whole payload as the key request_body = json.loads(request.body) # Whether or not to filter the tabs key out of the settings metadata filter_tabs = True # Check to see if the user instantiated any advanced components. This is a hack # that does the following : # 1) adds/removes the open ended panel tab to a course automatically if the user # has indicated that they want to edit the combinedopendended or peergrading module # 2) adds/removes the notes panel tab to a course automatically if the user has # indicated that they want the notes module enabled in their course # TODO refactor the above into distinct advanced policy settings if ADVANCED_COMPONENT_POLICY_KEY in request_body: # Get the course so that we can scrape current tabs course_module = modulestore().get_item(location) # Maps tab types to components tab_component_map = { 'open_ended': OPEN_ENDED_COMPONENT_TYPES, 'notes': NOTE_COMPONENT_TYPES, } # Check to see if the user instantiated any notes or open ended components for tab_type in tab_component_map.keys(): component_types = tab_component_map.get(tab_type) found_ac_type = False for ac_type in component_types: if ac_type in request_body[ADVANCED_COMPONENT_POLICY_KEY]: # Add tab to the course if needed changed, new_tabs = add_extra_panel_tab(tab_type, course_module) # If a tab has been added to the course, then send the metadata along to CourseMetadata.update_from_json if changed: course_module.tabs = new_tabs request_body.update({'tabs': new_tabs}) # Indicate that tabs should not be filtered out of the metadata filter_tabs = False # Set this flag to avoid the tab removal code below. found_ac_type = True break # If we did not find a module type in the advanced settings, # we may need to remove the tab from the course. if not found_ac_type: # Remove tab from the course if needed changed, new_tabs = remove_extra_panel_tab(tab_type, course_module) if changed: course_module.tabs = new_tabs request_body.update({'tabs': new_tabs}) # Indicate that tabs should *not* be filtered out of the metadata filter_tabs = False try: response_json = json.dumps(CourseMetadata.update_from_json(location, request_body, filter_tabs=filter_tabs)) except (TypeError, ValueError), e: return HttpResponseBadRequest("Incorrect setting format. " + str(e), content_type="text/plain") return HttpResponse(response_json, mimetype="application/json")