def exercise(exercise_question, exercise_data, channel): args_data = get_content_node_args(exercise_data) contentnode_kwargs = get_content_node_kwargs(exercise_data) del contentnode_kwargs['extra_fields'] mastery_model_dict = contentnode_kwargs['exercise_data'] exercise = ExerciseNode(*args_data, **contentnode_kwargs) exercise.add_question(exercise_question) channel.add_child(exercise) exercise_data['questions'] = [exercise_question] exercise_data['extra_fields'] = mastery_model_dict del exercise_data['exercise_data'] return exercise
def create_node(node, assessment_dict, subtitle_path, vtt_videos, base_path, lite_version, lang_code): kind = node.get('kind') # Exercise node creation if kind == 'Exercise': child_node = ExerciseNode( source_id=node['id'], title=node['title'], exercise_data={ 'mastery_model': node.get('suggested_completion_criteria') }, description='' if node.get("description") is None else node.get( "description", '')[:400], license=licenses.ALL_RIGHTS_RESERVED, thumbnail=node.get('image_url_256'), ) # build exercise urls for previews full_path = base_path + node.get('path').strip('khan') slug = full_path.split('/')[-2] full_path = full_path.replace(slug, 'e') + slug # attach Perseus questions to Exercises for item in node['all_assessment_items']: # we replace all references to assessment images with the local file path to the image for match in re.finditer(FILE_URL_REGEX, assessment_dict[item['id']]["item_data"]): file_path = str(match.group(0)).replace('\\', '') file_path = file_path.replace(REPLACE_STRING, IMAGE_DL_LOCATION) assessment_dict[item['id']]["item_data"] = re.sub( FILE_URL_REGEX, file_path, assessment_dict[item['id']]["item_data"], 1) question = PerseusQuestion( id=item['id'], raw_data=assessment_dict[item['id']]['item_data'], source_url=full_path if not lite_version else None, ) child_node.add_question(question) # Topic node creation elif kind == 'Topic': child_node = TopicNode( source_id=node["id"], title=node["title"], description='' if node.get("description") is None else node.get( "description", '')[:400]) # Video node creation elif kind == 'Video': # standard download url for KA videos download_url = "https://cdn.kastatic.org/KA-youtube-converted/{0}.mp4/{1}.mp4".format( node['youtube_id'], node['youtube_id']) files = [VideoFile(download_url)] if node['youtube_id'] in vtt_videos: files.append( SubtitleFile(subtitle_path + '/{}.vtt'.format(node['youtube_id']), language=getlang(lang_code))) child_node = VideoNode( source_id=node["id"], title=node["title"], description='' if node.get("description") is None else node.get( "description", '')[:400], files=files, thumbnail=node.get('image_url'), license=licenses.CC_BY_NC_SA) else: # unknown content file format return None return child_node