def exercise_handler(request, exercise, prev=None, next=None, **related_videos): """ Display an exercise """ lang = request.session["django_language"] exercise_root = os.path.join(settings.STATIC_ROOT, "js", "khan-exercises", "exercises") exercise_file = exercise["slug"] + ".html" exercise_template = exercise_file exercise_localized_template = os.path.join(lang, exercise_file) # Get the language codes for exercise teplates that exist exercise_path = partial(lambda lang, slug, eroot: os.path.join(eroot, lang, slug + ".html"), slug=exercise["slug"], eroot=exercise_root) code_filter = partial(lambda lang, eroot, epath: os.path.isdir(os.path.join(eroot, lang)) and os.path.exists(epath(lang)), eroot=exercise_root, epath=exercise_path) available_langs = set(["en"] + [lang_code for lang_code in os.listdir(exercise_root) if code_filter(lang_code)]) # Return the best available exercise template exercise_lang = select_best_available_language(available_langs, target_code=request.language) if exercise_lang == "en": exercise_template = exercise_file else: exercise_template = exercise_path(exercise_lang)[(len(exercise_root) + 1):] context = { "exercise": exercise, "title": exercise["title"], "exercise_template": exercise_template, "exercise_lang": exercise_lang, "related_videos": [v for v in related_videos.values() if v["available"]], "prev": prev, "next": next, } return context
def video_handler(request, video, format="mp4", prev=None, next=None): if not video["available"]: if request.is_admin: # TODO(bcipolli): add a link, with querystring args that auto-checks this video in the topic tree messages.warning(request, _("This video was not found! You can download it by going to the Update page.")) elif request.is_logged_in: messages.warning(request, _("This video was not found! Please contact your teacher or an admin to have it downloaded.")) elif not request.is_logged_in: messages.warning(request, _("This video was not found! You must login as an admin/teacher to download the video.")) # Fallback mechanism available_urls = dict([(lang, avail) for lang, avail in video["availability"].iteritems() if avail["on_disk"]]) if video["available"] and not available_urls: vid_lang = "en" messages.success(request, "Got video content from %s" % video["availability"]["en"]["stream"]) else: vid_lang = select_best_available_language(available_urls.keys(), target_code=request.language) context = { "video": video, "title": video["title"], "selected_language": vid_lang, "video_urls": video["availability"].get(vid_lang), "subtitle_urls": video["availability"].get(vid_lang, {}).get("subtitles"), "prev": prev, "next": next, "backup_vids_available": bool(settings.BACKUP_VIDEO_SOURCE), "use_mplayer": settings.USE_MPLAYER and is_loopback_connection(request), } return context