def move_exercises(lang_code): lang_pack_location = os.path.join(LOCALE_ROOT, lang_code) src_exercise_dir = os.path.join(lang_pack_location, "exercises") dest_exercise_dir = get_localized_exercise_dirpath(lang_code) if not os.path.exists(src_exercise_dir): logging.warn("Could not find downloaded exercises; skipping: %s" % src_exercise_dir) else: # Move over one at a time, to combine with any other resources that were there before. ensure_dir(dest_exercise_dir) all_exercise_files = glob.glob(os.path.join(src_exercise_dir, "*.html")) logging.info("Moving %d downloaded exercises to %s" % (len(all_exercise_files), dest_exercise_dir)) for exercise_file in all_exercise_files: shutil.move( exercise_file, os.path.join(dest_exercise_dir, os.path.basename(exercise_file))) logging.debug("Removing emtpy directory") try: shutil.rmtree(src_exercise_dir) except Exception as e: logging.error("Error removing dubbed video directory (%s): %s" % (src_exercise_dir, e))
def delete_language(lang_code): langpack_resource_paths = [get_localized_exercise_dirpath(lang_code), get_srt_path(lang_code), get_locale_path(lang_code)] for langpack_resource_path in langpack_resource_paths: try: shutil.rmtree(langpack_resource_path) logging.info("Deleted language pack resource path: %s" % langpack_resource_path) except OSError as e: if e.errno != 2: # Only ignore error: No Such File or Directory raise else: logging.debug("Not deleting missing language pack resource path: %s" % langpack_resource_path) invalidate_web_cache()
def move_exercises(lang_code): lang_pack_location = os.path.join(settings.USER_WRITABLE_LOCALE_DIR, lang_code) src_exercise_dir = os.path.join(lang_pack_location, "exercises") dest_exercise_dir = get_localized_exercise_dirpath(lang_code) if not os.path.exists(src_exercise_dir): logging.warn("Could not find downloaded exercises; skipping: %s" % src_exercise_dir) else: # Move over one at a time, to combine with any other resources that were there before. ensure_dir(dest_exercise_dir) all_exercise_files = glob.glob(os.path.join(src_exercise_dir, "*.html")) logging.info("Moving %d downloaded exercises to %s" % (len(all_exercise_files), dest_exercise_dir)) for exercise_file in all_exercise_files: shutil.move(exercise_file, os.path.join(dest_exercise_dir, os.path.basename(exercise_file))) logging.debug("Removing emtpy directory") try: shutil.rmtree(src_exercise_dir) except Exception as e: logging.error("Error removing dubbed video directory (%s): %s" % (src_exercise_dir, e))
def get_exercise_cache(force=False, language=None): if not language: language = django_settings.LANGUAGE_CODE global EXERCISES if EXERCISES is None: EXERCISES = {} if EXERCISES.get(language) is None: if settings.DO_NOT_RELOAD_CONTENT_CACHE_AT_STARTUP and not force: exercises = softload_json( cache_file_path("exercises_{0}.json".format(language)), logger=logging.debug, raises=False ) if exercises: EXERCISES[language] = exercises return EXERCISES[language] EXERCISES[language] = softload_json(settings.EXERCISES_FILEPATH, logger=logging.debug, raises=False) # English-language exercises live in application space, translations in user space if language == "en": exercise_root = os.path.join(settings.KHAN_EXERCISES_DIRPATH, "exercises") else: exercise_root = i18n.get_localized_exercise_dirpath(language) if os.path.exists(exercise_root): try: exercise_templates = os.listdir(exercise_root) except OSError: exercise_templates = [] else: exercise_templates = [] for exercise in EXERCISES[language].values(): exercise_file = exercise["name"] + ".html" exercise_template = exercise_file exercise_lang = "en" # The central server doesn't have an assessment item database if django_settings.CENTRAL_SERVER: available = False elif exercise.get("uses_assessment_items", False): available = False items = [] for item in exercise.get("all_assessment_items", []): item = json.loads(item) if get_assessment_item_data(request=None, assessment_item_id=item.get("id")): items.append(item) available = True exercise["all_assessment_items"] = items else: available = exercise_template in exercise_templates # Get the language codes for exercise templates that exist # Try to minimize the number of os.path.exists calls (since they're a bottleneck) by using the same # precedence rules in i18n.select_best_available_languages available_langs = set(["en"] + [language] * available) # Return the best available exercise template exercise_lang = i18n.select_best_available_language(language, available_codes=available_langs) if exercise_lang == "en": exercise_template = exercise_file else: exercise_template = os.path.join(exercise_lang, exercise_file) with i18n.translate_block(language): exercise["available"] = available exercise["lang"] = exercise_lang exercise["template"] = exercise_template exercise["title"] = _(exercise.get("title", "")) exercise["description"] = _(exercise.get("description", "")) if exercise.get("description") else "" if settings.DO_NOT_RELOAD_CONTENT_CACHE_AT_STARTUP: try: with open(cache_file_path("exercises_{0}.json".format(language)), "w") as f: json.dump(EXERCISES[language], f) except IOError as e: logging.warn("Annotated exercise cache file failed in saving with error {e}".format(e=e)) return EXERCISES[language]